c - 二叉搜索树 C

标签 c gdb binary-tree

我在 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/

相关文章:

c - 为结构内的字符串分配内存

c - 在c中读取文件指针,如果EOF则返回null

c - GDB反汇编一个简单的程序

c++ - 使用C++在二叉树中添加非递归函数

binary-tree - 二叉树高度

c++ - 是否可以从应用程序外部监听来自该应用程序的事件

c - OS X Yosemite 上的堆栈崩溃?

c - 如何在不导致减速的情况下忽略并继续通过 GDB 中的 SIGTRAP?

c - gdb 评估进程核心中的函数

c++ - 二叉树 - 复制构造函数