私は長い間ポインタ演算を行っていなかったので、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;
}
ノードに関連付けられているメモリを解放し、それをNULLにポイントする関数を記述したいのですがnodeDelete(Node *killNode)
、期待どおりに機能しないことがわかりました。
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
代わりにNULLをポイントしたいことをどのように伝えることができますkill
か?この場合、ポインターからポインターが必要ですか?