我正在尝试创建一个二叉搜索树,但是当我尝试插入任何值时,或者更确切地说当一个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>
答案 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<c
:f[]
有多少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}}