2012-03-16 19 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; 
    } 
    } 
} 

(TREE->ルートがnullであるので、文の場合、それはその内側に出てからでしょう)、一つのノードを挿入するだけで正常に動作しますが、私は試してみて、秒を挿入してこの関数を残すと、ツリーには最初のノードしかありません。

私は関連情報を提供することを忘れた場合にお知らせください。

+0

投票に参加してください:検査であなたのコードのエラーを見つけ出すことは、生産的ではありません。デバッガやprintステートメントを使用して問題を特定(または少なくとも分離)してから、さらに具体的な質問に戻ってください。 –

+0

私の間違いは、私がそれをもっと絞り込むことができるかどうかを見るでしょう。 –

答えて

1

問題はここにある:あなたが第二の割り当てを実行すると、それは実際にtemp_nodeがポイントされたノードに影響を与えることを想定している

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

。しかし実際には、他のものを変更することなくtemp_nodeの内容を置き換えるだけです(ローカル変数です)。

解決策の1つは、「ノードポインタ」へのポインタを持つことです。次に、このポインタが指している値を変更すると、ローカル変数を変更するのではなく、実際には「世界を変更しています。ような何か:

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を変更する必要があるかどうか。

関連する問題