我很久沒有做過指針算術,所以我想我會試着用C來做一個簡單的二叉搜索樹。然而,我無法得到刪除的結果。東西沿着這些路線的作品,因爲我想到:從指針中取消值
typedef struct Node{
int value;
struct Node *left;
struct Node *right;
}Node;
typedef struct Tree{
struct Node* root;
}Tree;
int main(){
Tree *tree = createTree();
treeInsert(10, tree); // Inserts 10 at root
treeInsert(30, tree); // Inserts 30 to root->right
treeInsert(5, tree); // Inserts 5 to root->left
treeInsert(7, tree); // Inserts 7 to root->left->right
treeInsert(12, tree); // Inserts 12 to root->right->left
// Removes Node "7" from the tree successfully
free(tree->root->left->right); // Free memory for this node in the tree
tree->root->left->right = NULL; // Set the pointer to NULL
return 0;
}
我想寫一個nodeDelete(Node *killNode)
函數來釋放與節點相關聯的內存,然後指向NULL,但我發現它不喜歡我的工作期待它。
int main(){
// ... snip ...
Node *kill = tree->root->left->right // Points kill node to Node "7"
free(kill); // Deallocates memory
kill = NULL; // Points kill to NULL, but keeps
// tree->root->left->right **undefined**
// ... snip ...
}
我想我的問題是,我告訴它kill
現在指向NULL,它從樹的節點斷開,並不會影響原來的節點指針。我怎麼能告訴它我想指向tree->root->left->right
而不是kill
而不是NULL?在這種情況下,我需要一個指針指針嗎?
typedef結構只是不輸入「struct」是一種很糟糕的風格。 – 2012-07-26 13:58:53
@VladLazarenko是嗎?我曾在互聯網上看過它,並認爲這是一種相當普遍的做法。就像我說的,雖然,我是C新手。我在大學裏有一些C++經驗,但我會牢記它。 – KChaloux 2012-07-26 14:02:56
它在Linux編碼風格中有很好的描述(通常不僅適用於C,而且也適用於Linux內核風格)。請參閱第5章 - http://www.kernel.org/doc/Documentation/CodingStyle – 2012-07-26 14:05:42