如何解决二进制搜索树指针问题
| 我尝试实现用于(重新)学习C的二进制搜索树。问题在于,此ѭ0不能按预期方式工作,因为tree.root在添加两个节点后仍为空指针。怎么了#include <stdlib.h>
#include <stdio.h>
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 < new->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
的本地副本。功能完成后,此修改不可见。
我怀疑您想要这样的东西:
static void binary_tree_insert_recursive(BinaryNode **current,BinaryNode **new)
{
if (*current == NULL || (*current)->key == (*new)->key) {
*current = *new;
/* ... */
在C常见问题解答中有很好的解释。
, “ 3”是指向节点的指针。当您将其从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
所做的全部工作就是使变量ѭ3variable指向ѭ11the所指的对象。没有复制发生,该函数对该代码路径没有影响。
, new
是关键字。选择一个不同的变量名。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。