You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言结构体节点表达式树插入时指针操作异常问题求助

问题根因分析

你的代码核心问题出在递归插入节点时的指针传递逻辑上,共有两处直接导致节点无法挂到更深层的左子树:

  • 指针值传递无法修改原父节点的左指针指向:C语言函数参数为值传递,调用addNode(e, tree->leftArgument)时仅复制了左指针存储的地址值到形参,递归函数内给形参tree赋值malloc的新地址,不会修改父节点实际的leftArgument成员值。
  • 递归调用的返回值未接收:你设计的addNode会返回新创建/当前层级的节点地址,但递归调用时没有把返回值赋值给父节点的左指针,导致新生成的节点直接丢失,无法挂载到树结构上。
修复方案

仅需要修改addNode函数中递归调用的那一行,接收递归返回的节点地址赋值给当前节点的左指针即可:

Expression *addNode(Expression *e, Expression *tree) {
    if (tree == NULL) {
        tree = malloc(sizeof(Expression));
        tree->data = e->data;
        tree->leftArgument = NULL;
        tree->rightArgument = NULL;
        printf("added new node\n");
    } else if (tree->data.operation == FIRST || tree->data.operation == REST) {
        printf("%d\n", tree->data.operation);
        // 修复:把递归返回的节点地址赋值给当前节点的leftArgument
        tree->leftArgument = addNode(e, tree->leftArgument);
    } 
    return tree;
}
修复后效果验证

修改后运行代码,会按预期生成左重的链式表达式树:
根节点(e1:FIRST)→ 左孩子(e2:REST)→ 左孩子(e3:FIRST)→ 左孩子(e4:REST),所有节点都挂载到左子树路径上,符合你的需求。

额外优化提示:如果要避免每次都手动接收返回值,也可以把addNode的第二个参数改为Expression** tree二级指针,直接修改原指针的指向,不需要依赖返回值赋值。

内容的提问来源于stack exchange,提问作者jsmith003138

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:15:03