DarlingLLO 2016-12-21 13:50 采纳率: 0%
浏览 939

数据结构二叉排序树建立出错

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了,调试也看不出什么原因,求大神帮忙解决

  • 写回答

1条回答 默认 最新

  • NigelWu95 2016-12-21 15:47
    关注

    如果单纯只讲为什么root始终为空的话,可以看出来问题在Insert函数定义那,因为定义的参数root是Node类型,在你调用的时候这就只是传入了一个行参,在函数体里修改行参对原本的实参没有任何影响,再一个,你传入的root却是Node*类型,这本身传参就有问题。再说说,这个代码逻辑应该是有问题的,为什么这么说,我的看法如下:
    1、Insert函数体里面还有一个return root语句,事实上还是那个参数类型不一致的问题,原本传入的root是Node类型,可是函数返回类型确实Node*。
    2、既然Insert使用了return返回,但是调用的时候却没有用任何产量接受这个返回值,这样它就没有了意义,既然构建链表的话,肯定是顺着链往后接的,而这里的返回值你却没用上,那你调用的时候永远传入的都是这一个root,对同一个root节点操作,还是对行参操作。

    评论

报告相同问题?

悬赏问题

  • ¥15 shape_predictor_68_face_landmarks.dat
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制