我正在尝试使用我编写的以下函数将二叉树读入我的程序。
void readTree(struct Dnode *root)
{
struct Dnode *temp;
struct Dnode *input;
char initData;
scanf(" %c",&initData);
input=CreateNode(initData);
if(initData==122){
printf("Leaf\n");
return;
}
else {
root=input;
temp=root;
printf("going to left of %c\n",initData);
readTree(root->lLink);
printf("going to right of %c\n",initData);
readTree(root->rLink);
}
}
一切都工作得很好,除了在树的主要部分不存在的事实。这是我的主要计划:
int main()
{
int n=0;
struct Dnode *root=NULL;
printf("Enter the tree as it asks. Enter z whenever there is no children :\n");
readTree(root);
printf("%c",root->data);
printf("In main");
return;
}
输入树后程序突然崩溃。请帮帮我。
答案 0 :(得分:0)
你必须明白,作为参数传递给函数的值和evoked函数的参数是相同的,但两个局部变量完全不同。
当你的函数readTree()被激发时,会声明一个局部变量root,并且该值会自动启动为与evoked时传递给函数的值相同。 变量,main()中的root和readTree()中的根是不同的两个变量,但具有相同的值。
在函数readTree()中,您将创建一个新节点并将返回值绑定到readTree()中的变量root。正如我所写,这两个根源并不相同。因此,您的更改,绑定不会超出范围 - readTree()和main()中的根保持不变。
要处理此问题,必须将指针传递给指向struct Dnode的指针。
像这样,在main函数中,
struct Dnode *root;
readTree(&root);
和readTree()也必须更改
readTree(struct Dnode **root)
答案 1 :(得分:0)
您的代码存在一些问题。
1)您希望函数更改root但不是
在主root
中是struct Dnode*
,该函数需要struct Dnode*
。由于C使用pass-by-value,这意味着当函数返回时,函数内部所做的任何更改都将丢失。
换句话说 - 当函数返回时,root
中的main
仍然是 NULL
。然后你执行:printf("%c",root->data);
因为你要解除引用NULL
而崩溃。
相反,该函数应采用双指针,即struct Dnode**
。在功能内部,您必须在分配时使用*root = ....
。并且必须像readTree(&root);
2)当它是一个叶子时,你永远不会保存它。
3)永远不会使用变量temp
。
4)名称root
混淆了递归函数
将它们放在一起,你的代码可能是:
void readTree(struct Dnode **current) // Double pointer
{
struct Dnode *input;
char initData;
scanf(" %c",&initData);
input=CreateNode(initData);
*current=input; // Save the created
if(initData==122){
printf("Leaf\n");
return;
}
else {
printf("going to left of %c\n",initData);
readTree(&((*current)->lLink));
printf("going to right of %c\n",initData);
readTree(&((*current)->rLink));
}
}
从主要电话来看:
readTree(&root);
^
notice