2013-11-15 90 views
0

我試圖實現二叉搜索樹的代碼。問題是下面的代碼不工作,但它工作,如果我傳遞雙指針插入funcion像插入(結構bst **節點,數據)。我認爲它也應該通過傳遞單個指針。任何人都可以解釋這裏有什麼錯誤嗎?BST插入不工作

void insert(struct bst* node, int data) 
{ 
    if (node == NULL) 
    { 
     printf("here with %d\n",data); 
     node = (struct bst*)malloc(sizeof(struct bst)); 
     node->data = data; 
     node->left = NULL; 
     node->right = NULL; 
    } 
    if(data < node->data) 
    { 
     insert(node->left,data); 
    } 
    else if(data > node->data) 
    { 
     insert(node->right,data); 
    } 
} 

回答

1

如果你想改變傳遞給一個函數的指針的值,你應該將它作爲指針傳遞給一個指針。

void alloc_int(int** p) 
{ 
    *p = malloc(sizeof(int)); 
} 

int main() 
{ 
    int* p = NULL; 
    alloc_int(&p); 
    *p = 10; // here memory for p is allocated so you can use it 
    free(p); 
    return 0; 
} 

在你的例子中同樣的事情。你必須傳遞一個指針地址來改變它的值(指針的值是實際數據的地址)。

1

如果要更改指針的值,應該傳遞指針的地址(如struct node **)。

與您的代碼:

node = (struct bst*)malloc(sizeof(struct bst)); 

insert功能node的值發生變化,但不會改變調用函數的變量。

1

你需要能夠修改將成爲node父母的指針。當您進行遞歸調用insert(node->left,data)時,如果node(新節點的父節點)沒有離開子節點(left==null),則表示您致電insert(null,data)。然後,第一個if語句將創建新節點並分配其數據,但將無法將該節點掛接到樹中。另外,由於insert不會返回新節點,所以節點永遠丟失。

快速黑客解決這個問題將是返回新節點:

struct bst *insert(struct bst* node, int data, struct bst* parent) 
{ /// Note new return value 
    if (node == NULL) 
    { 
     printf("here with %d\n",data); 
     node = (struct bst*)malloc(sizeof(struct bst)); 
     node->data = data; 
     node->left = NULL; 
     node->right = NULL; 
     return node; /// NEW - send it back to the parent 
    } 

    if(data < node->data) 
    { 
     node->left = insert(node->left,data); /// save the new child if there wasn't one 
     return node; /// otherwise, send back the node so the tree doesn't change. 
    } 
    else //if(data > node->data) /// On equal keys, add to the right 
    { 
     node->right = insert(node->right,data); 
     return node; 
    } 
} 

(免責聲明:代碼尚未測試)