node* Insert(node root, int k)
{
node*s = (node)malloc(sizeof(node));
s->key = k;//把数据传到s中
s->left = NULL;
s->right = NULL;
//为空则作为根节点
if (root == NULL) {
root = s;
}
//大于根节点时
if (k > root->key) {
Insert(root->right,k);
}
//小于根节点时
if (k < root->key) {
Insert(root->left, k);
}
return root;
}
node *createTree()
{
int arr[LEN],i=0;
node*r=NULL;
//用数组存储输入的数字串,-1为结束
for (; i < LEN; i++) {
scanf_s("%d", &arr[i]);
if (arr[i] == -1)
break;
}
//把不等于-1的之前的数据插入tree中
i = 0;
while (arr[i] != -1) {
Insert(r, arr[i]);
i++;
}
return r;
}
问题:为什么插入建立时,每次插入一个key之后,根节点(root)又变为NULL了,调试也看不出什么原因,求大神帮忙解决
如果单纯只讲为什么root始终为空的话,可以看出来问题在Insert函数定义那,因为定义的参数root是Node类型,在你调用的时候这就只是传入了一个行参,在函数体里修改行参对原本的实参没有任何影响,再一个,你传入的root却是Node*类型,这本身传参就有问题。再说说,这个代码逻辑应该是有问题的,为什么这么说,我的看法如下:
1、Insert函数体里面还有一个return root语句,事实上还是那个参数类型不一致的问题,原本传入的root是Node类型,可是函数返回类型确实Node*。
2、既然Insert使用了return返回,但是调用的时候却没有用任何产量接受这个返回值,这样它就没有了意义,既然构建链表的话,肯定是顺着链往后接的,而这里的返回值你却没用上,那你调用的时候永远传入的都是这一个root,对同一个root节点操作,还是对行参操作。