二叉搜索树C

二叉搜索树C,c,gdb,binary-tree,C,Gdb,Binary Tree,我在C中的二叉搜索树中插入有问题。我对二叉树有以下定义(请忽略行号): 和我的插入函数: int addlistBT(char *term, char *file, WordPtrBT curr) { if (curr == NULL) { WordPtrBT temp = (WordPtrBT)malloc(sizeof(WordPtrBT)); temp->term = term; curr = temp; re

我在C中的二叉搜索树中插入有问题。我对二叉树有以下定义(请忽略行号):

和我的插入函数:

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);
    }
}
我后来在程序中遇到seg故障。当我使用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));

(而且你永远不应该抛出malloc调用的结果)。

你应该做什么: 使用addlistBT(术语、文件和mainListBT)调用; 然后将addlist函数更改为以下内容:

 81 int addlistBT(char *term, char *file, WordPtrBT *curr){
 86         if(!(*curr)){
 87                 WordPtrBT temp =  (WordPtrBT)malloc(sizeof(struct WordBT));
 88                 temp->term = term;
 92                 *curr = temp;
 94                 return 1;
 95         }
 96         int test = //some test;
 97         if(test == 0){  return 0;}
101         if(test > 0){   addlistBT(term, file, &(*curr)->left);}
104         if(test < 0){   addlistBT(term, file, &(*curr)->right);}
107 }
81 int addlistBT(char*term,char*file,WordPtrBT*curr){
86如果(!(*货币)){
87 WordPtrBT temp=(WordPtrBT)malloc(sizeof(struct WordBT));
88温度->术语=术语;
92*电流=温度;
94返回1;
95         }
96 int test=//一些测试;
97如果(test==0){返回0;}
101如果(测试>0){addlistBT(术语、文件和(*curr)->左);}
104如果(测试<0){addlistBT(术语、文件和(*curr)->右);}
107 }

一些神奇的指针…

可耻的是KepaniHalo删除了他/她的答案,因为这是正确的答案。您正在通过值而不是地址将
mainListBT
传递到
addlistBT()
。因此,调用者端指针变量不会发生任何变化,函数会泄漏内存以增加injuryBeside@WhozCraig的注释,
malloc(sizeof(WordPtrBT))
不正确。它应该是
malloc(sizeof(*temp))
wait,但是mainListBT被定义为指向结构的指针,所以我没有传递指针吗?@SaadFarooq C总是按值传递,唯一的问题是它是什么值。函数正在使用值的副本,因此更改它将不会在调用端产生任何结果。若您传递了指针—您可以取消引用它并更改它指向的值(在调用端进行更改,因为它是直接地址),但不能传递指针本身—因为在此上下文中,指针是传递给函数的值。若将指针传递给指针—可以更改原始数据值和指向它的指针,但不能更改指向已传递指针的指针。等等但是,您可以
返回
新值。您的意思是在第一个
malloc()
解决方案中
sizeof(*temp)
?(和+1)好的,我做的更改是:通过&mainListBT并更改签名。我还将malloc行更改为malloc(sizeof(*WordPtrBT)),现在的问题是“错误:请求非结构或联合中的成员术语”。malloc(sizeof(*temp))@SaadFarooq也一样,请查看更新——它回答了您的问题。
WordPtrBT temp =  malloc(sizeof(*temp));
WordPtrBT temp =  malloc(sizeof(struct WordBT));
 81 int addlistBT(char *term, char *file, WordPtrBT *curr){
 86         if(!(*curr)){
 87                 WordPtrBT temp =  (WordPtrBT)malloc(sizeof(struct WordBT));
 88                 temp->term = term;
 92                 *curr = temp;
 94                 return 1;
 95         }
 96         int test = //some test;
 97         if(test == 0){  return 0;}
101         if(test > 0){   addlistBT(term, file, &(*curr)->left);}
104         if(test < 0){   addlistBT(term, file, &(*curr)->right);}
107 }