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
相关产品推荐
相关产品推荐

