作业 - 二进制搜索树C.

时间:2013-04-03 13:36:26

标签: c

我被困在这个简单的二叉搜索树上,因为我的主要问题是函数bst_get()中的(BST * bst)是NULL。

typedef struct {
    char *key;
    void *value;
} KVP;
typedef struct bst {
    struct bst *left;
    struct bst *right;
    KVP kvp;
} BST;

此insert函数从输入文件中获取参数,并相应地进行排序

BST *bst_insert(BST *bst, char*key, void *value){
    if(bst==NULL){
        BST * tempBST = (BST * )malloc(sizeof(BST));
        //strcpy(tempBST->kvp.key , key);
        tempBST->kvp.key = key;
        tempBST->kvp.value = value;
        tempBST->left = NULL;
        tempBST->right = NULL;
        puts(key);
        return tempBST;
    }else
    //if(strcmp(key , bst->kvp.key) > 0){ // i tried to compare strings but it failed
    if(key > bst->kvp.key && bst != NULL){
        bst->right = bst_insert(bst->right , key , value);
        return bst;
    }
    else
    if(key < bst->kvp.key){
        bst->left = bst_insert(bst->left , key, value);
        return bst;
    }    
}

以及何时将此BST与密钥(来自其他文件)进行比较,如下所示

KVP *bst_get(BST *bst , char *key)

    if(bst!=NULL){
        if(key==bst->kvp.key){
            return &bst->kvp;
        }
        else if (key > bst->kvp.key) {
           return bst_get(bst->right , key);
        } else if (key < bst->kvp.key){
           return bst_get(bst->left , key);
        } 
    }else{
        printf("BST IS EMPTY!\n");
    }
}

打印“BST IS EMPTY”句子。 我不知道我的BST发生了什么,因为我提到了其他类似的问题,似乎我在这里错过了一些重要的问题,并希望得到一些帮助。

感谢您的时间

3 个答案:

答案 0 :(得分:4)

我没有查看所有代码,但这部分突出错误:

if(key > bst->kvp.key && bst != NULL)

考虑bst为NULL的情况,进入此语句。

首先,它会将key与使用bst->kvp.key指针的bst进行比较。 由于bst为NULL,因此您刚刚遇到崩溃的错误。 (可能是分段违规)。

您需要反转顺序,以便在尝试使用指针 之前检查bst是否为

if( (bst != NULL) && (key > bst->kvp.key) )

此外,根据您在此声明之前注释掉的代码,我想您想尝试:

if( (bst != NULL) && strcmp(key , bst->kvp.key) > 0) { 

这应该既防止NULL指针,又使用字符串比较而不是指针比较。

答案 1 :(得分:1)

在函数bst_get()中,key==bst->kvp.key比较指针,而不是字符串内容。使用strcmp比较字符串内容。对于比较密钥的所有其他地方也是如此。

答案 2 :(得分:0)

当然,您将bst NULL置于bst_get,因为您继续使用left或{{1}递归调用该函数成员。迟早他们中的一个将成为right,导致你打印字符串。

如果您使用调试器来逐步执行代码和递归调用,那么您会注意到这一点。