二进制搜索树插入错误

时间:2012-12-17 16:20:08

标签: c binary-search-tree

我正在尝试创建一个二叉搜索树,但是当我尝试插入任何值时,或者更确切地说当一个NULL指针传递给该函数时,它只会冻结一段时间然后崩溃。这是代码:

void create(int co, struct node **leaf){
 if(*leaf==0){
   (*leaf)=malloc(sizeof(**leaf));
   (*leaf)->val=co;
   (*leaf)->left=0;
   (*leaf)->right=0;
   }
 else if(co<(*leaf)->val){
   create(co, &(*leaf)->left);
   }
 else if(co>=(*leaf)->val){
   create(co, &(*leaf)->right);
   }
}

我无法弄清楚为什么会那样做。你能解释一下吗?

编辑:该函数的第一次调用如下所示:

struct node *root;
 root=0;
 for(i=0;i<c;i++){
   create(f[i], &root);
   }

其中c是数组中元素的数量。这是结构的定义:

struct node{
        int val;
        struct node *left;
        struct node *right;
        };

所以问题不在我在这里发布的代码中,可以找到整个代码here如果我应该只重写整个问题而只是在这里发布整个代码请saz所以在commnets中,会尝试尽快纠正。

找到了我的答案 在我确实安全地通过create之后,我能够找到最后一个错误,搞砸了我的程序。那是*i++;。显然,++对于指向的值不能很好地工作。在我将其改写为*i=*i+1;后,它最终有效,所以我要感谢所有帮助过我的人并提出最后一个问题:*i++;*i=i+1;之间的区别是什么?< / p>

2 个答案:

答案 0 :(得分:1)

代码没有问题。 Here你可以看到它运行良好并达到了预期的效果。处理gcc 4.3.4 (C90/C99)gcc 4.7.2

答案 1 :(得分:1)

我完全按原样使用了你的结构定义和插入函数,然后把你的其他代码转换成main()函数:

int main()
{
    struct node *root;
    int i, c = 10;
    root=0;
    for(i=0;i<c;i++){
        create(i, &root);
    }
    return 0;
}

似乎它运作得很好。我还尝试了许多不同的有序元素:

int f[] = {6, 1, 9, 2, 0, 18, 2, -8, 10000, 5};

再次,没有崩溃,我得到了正确的订购......

您是否验证了c,您在条件中使用了i<cf[]有多少c个元素?您只需使用sizeof(f)/sizeof(int)即可删除int *pole, i, count=3; pole[0]=25; <----

什么输入使这个功能失败?它失败的确切错误信息是什么?

当你“走”你的树时,你是否在打印值之前检查了NULL?


发布完整个代码后,我可以看到它崩溃了:

pole = malloc(3 * sizeof(int));

你没有给极点任何记忆,所以你要引用一个未初始化的指针。

void getorder(struct node *leaf, int *f, int *i){
    if(leaf->left!=NULL){
        getorder(leaf->left, f, i);
     }
     f[*i]=leaf->val;  <-- this will kill you

解决了这个问题,但还有更多。

接下来你会死在这里:

j

因为你再没有给int *j; ... *j=0; getorder(root, f, j); 任何记忆:

{{1}}