二叉搜索树指针问题

我试图实现一个二元搜索树,以便(重新)学习C.问题是这个current = new; 因为在添加两个节点后tree.root仍然是空指针,所以无法正常工作。 这有什么问题?

 #include  #include  typedef struct BinaryNode { int key; double value; struct BinaryNode *left; struct BinaryNode *right; } BinaryNode; typedef struct BinaryTree { struct BinaryNode *root; } BinaryTree; static void binary_tree_insert_recursive(BinaryNode *current, BinaryNode *new) { if (current == NULL || current->key == new->key) { current = new; } else if (current->key > new->key) { binary_tree_insert_recursive(current->left, new); } else if (current->key key) { binary_tree_insert_recursive(current->right, new); } } void binary_tree_insert(BinaryTree *tree, int key, double value) { BinaryNode *new = (BinaryNode *) malloc(sizeof(BinaryNode)); new->key = key; new->value = value; binary_tree_insert_recursive(tree->root, new); } int main(void) { BinaryTree tree; binary_tree_insert(&tree, 5, 123); binary_tree_insert(&tree, 10, 123); printf("%p\n", tree.root); return 0; } 

谢谢!

我相信current = new;的问题current = new; 是你要更改current的本地副本。 function完成后,此修改不可见。

我怀疑你想要的东西:

 static void binary_tree_insert_recursive(BinaryNode **current, BinaryNode **new) { if (*current == NULL || (*current)->key == (*new)->key) { *current = *new; /* ... */ 

在C FAQ中很好地解释了。

current是指向节点的指针。 当您从binary_tree_insert将其传递给binary_tree_insert_recursive ,将传递指针的 。 因此,尽管在被调用函数内部进行了更改,但更改并未反映在调用函数中。 您需要修改函数以获取要更改的指针的地址

  static void binary_tree_insert_recursive(BinaryNode **current, BinaryNode *new) { if (*current == NULL || (*current)->key == new->key) { *current = new; 

current = new所做的就是让变量current指向new所指向的东西。 不进行复制,该函数对该代码路径没有影响。

new是一个关键字。 选择其他变量名称。