插入二叉搜索树时出现分段错误

时间:2013-09-16 05:13:28

标签: c algorithm segmentation-fault binary-search-tree

我写了下面的代码插入到二进制搜索树中,它可以有重复的条目,但是对于大于30的大输入我会得到分段错误.... plz help !!重复条目存储在节点的右分支

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

typedef struct vertex{

    int num;
    struct vertex* r;
    struct vertex* l;

} node;


void insert(node* T,int x)
{

    if(x < T->num)
    {
        if(T->l == NULL)
    {
        T->l = (node*)malloc(sizeof(node));
        T->l->num = x;
        printf("%4d ",x);
        return;
    }
        else
    {
        insert(T->l,x);
    }
    }

    else if(x >= T->num)
    {
        if(x == T -> num)

        if(T->r == NULL)
    {
        T->r = (node*)malloc(sizeof(node));
        T->r->num = x;
        printf("%4d ",x);
        return;
    }
        else
        insert(T->r,x);
    }

}



main()
{
    srand((unsigned int)time(NULL));

    int i,n,m,x;
    node* T;

    printf("n = ");
    scanf("%d",&n);
    printf("\nm = ",&m);
    scanf("%d",&m);

    printf("\n\n\n+++ Inserting %d random integers between 1 and %d\n",n,m);

    x = 1 + rand() % m;
    T = (node*)malloc(sizeof(node));
    T->num = x;
    printf("%4d (1)",x);

    for(i=1;i<n;i++)
    {
        x = 1+rand() % m;
        insert(T,x);
        if(i%8 == 7)
    printf("\n");

    }

    printf("\n\n");
}

2 个答案:

答案 0 :(得分:0)

malloc()未初始化内存,因此在分配后将其他成员设置为NULL或使用calloc()。如果没有这个,当您执行T->lT->r时,您将访问随机内存。

T = malloc(sizeof(node));
T->num = x;
T->l = NULL;
T->r = NULL;

T = calloc(1, sizeof(node));
T->num = x;

在您使用malloc()

的所有地方执行此操作

答案 1 :(得分:0)

malloc(noofbytes) function only allocate noofbytes space only does not initialize with NULL .

这是您的代码的问题。

分配内存时

T->l = (node*)malloc(sizeof(node));
T->l->num = x;

您分配了结构节点大小的内存,但未初始化。手段

T->l->l and T->l->r is not NULL and have some garbage value.

当你遍历它时T-> l == NULL或T-> r == NULL条件不满意,因此它给出了分段错误。