在precreatebtnode这个函数中,btnode被malloc赋值后已经和原来的bt->root不是一个东西了。注意:指针实际上是一个指针类型数值,给其他函数传入指针,实际上传入的是这个指针类型数值,因此在函数中修改指针本身的值,是不会传回调用它的函数中的,只有修改指针指向的地址中的值才能在另一个函数中访问同一个地址获得相同的值。例子如下:
int* creatPoint1(int* p, int val)
{
p = malloc(sizeof(int));
*p = val;
return p;
}
int* creatPoint2(int* p, int val)
{
*p = val;
return p;
}
void main()
{
int *p;
creatPoint1(p, 1);
printf("%d\n", *p); //出错,这个p和 creatPoint1内malloc出的指针并非同一个指针,并不指向同一个地址
p = creatPoint1(p, 1);
printf("%d\n", *p); //正确,经过接收返回值后,此时p和creatPoint1内malloc出的指针已经指向同一个地址
p = malloc(sizeof(int));
creatPoint2(p, 1);
printf("%d\n", *p); //正确,在creatPoint2中改变了p指向的地址中的值,可以在此处调用到
}
你的程序可以这样修改:
node* precreatebtnode() {
char ch;
node* btnode;
ch = getchar();
if (ch == '#') {
return NULL;
}
else {
btnode = (node*)malloc(sizeof(node));
btnode->data = ch;
btnode->lchild = precreatebtnode();
btnode->rchild = precreatebtnode();
}
return btnode;
}
void premaketree(binarytree* bt) {
bt->root = precreatebtnode();
}