在二叉树中插入节点时程序崩溃
我创建了以下库以在二叉树中插入,删除,搜索和打印节点。在二叉树中插入节点时程序崩溃
#include <stdlib.h>
struct NODE
{
int code;
char subject[20];
struct NODE *left;
struct NODE *right;
};
void InOrder(struct NODE *R)
{
if (R==NULL)
return;
InOrder(R->left);
printf("%d %s\n",R->code,R->subject);
InOrder(R->right);
}
void PreOrder(struct NODE *R)
{
if (R==NULL)
return;
printf("%d %s\n",R->code,R->subject);
InOrder(R->left);
InOrder(R->right);
}
void PostOrder(struct NODE *R)
{
if (R==NULL)
return;
InOrder(R->left);
InOrder(R->right);
printf("%d %s\n",R->code,R->subject);
}
struct NODE *Search(struct NODE *R,int CODE,struct NODE **father)
{
if(R==NULL)
return NULL;
if(R->code==CODE)
{
*father=R;
return R;
}
if (CODE<R->code)
return Search(R->left,CODE,father);
else
return Search(R->right,CODE,father);
}
struct NODE * CreateNode(struct NODE T)
{
struct NODE *tmp;
tmp=(struct NODE *)malloc(sizeof(T));
*tmp=T;
tmp->left=tmp->right=NULL;
return tmp;
}
int Insert(struct NODE **R,struct NODE ND)
{
struct NODE *cur,*fath=NULL;
cur=Search(*R,ND.code,&fath);
if (cur)
return 0;
cur=CreateNode(ND);
if(fath==NULL)
*R=cur;
else
if(fath->code>ND.code)
fath->left=cur;
else
fath->right=cur;
return 1;
}
struct NODE *MinOfMax (struct NODE *ND)
{
struct NODE *tmp;
if (ND==NULL)
return NULL;
if(ND->right==NULL)
return NULL;
tmp=ND->right;
while(tmp->left!=NULL)
tmp=tmp->left;
return tmp;
}
struct NODE* Delete(struct NODE *R, int code)
{
if (R==NULL)
return R;
if (code<R->code)
R->left=Delete(R->left,code);
else if (code>R->code)
R->right=Delete(R->right,code);
else
{
if (R->left==NULL)
{
struct NODE *temp=R->right;
free(R);
return temp;
}
else if (R->right==NULL)
{
struct NODE *temp=R->left;
free(R);
return temp;
}
struct NODE *temp=MinOfMax(R->right);
R->code=temp->code;
R->right=Delete(R->right,temp->code);
}
return R;
}
当我尝试插入在二进制树中的节点,该程序crashes.Here是我的主要:
int main(int argc,char* argv[])
{
typedef struct NODE NODE;
NODE *root=NULL;
NODE tmp;
Insert(&root,tmp);
return 0;
}
我试图分配静态值(例如代码= 100和主题= “物理”),但仍然程序崩溃。我应该malloc的东西,改变任何东西在我的头文件或做一些完全不同的东西?我卡在这里几个小时没有找到任何解决方案。大多数插入功能假设我只有一个整数作为节点中的数据,但我需要传递整个节点。
你的代码基本上什么都不做。看起来你是从某处复制粘贴的。我试图弄清楚这里是一个代码示例。基本上,当你尝试插入它时,你必须在主体中初始化一个新节点。 请注意,这只是一个例子,我没有完整的测试。
int main(int argc,char* argv[])
{
typedef struct NODE NODE;
NODE *root=NULL;
NODE *tmp = malloc(sizeof(struct NODE));
tmp->code = 1; /*Just a number*/
strcpy(tmp->subject,"prova"); /*Put something in it*/
Insert(&root,*tmp); /* Try to insert it*/
PreOrder(root); /*Try to see if it has been inserted*/
return 0;
}
感谢您的回答,这是我的错,我没有初始化根指针为NULL。现在我的程序正常工作。 –
@JohnM。你应该把答案标记为正确的家伙。 – BetaRunner
您的tmp
节点即将用作新插入的节点未初始化的在您的main()
中。如果您使用了-Wall
标志,您的编译器可能会为此警告您。
因此,让我们在你插入功能一看:
int Insert(struct NODE **R, struct NODE ND)
{
struct NODE *cur,*fath=NULL;
cur = Search(*R, ND.code, &fath); // ND.code is junk, since ND is uninitialized
...
return 1;
}
这可能会导致分段错误。
root
也是,你可以将它初始化为NULL
main()
。
不是你的问题的原因,但Do I cast the result of malloc?号
编译器通常不会诊断未初始化值的使用(我总是在Valgrind中找到这些值) –
我明白,但我想我需要在Insert函数之外初始化它,对吧? –
@PaulStelian正确,看我更新的答案!是的,约翰。 – gsamaras
在main'root'中未初始化。 (以及tmp) – wildplasser
请添加程序的输出,人们可以帮助您获得更好的信息:) – captainepoch
@wildplasser我应该如何初始化它?我应该malloc根节点? –