这个C程序错在哪里(二叉树)?

来源:百度知道 编辑:UC知道 时间:2024/06/30 21:42:30
输完10个数后,不能遍历输出为什么?

#include "stdio.h"
struct Bnode
{
int data;
struct Bnode *lchild,*rchild;
};
void insertbst(Bnode *t, Bnode *s)
{if (t== NULL) t=s;
else if (s->data< t->data) insertbst(t-> lchild,s);
else insertbst(t-> rchild,s);
}
void inorder(Bnode *t)
{ printf("\n");
if (t!=NULL)
{ inorder(t->lchild);
printf("%d ", t->data);
inorder(t->rchild);
}
}
void main()
{int i,x;
Bnode *t=NULL,*s;
for (i=1;i<=10;i++)
{scanf("%d",&x);
s=new Bnode;
s->data=x;
s-> lchild= NULL;
s-> rchild= NULL;
insertbst(t,s);
}
inorder( t);
}

问题在于 void insertbst(Bnode *t, Bnode *s)里虽然修改了t的值,但并没有影响到main()中的t. main()中的t从头到尾都是保持NULL没变.

修改意见:
把 void insertbst(Bnode *t, Bnode *s)
改为 void insertbst(Bnode *&t, Bnode *s)
也就是把t作为引用来传递,这样在insertbst中t=s的效果就能够传递回主函数。
使用C++只需修改这一行。
另外, 输出中有一行printf("\n"),是没有用的,会输出没有意义的空行.你试一下就知道了.

上次的回答是基于C语言的,我还保留下来,效果和C++以上修改一样,但修改麻烦一些。
以下是使用C的修改方法:

typedef struct Bnode
{
int data;
struct Bnode *lchild;
struct Bnode *rchild;
} Bnode;

void insertbst(Bnode **t, Bnode *s)
{if (*t== NULL) *t=s;
else if (s->data < (*t)->data) insertbst(&(*t)->lchild,s);
else insertbst(&(*t)->rchild,s);
}

与此同时, main()里的调用也要改为:
insertbst(&t,s);

第6行