搜索 - BST-获取分段错误

时间:2017-07-20 18:07:58

标签: c linked-list binary-search-tree

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

}

在搜索过程中,如果搜索键可用,则显示找到的键,它不会抛出任何错误。

但是如果搜索键不存在则意味着它会抛出错误分段错误(核心转储), 为什么我的代码会出现这种分段错误?

2 个答案:

答案 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 == valif控件中检查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)