我在 C 中的二叉搜索树中插入时遇到问题。我有以下二叉树定义(请忽略行号):
struct WordBT {
char *term;
struct WordBT *right;
struct WordBT *left;
};
typedef struct WordBT* WordPtrBT;
WordPtrBT mainListBT;
还有我的插入函数:
int addlistBT(char *term, char *file, WordPtrBT curr) {
if (curr == NULL) {
WordPtrBT temp = (WordPtrBT)malloc(sizeof(WordPtrBT));
temp->term = term;
curr = temp;
return 1;
}
int test = //some test;
if (test == 0) {
return 0;
}
if (test > 0) {
addlistBT(term, file, curr->left);
}
if (test < 0) {
addlistBT(term, file, curr->right);
}
}
然后我打电话
addlistBT(term, file, mainListBT);
稍后我在程序中遇到段错误。当我用 gdb 调试时,这是我看到的:
curr = temp;
(gdb) p temp
$7 = (WordPtrBT) 0x60a2a0
(gdb) p curr
$8 = (WordPtrBT) 0x0
(gdb) p mainListBT
$9 = (WordPtrBT) 0x0
(gdb) n
93 addfileBT(file, curr->file);
(gdb) p temp
$10 = (WordPtrBT) 0x60a2a0
(gdb) p curr
$11 = (WordPtrBT) 0x60a2a0
(gdb) p mainListBT
$12 = (WordPtrBT) 0x0
现在我的问题是,既然 mainListBT 被定义为一个指针,那么为什么 mainListBT 没有将指针分配给 temp? 谢谢
最佳答案
您的程序中存在多个错误。
首先,您正在执行与此等效的操作:
void fn(int x) {
x = 1;
}
int main() {
x = 0;
fn(x);
// you expect x == 1 here, but you *should* expect 0.
}
正如您需要将 &x
而不是 x
传递给 foo()
一样,您需要传递 &mainListBT
进入 addlistBT()
(并更改其签名)。
第二个明显的错误是这一行:
WordPtrBT temp = (WordPtrBT)malloc(sizeof(WordPtrBT));
为指针分配空间,当您希望它为结构分配空间时。应该是
WordPtrBT temp = malloc(sizeof(*temp));
或
WordPtrBT temp = malloc(sizeof(struct WordBT));
(并且您应该永远不要转换 malloc
调用的结果)。
关于c - 二叉搜索树 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19394424/