#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node
{
int data;
struct node *right, *left;
};
struct node *root = NULL;
int flag = 0;
void insert(int val){
struct node *t, *p;
t = (struct node*)malloc(sizeof(struct node));
t->data = val;
t->left = NULL;
t->right = NULL;
p = root;
if( root == NULL ){
root = t;
return;
}
struct node *curn = root;
while(curn){
p = curn;
if(t->data > curn->data){
curn = curn->right;
}
else{
curn = curn->left;
}
}
if(t->data > p->data){
p->right = t;
}
else{
p->left = t;
}
}
int search(int val){
if(root->data == val){
return 1;
}
struct node *curn;
curn = root;
while(curn){
if(curn->data < val){
curn = curn->right;
if(curn->data == val){
return 1;
}
}
if(curn->data > val){
curn = curn->left;
if( curn->data == val ){
return 1;
}
}
}
return 0;
}
int main(void){
char opt[5] = "yes";
int val, sear;
while(1){
printf("Enter the key number:\n");
scanf("%d",&val);
insert(val);
printf("Do you want to create another junction?\n");
scanf("%s",opt);
if(strcmp(opt,"yes") == 0){
continue;
}
if(strcmp(opt, "no") == 0){
printf("Enter the key to be searched\n");
scanf("%d",&sear);
flag = search(sear);
if(flag == 1){
printf("%d found",sear);
return 0;
}
printf("%d not found",sear);
return 0;
}
}
}
在搜索过程中,如果搜索键可用,则显示找到的键,它不会抛出任何错误。
但是如果搜索键不存在则意味着它会抛出错误分段错误(核心转储), 为什么我的代码会出现这种分段错误?
答案 0 :(得分:1)
您的代码在这里:
if(curn->data < val){
curn = curn->right;
if(curn->data == val){
return 1;
}
}
if(curn->data > val){
curn = curn->left;
if( curn->data == val ){
return 1;
}
}
在此行之后 curn = curn->left;
,curn
可能为NULL,因此curn->data
会引发细分错误。您想在curn->data == val
,if
控件中检查else if
,如下所示:
if(curn->data < val){
curn = curn->right;
}
else if(curn->data > val){
curn = curn->left;
}
else {
return 1;
}
无需检查curn->data == val
,因为如果它不小于或大于,则必须等于。{/ p>
答案 1 :(得分:0)
在while
循环中检查curn
是否NULL
if(!curn && curn->data < val)