我被困在这个简单的二叉搜索树上,因为我的主要问题是函数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发生了什么,因为我提到了其他类似的问题,似乎我在这里错过了一些重要的问题,并希望得到一些帮助。
感谢您的时间
答案 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
,导致你打印字符串。
如果您使用调试器来逐步执行代码和递归调用,那么您会注意到这一点。