2012-03-16 70 views
0

用BST做一個項目,我的插入函數中有一個邏輯錯誤,似乎找不到它。二進制搜索樹:在插入函數中丟失指針

插入功能:

int bst_insert (bst_t *tree, bst_key_t key) 
{ 
    bst_node_t *node, *temp_node; 
    if(tree == NULL) { 
    printf("Invalid tree pointer.\n"); 
    return; 
    } 
    if(tree->root == NULL) { 
    node = (bst_node_t *)malloc(sizeof(bst_node_t)); 
    node->left = node->right = NULL; 
    node->key = key; 
    tree->root = node; 
    return 1; 
    } 
    temp_node = tree->root; 
    while(1) { 
    if(temp_node == NULL) { 
     node = (bst_node_t *)malloc(sizeof(bst_node_t)); 
     node->left = node->right = NULL; 
     node->key = key; 
     temp_node = node; 
     return 1; 
    } 
    if(temp_node->key == key) { 
     temp_node->data_ptr = data; 
     return 0; 
    } else if(key < temp_node->key) { 
     temp_node = temp_node->left; 
    } else if(temp_node->key < key) { 
     temp_node = temp_node->right; 
    } 
    } 
} 

在使用這個功能,插入一個節點工作得很好(大概是因爲樹形>根是空的,所以它退出,如果語句中),但是當我嘗試插入第二個並離開此功能,樹中只有第一個節點。

如果我忘記提供任何相關信息,請告訴我。

+0

投票結束:要求陌生人通過檢查發現代碼中的錯誤並不是富有成效的。您應該通過使用調試器或打印語句來識別(或至少隔離)問題,然後返回一個更具體的問題。 – 2012-03-16 22:59:11

+0

我的錯誤,我會看看我是否可以縮小範圍。 – 2012-03-16 23:17:43

回答

1

的問題是在這裏:

temp_node = tree->root; 
... 
temp_node = node; 

你假設,當你進行第二次分配,它實際上會影響temp_node指着節點。但實際上,它只是替換temp_node的內容而不更改其他任何內容(它是一個局部變量)。

一個解決方案是有一個指向「節點指針」的指針。然後,當你改變這個指針指向的值時,你實際上是在「改變世界」而不是改變局部變量。喜歡的東西:

bst_node_t **temp_node; 
... 
temp_node = &tree->root; 

/* To change the value that temp_node is pointing to */ 
*temp_node = node; 

/* To change temp_node itself */ 
... 
} else if(key < temp_node->key) { 
    temp_node = &temp_node->left; 
} else if(temp_node->key < key) { 
    temp_node = &temp_node->right; 
} 

有可能解決這一問題,而無需使用指針到指針,但你必須保持記住一(父)指針,你是否需要更改leftright