2011-06-14 88 views
2

我試圖實現一個二叉搜索樹的目的是(重新)學習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; 
} 

謝謝!

回答

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解釋。

+0

hm,所以我需要一個雙指針。謝謝! – 2011-06-14 19:56:59

+0

@ahojnnes:對於您創建的每個節點,您可能還需要考慮將「左」和「右」指針初始化爲NULL。另外,不要將變量命名爲「新」,這是令人困惑的。 – Andrei 2011-06-14 20:00:38

+0

@Andrei:默認情況下是不是用空指針初始化的? – 2011-06-14 20:04:57

0

new是關鍵字。選擇一個不同的變量名稱。

+2

在C正確的事實並非如此。但是,誰知道OP編譯它是什麼樣的。甚至沒有指定編譯器或錯誤消息。 – 2011-06-14 19:51:24

+0

我認爲這是C++?儘管如此,它並沒有解決問題。 – 2011-06-14 19:52:30

0

current = new所做的就是讓變量current指向new指向的東西。沒有複製發生,並且該函數對該代碼路徑沒有影響。

1

current是指向節點的指針。當您將它傳遞到binary_tree_insert_recursivebinary_tree_insert指針的傳遞。因此,雖然在被調用的函數內部發生了變化,但調用函數並未反映該變化。您需要修改的功能,把你想改變的指針地址

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

也正確答案,謝謝! – 2011-06-14 20:03:57