使用二进制搜索继续获得seg错误(在C中工作)

时间:2014-05-29 22:52:07

标签: c insert segmentation-fault binary-tree

我在使用二叉树工作时遇到了一些麻烦。一个奇怪的事情是当我尝试重复打印节点数据时,我得到一个seg错误。我把这当作一个红旗,表明我做错了什么。这是我用结构定义和插入函数制作的测试程序。有没有人注意到这个问题?

   #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    #include <string.h>
    #include <stdbool.h>


    typedef struct Tnode{

        char *name;
        int value;

        struct Tnode *left;
        struct Tnode *right;

    } Tnode;


    Tnode *insert(Tnode *node, char *name, int value){ 

        if(node==NULL){

            Tnode *temp = malloc(sizeof(struct Tnode));

            temp->name = strdup(name);
            temp->value = value;

            temp->left = NULL;
            temp->right = NULL;

            return temp;

        }

        else if(strcmp(name,node->name)<0)
        {
            node->left = insert(node->left, name, value);   
        }

        else if(strcmp(name,node->name)>0)
        {
            node->right = insert(node->right, name, value);
        }   
        else{
            printf("something went wrong\n");
        }   

    }


    int main(){

        Tnode *root = NULL;

        root = insert(root,"george",11);
        root = insert(root,"dick",12);
        root = insert(root,"walter",13);
        root = insert(root,"harry",13);
        printf("%s\n",root->name);  
        root = insert(root,"zink",40);
        printf("%s\n",root->name);  

    }

1 个答案:

答案 0 :(得分:1)

&#34;插入&#34;除第一个if (node==NULL)情况外,函数不返回任何内容。如果您没有从应该返回值的函数返回某些内容,则行为未定义;所以你可能会遇到一个段错误,或者它似乎在其他人的系统上运行等。

对于除if (node==NULL)案例之外的所有情况,您可能希望return node;。或者,您可能希望abort()exit()或其中某些内容出现问题&#34;案件。你也应该{main} return 0;,但这不会导致你的问题。

如果您在启用警告的情况下进行编译,则会更容易注意到这些问题。对于一些编译器(例如gcc),您可以通过将-Wall标志传递给编译器来打开许多警告。我建议总是至少使用-Wall编译。