在C中实现二叉树时的分段错误

时间:2011-07-28 04:00:22

标签: c

当我实现二叉树时,我在代码中遇到了分段错误,无法找出原因。

    #include <stdio.h>
    #include <stdlib.h>
    struct tree{
        int info;
        struct tree *lptr,*rptr;
    };
    typedef struct tree node;

    node *create(int, node *);
    node *insert(node *);
    void preorder(node *);
    void inorder(node *);
    void postorder(node *);

    int main(){
        node *root=NULL;
        int n,choice=0;
        while(choice!=6){
        printf("\n\n\t\tMENU");
        printf("\n\t1:CREATE\n\t2:INSERTION\n\t3:POSTORDER");
        printf("\n\t4:INORDER\n\t5:PREORDER\n\t6:EXIT");
        printf("\n\n\tEnter your choice:\t");
        scanf("%d",&choice);
        switch(choice){
        case 1:
            printf("\n\tHow many elements to enter\t");
            scanf("%d",&n);
            root=NULL;
            root=create(n,root); 
        return 0;
    }

    node *create(int n, node *root){
        int i;
        for(i=0;i<n;i++)
            insert(root);
        return root;
    }           

    node *insert(node *root){
        int val;
        node *temp, *p, *parent;
        p=malloc(sizeof(node));
        printf("\nEnter data for the node: ");
        scanf("%d",&val);
        p->info=val;
        p->lptr=NULL;
        p->rptr=NULL;
        if(root=NULL)
            root=p;
        else{
            temp=root;
            while(temp){
                parent=temp;
                if(val<temp->info)
                    temp=temp->lptr;
                if(val>temp->info)
                    temp=temp->rptr;    
                if(val==temp->info){
                    printf("Duplicate data!\n");
                    free(p);
                    break;
                }
            }
            if(!temp&&p){
                if(val<parent->info)      //SEGMENTATION FAULT HERE!!!
                     parent->lptr=p;
                if(val>parent->info)
                     parent->rptr=p;
            }           
         }
        return root;
    }

    void preorder(node *root){
        if(root==NULL)
            printf("\n\tEMPTY TREE!\n");
        else{
            printf("%5d",root->info);
            if(root->lptr)
                preorder(root->lptr);
            if(root->rptr)
                preorder(root->rptr);
        }
    }

    void inorder(node *root){
        if(root==NULL)
                printf("\n\tEMPTY TREE!\n");
        else{
                if(root->lptr)
                    inorder(root->lptr);
                printf("%5d",root->info);
                if(root->rptr)
                    inorder(root->rptr);
        }
    }

    void postorder(node *root){
        if(root==NULL)
            printf("\n\tEMPTY TREE!\n");
        else{
            if(root->lptr)
                    inorder(root->lptr);
            if(root->rptr)
                    inorder(root->rptr);
            printf("%5d",root->info);
        }
    }

1 个答案:

答案 0 :(得分:3)

你的问题出现在这些行上大约有10行进入你的插入函数:

if(root=NULL)
    root=p;

您将root分配给NULL而不是将其与NULL进行比较。然后,由于NULL的计算结果为false,因此root不会被赋值为p。事实上,这两行保证,root 在执行后为NULL。您只需添加=即可进行比较,如:

if(root == NULL)
    root = p;

这只是一个旁边,但我建议在比较运算符周围放置空格。它会使这个错误更加引人注目,并使val>parent->info这样的行更具可读性,因为该行很容易被误认为是val->parent->info

修改

正如Mark在下面的评论中指出的那样,由于==是可交换的,但=不是可交换的,所以当你有一个值时,你也可以通过切换操作数的顺序来避免这个错误一边。如果您将其放在左侧,如(0 == root)(NULL == root)。如果您离开=,编译器将为您捕获错误,因为(0 = root)在语法上不正确。