[英]Inserting node into binary tree using pointers
我正在嘗試創建一種使用以下結構將節點插入 BST 的方法:
// node structure
struct Node {
int val;
struct Node* left;
struct Node* right;
};
// binary tree structure
struct BinaryTree {
struct Node* root;
};
最初我創建了這個方法來向樹添加節點:
// add value to binary tree
void _AddNode(struct Node* node, int val) {
if (node == NULL)
*(&node) = CreateNode(val);
else if (val <= node->val)
_AddNode(node->left, val);
else
_AddNode(node->right, val);
}
void AddNode(struct BinaryTree* tree, int val) {
_AddNode(tree->root, val);
}
使用此函數構建樹時,當我嘗試遍歷、打印、訪問樹中的數據時,出現Segmentation fault: 11
錯誤。
但是,當我修改函數以傳入雙指針並有效地執行相同的操作時:
// add value to binary tree
void _AddNode(struct Node** node, int val) {
if (*node == NULL)
*node = CreateNode(val);
else if (val <= (*node)->val)
_AddNode(&(*node)->left, val);
else
_AddNode(&(*node)->right, val);
}
void AddNode(struct BinaryTree* tree, int val) {
_AddNode(&tree->root, val);
}
為什么后者有效,而前者無效。
但是,當我修改函數以傳入雙指針並有效地執行相同的操作時
在根本不同的數據上,本質上是相同的。 您最初嘗試中的(&node)
為您提供了一個指向局部變量的指針。 當您取消引用它並分配給結果時,您正在修改局部變量。 這種修改對調用者來說是不可見的。
另一方面,如果你傳遞(比如)一個合適的雙指針到你的函數,比如_AddNode(&(*node)->left, 42)
,那么函數參數的值指向同樣的東西: (*node)->left
呼叫者的(*node)->left
。 如果您取消引用該指針並分配給結果,那么調用者自然可以看到它。
看來原來和修改后的功能都是一樣的
顯然,它們在詞匯上並不相同。 您似乎是說它們在您看來是等價的,但是由於行為上的差異證明了這種等價性,因此這兩個函數的明顯差異實際上會產生不同的語義是合情合理的。 似乎讓您感到困惑的關鍵是,在 C 中,函數參數始終按值傳遞,因此每個函數參數都以調用者傳遞的值開頭,但不是調用者相應參數的別名。 指針類型的參數也不例外。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.