我正在编写一个插入到树中的函数,插入该函数后可以看到(打印)数据,但是当试图在主体中看到它时,什么也没发生。
node *tree = NULL;
insert(tree, 4321);
printf("outer: %d\n", tree->data);
void insert(node* tree, int data) {
if (tree == NULL) {
tree = new_node(data);
printf("inner: %d\n", tree->data);
}
}
这给出了:
inner: 4321
应该是:
inner: 4321
outer: 4321
答案 0 :(得分:8)
问题在于,tree
作为参数传递给函数,并且按状态是C中的传递值。对函数内部tree
本身所做的任何更改都会不会反映给呼叫者。
如果要从调用的函数中修改tree
,则需要传递指向tree
的指针。
类似
void insert(node** tree, int data) {
if (*tree == NULL) {
*tree = new_node(data);
printf("inner: %d\n", (*tree)->data);
}
}
并称呼它
insert(&tree, 4321);
答案 1 :(得分:1)
您将树初始化为指针
node *tree = NULL;
这意味着,变量的内容是存储树的存储位置。
当您将该内存位置传递给函数时,其值将被复制到函数内部的局部变量中。
致电时
tree = new_node(data);
您正在做的就是为函数内tree
指针的局部变量分配一个新的内存位置。函数外部的指针仍然具有相同的值,并且指向没有节点的内存位置。
要在函数内编辑节点,您需要做的是为节点定义某种设置器,或者使用tree->data = xxx
显式设置data属性。这将更改存储器tree
所指向的内容,而不是更改其存储位置。