二叉搜索树指针问题

时间:2011-06-14 19:48:29

标签: c

我试图实现二进制搜索树以便(重新)学习C.问题是这个current = new;不能正常工作,因为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;
}

谢谢!

4 个答案:

答案 0 :(得分:1)

我认为current = new;的问题在于您要更改current的本地副本。功能完成后,此修改不可见。

我怀疑你想要这样的东西:

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

C FAQ中解释得很清楚。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

new是一个关键字。选择一个不同的变量名称。

答案 3 :(得分:0)

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