2016-01-19 74 views
4

我有這樣的代碼:C:釋放二叉搜索樹

node* free_tree(node *root){ 

    if(root != NULL){ 

    free_tree(root->left); 
    free_tree(root->right); 

    free(root->name); 
    free(root); 
    } 
    return NULL; 
} 

我知道這是不正確的,正確的版本是:

root -> left = free_tree(root->left); 
root -> right = free_tree(root->right); 

我不明白的是,爲什麼這是否工作?當我使用NULL從free_tree(root->left)返回時,我的函數需要一些接收NULL值的值,這裏不是這種情況,所以我不明白,爲什麼這會起作用?爲什麼這不是編譯錯誤?

+3

爲什麼你會期望被要求分配一個返回值? – ShadowRanger

+1

爲什麼它應該是一個編譯錯誤? –

+1

int funct(),主要我會爲例如int x = funct()。同樣在這裏...我錯了嗎? –

回答

6

有兩件事情:

  1. 沒有理由爲什麼這個函數需要返回任何東西。你顯示的第二個版本使用返回值在釋放它們之前更新左指針和右指針,但是(a)由於無論如何您都釋放了節點,並且(b)值始終爲NULL。由於這是一個常數,所以沒有理由返回它。

  2. 沒有編譯錯誤,因爲沒有類型違規。唯一的問題是您調用的函數返回node *,但沒有使用返回值。然而,這是法律C.

+1

所以基本上,5;空值;聲明是正確的?這回答我的問題,我會接受你的答案。 –

+2

這是正確的。 C語言中的一種語句是「表達式語句」,它只是一個表達式,後跟分號。該表達式可以具有任何數據類型,並且其值被丟棄。 –

2

您刪除整個樹,除了應(甚至是與否,取決於實現)設置爲NULL根指針,節點的成員穿上」 t必須設置爲NULL。

你正確的代碼是相同的:

node* free_tree(node *root){ 

    if(root != NULL){ 

    free_tree(root->left); 
    free_tree(root->right); 

    root->left = NULL; 
    root->right = NULL; 

    free(root->name); 
    free(root); 
    } 
    return NULL; 
} 

正如你可以看到後馬上成員leftrigth被設置爲NULL,整個節點是free d。因此,就程序的正確性而言,它們的價值並不重要。

1

這些功能不需要分配。如果不需要,該值將被丟棄。

int OutputSquareValue(int value) { 
    int result = value * value; 
    printf("%d", result); 
    return result; 
} 

如果您不需要的結果在你的代碼,而只是希望它outputed你去

OutputSquareValue(5); 

而且完全是可以的。如果你需要使用新的價值,你去

printf("Squre of %d = ", x); 
y = OutputSquareValue(x); 
printf("%d^4 =", x); 
OutputSquareValue(y);