在使用结构作为节点的树中遇到 addresses/pointers 问题。我似乎没有正确插入。谢谢! [家庭作业]

Having trouble with addresses/pointers in my tree with structs as nodes. I don't seem to be inserting correctly. Thank you! [homework]

我在插入表达式树时遇到了问题。我的表达式树由表达式节点组成。这些表达式节点包含枚举、操作或字符串。每个表达式节点也有一个 leftArgument/rightArgument 指向表达式的指针(左节点地址和右节点地址)。

当然,我的 addNode 函数显然没有完全实现,但是我希望这段代码插入 (5) 个表达式节点,并且每个都插入到左侧,创建一个非常左重的树。

但是执行的时候好像只是重写了我的树的第二层的Expression节点。我的 main() 或 addNode() 函数中的 pointers/addresses 有问题,几个小时后,我似乎无法弄清楚。

任何提示或意见将不胜感激!非常感谢。

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include "expressions.h"

typedef enum Operation {
    FIRST = 1,
    REST = 2,
    CONS = 3,
} Operation;

union Data {
    Operation operation;
    char *string;
};

struct Expression {
    Data data;
    Expression *leftArgument;
    Expression *rightArgument;
};

char* eval(Expression e) {
    return "0";
}

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);
        addNode(e, tree->leftArgument);
    } 

    return tree;
}

int main() {
    Expression *tree = NULL;

    printf("----------[INSERT]-----------\n");
    Expression e1;
    e1.data.operation = FIRST;
    tree = addNode(&e1, tree);
    printf("-----------------------------\n\n");

    printf("----------[INSERT]-----------\n");
    Expression e2;
    e2.data.operation = REST;
    tree = addNode(&e2, tree);
    printf("-----------------------------\n\n");

    printf("----------[INSERT]-----------\n");
    Expression e3;
    e3.data.operation = FIRST;
    tree = addNode(&e3, tree);
    printf("-----------------------------\n\n");

    printf("----------[INSERT]-----------\n");
    Expression e4;
    e4.data.operation = REST;
    tree = addNode(&e4, tree);
    printf("-----------------------------\n\n");
}

在递归函数调用中

addNode(e, tree->leftArgument);

您正在丢弃包含树的新根的 return 值。

您可能打算写:

tree->leftArgument = addNode(e, tree->leftArgument);