2013-10-16 32 views
3

我有插入二叉搜索樹在C.一個問題,我有一個二叉樹的定義如下(請忽略行號):二叉搜索樹Ç

40 struct WordBT 
41 { 
42   char *term; 
43   struct WordBT *right; 
44   struct WordBT *left; 
46 }; 
47 typedef struct WordBT* WordPtrBT; 
49 WordPtrBT mainListBT; 

而且我插入功能:

81 int addlistBT(char *term, char *file, WordPtrBT curr){ 
86   if(curr == NULL){ 
87     WordPtrBT temp = (WordPtrBT)malloc(sizeof(WordPtrBT)); 
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 } 

然後我打電話

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被定義爲一個指針呢? 謝謝

+1

其混賬恥辱KepaniHalo刪除他/她的答案,因爲它是正確的。你將'mainListBT'按值傳遞給'addlistBT()',而不是'by-address'。因此,調用者端指針變量沒有任何反應,並且你的函數泄漏內存以增加對受傷的傷害 – WhozCraig

+1

除@ WhozCraig的註釋外,'malloc(sizeof(WordPtrBT))'不正確。它應該是'malloc(sizeof(* temp))' – keltar

+0

等待,但mainListBT被定義爲指向結構的指針,所以我沒有傳遞指針? –

回答

1

你應該做什麼: 使用addlistBT調用(term,file,& 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 } 

一些指針魔術......

3

你的程序有多個錯誤。

首先,你正在做的這等價物:正如你需要傳遞&x而不是xfoo()

void fn(int x) { 
    x = 1; 
} 

int main() { 
    x = 0; 
    fn(x); 
    // you expect x == 1 here, but you *should* expect 0. 
} 

,你需要傳遞&mainListBTaddlistBT()(並更改其簽名)。

第二個明顯的錯誤是,這條線:

WordPtrBT temp = (WordPtrBT)malloc(sizeof(WordPtrBT)); 

指針分配空間,當你想要它爲結構分配空間。它應該是

WordPtrBT temp = malloc(sizeof(*temp)); 

WordPtrBT temp = malloc(sizeof(struct WordBT)); 

(你應該從未malloc調用投結果)。

+0

你的意思是在你的第一個'malloc()'解決方案中有'sizeof(* temp)'嗎? (和+1) – WhozCraig

+0

確定我做的更改是:pass&mainListBT並更改簽名。我還將malloc行更改爲malloc(sizeof(* WordPtrBT)),現在的問題是「錯誤:請求成員項的內容不是結構或聯合」。與malloc(sizeof(* temp))一樣 –

+0

@WhozCraig是的,謝謝。答案已更新。 –