我写了下面的代码插入到二进制搜索树中,它可以有重复的条目,但是对于大于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");
}
答案 0 :(得分:0)
malloc()
未初始化内存,因此在分配后将其他成员设置为NULL
或使用calloc()
。如果没有这个,当您执行T->l
或T->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条件不满意,因此它给出了分段错误。