在使用结构作为节点的树中遇到 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);
我在插入表达式树时遇到了问题。我的表达式树由表达式节点组成。这些表达式节点包含枚举、操作或字符串。每个表达式节点也有一个 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);