2012-12-17 95 views
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; 
     }; 

所以,问题不是出在我这里贴的代码,整个代码可以发现here如果我只是重写整个问题,只是在这里张贴整个代码请在通信中如此安排,尽量纠正。

找到我的答案 当我真的安全地过去了create之后,我找到了最后一个弄错了我的程序的错误。这是*i++;。显然,++不能很好地处理所指向的值。在我将其重写为*i=*i+1;后终于有效,所以我要感谢所有帮助过我的人,并提出了最后一个问题:*i++;*i=i+1;之间有什么区别?

+3

当你说“一个NULL指针被传递给函数”,你的意思是'leaf == NULL'或'* leaf == NULL'? – interjay

+1

你的第一个'if'条件不应该是if(* leaf == NULL)'吗? – noMAD

+1

@netcoder是不是该做什么?你需要与'struct node'关联的空​​间,对吧? – noMAD

回答

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[]元素数量?您只需使用:sizeof(f)/sizeof(int)即可删除c

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

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


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

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

你没有给任何极点的内存,所以你deferencing未初始化的指针。

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); 
+0

是的,我查过了。我已经明白我的问题在别处。感谢您的努力和sizeofs的提示。 sizeof(f)不会返回指针的大小而不是数组,但是? – Tomeamis

+0

@Tomeamis - sizeof(f)'将以字节为单位返回数组的大小。如果它是'char'数组,那么这将是元素的数量(1'char' = 1个字节)。如果你使用'sizeof(f)/ sizeof(int)',你得到的数组大小以字节为单位,除以int的大小(以字节为单位) – Mike

+0

@Tomeamis - 我开始查看你的完整代码,发现两个错误,但可能更多。请参阅上面的修改。这似乎是你有指针问题。如果你使用指针,你必须先分配内存('malloc()'),然后再离开之前,你应该释放分配的内存('free()') – Mike

1

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

+0

好的,我试图通过你链接到的网站运行mz整个程序,并且我得到了段错误,所以问题可能在其他地方。 [这里](http://ideone.com/qcJZyL)是整个代码和结果的链接。 – Tomeamis

+0

@Tomeamis你还没有为你的'pole'数组分配内存,并尝试给它赋值 – SomeWittyUsername

+0

谢谢,现在它在网站上运行,但在我的电脑中,它仍然使用完全相同的输入进行崩溃。它可能是由编译器引起的吗? – Tomeamis