当我实现二叉树时,我在代码中遇到了分段错误,无法找出原因。
#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);
}
}
答案 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)
在语法上不正确。