0

我正在尝试创建一个二叉搜索树,但是当我尝试插入任何值时,或者更准确地说,当一个 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;
        };

所以问题不在我在这里发布的代码中,整个代码可以在这里找到如果我应该重写整个问题并在这里发布整个代码,请在 commnets 中说,我会尽快纠正。

找到我的答案 在我真正create安全地通过它之后,我能够找到最后一个搞砸我的程序的错误。它是*i++;。显然 ++ 不适用于指向的值。在我重写它之后它终于起作用了,所以我要感谢所有帮助我的人,并提出最后一个问题:和*i=*i+1;之间有什么区别?*i++;*i=i+1;

4

2 回答 2

1

代码没有问题。在这里,您可以看到它运行良好并达到了预期的效果。继续工作gcc 4.3.4 (C90/C99)gcc 4.7.2

于 2012-12-17T17:13:35.290 回答
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<c具有f[]元素数量?您可以通过使用来删除csizeof(f)/sizeof(int)

什么输入使此功能失败?它失败的确切错误消息是什么?

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


发布整个代码后,我可以看到它在这里崩溃:

int *pole, i, count=3;
pole[0]=25;   <----

你没有给pole 任何内存,所以你在推迟一个未初始化的指针。

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);
于 2012-12-17T17:38:14.447 回答