gpt4 book ai didi

c - 用 C 实现二叉树时出现段错误

转载 作者:行者123 更新时间:2023-11-30 18:43:33 25 4
gpt4 key购买 nike

当我实现二叉树时,我在代码中遇到了段错误,但无法找出原因。

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

最佳答案

您的问题出在插入函数中大约 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) 在语法上不正确。

关于c - 用 C 实现二叉树时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6853951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com