2012-12-17 94 views
0

我試圖做一個二叉搜索樹,但是當我嘗試插入任何值,或者更確切地說,當一個NULL指針傳遞給該函數時,它只是凍結了一會兒,然後它崩潰。這裏的代碼:二叉搜索樹插入錯誤

void create(int co, struct node **leaf){ 
if(*leaf==0){ 
    (*leaf)=malloc(sizeof(**leaf)); 
    (*leaf)->val=co; 
    (*leaf)->left=0; 
    (*leaf)->right=0; 
    } 
else if(co<(*leaf)->val){ 
    create(co, &(*leaf)->left); 
    } 
else if(co>=(*leaf)->val){ 
    create(co, &(*leaf)->right); 
    } 
} 

我不明白爲什麼它這樣做。你可以解釋嗎?

編輯:該函數的第一呼叫看起來像這樣:

struct node *root; 
root=0; 
for(i=0;i<c;i++){ 
    create(f[i], &root); 
    } 

其中c是數組中元素的數目。這是結構的定義:

struct node{ 
     int val; 
     struct node *left; 
     struct node *right; 
     }; 

所以,問題不是出在我這裏貼的代碼,整個代碼可以發現here如果我只是重寫整個問題,只是在這裏張貼整個代碼請在通信中如此安排,儘量糾正。

找到我的答案 當我真的安全地過去了create之後,我找到了最後一個弄錯了我的程序的錯誤。這是*i++;。顯然,++不能很好地處理所指向的值。在我將其重寫爲*i=*i+1;後終於有效,所以我要感謝所有幫助過我的人,並提出了最後一個問題:*i++;*i=i+1;之間有什麼區別?

+3

當你說「一個NULL指針被傳遞給函數」,你的意思是'leaf == NULL'或'* leaf == NULL'? – interjay

+1

你的第一個'if'條件不應該是if(* leaf == NULL)'嗎? – noMAD

+1

@netcoder是不是該做什麼?你需要與'struct node'關聯的空​​間,對吧? – noMAD

回答

1

我把你的結構定義和插入功能完全一樣,他們佔有了你的其他代碼,並倒入一個main()功能,例如:

int main() 
{ 
    struct node *root; 
    int i, c = 10; 
    root=0; 
    for(i=0;i<c;i++){ 
     create(i, &root); 
    } 
    return 0; 
} 

似乎只是正常工作。我也嘗試了一些不同的排序元素:

int f[] = {6, 1, 9, 2, 0, 18, 2, -8, 10000, 5}; 

再次,沒有崩潰,我得到正確的順序...

你驗證c,你在條件中使用:i<cf[]元素數量?您只需使用:sizeof(f)/sizeof(int)即可刪除c

什麼輸入使該功能失敗?什麼是它失敗的確切錯誤信息?

當你「走」你的樹,你打印值之前檢查NULL?


後您發佈的整個代碼,我可以看到它崩潰了這裏:

int *pole, i, count=3; 
pole[0]=25; <---- 

你沒有給任何極點的內存,所以你deferencing未初始化的指針。

pole = malloc(3 * sizeof(int)); 

修復了這個問題,但還有更多。

接下來你會死在這裏:

void getorder(struct node *leaf, int *f, int *i){ 
    if(leaf->left!=NULL){ 
     getorder(leaf->left, f, i); 
    } 
    f[*i]=leaf->val; <-- this will kill you 

因爲再次,你不給任何j內存:

int *j; 
... 
*j=0; 
getorder(root, f, j); 
+0

是的,我查過了。我已經明白我的問題在別處。感謝您的努力和sizeofs的提示。 sizeof(f)不會返回指針的大小而不是數組,但是? – Tomeamis

+0

@Tomeamis - sizeof(f)'將以字節爲單位返回數組的大小。如果它是'char'數組,那麼這將是元素的數量(1'char' = 1個字節)。如果你使用'sizeof(f)/ sizeof(int)',你得到的數組大小以字節爲單位,除以int的大小(以字節爲單位) – Mike

+0

@Tomeamis - 我開始查看你的完整代碼,發現兩個錯誤,但可能更多。請參閱上面的修改。這似乎是你有指針問題。如果你使用指針,你必須先分配內存('malloc()'),然後再離開之前,你應該釋放分配的內存('free()') – Mike

1

代碼沒有問題。 Here你可以看到它運行良好,並達到預期的效果。在gcc 4.3.4 (C90/C99)gcc 4.7.2上工作。

+0

好的,我試圖通過你鏈接到的網站運行mz整個程序,並且我得到了段錯誤,所以問題可能在其他地方。 [這裏](http://ideone.com/qcJZyL)是整個代碼和結果的鏈接。 – Tomeamis

+0

@Tomeamis你還沒有爲你的'pole'數組分配內存,並嘗試給它賦值 – SomeWittyUsername

+0

謝謝,現在它在網站上運行,但在我的電腦中,它仍然使用完全相同的輸入進行崩潰。它可能是由編譯器引起的嗎? – Tomeamis