0

我编写了以下代码以插入可能有重复条目的二叉搜索树,但是对于大于 30 的较大输入,我会遇到分段错误 ....plz 帮助!重复的条目存储在节点的右分支中

#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");
}
4

2 回答 2

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 条件未得到满足,因此它给出了分段错误。

于 2013-09-16T08:40:04.367 回答
0

malloc()不初始化内存,所以将其他成员设置为NULLafter allocation 或 use 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()

于 2013-09-16T05:27:06.163 回答