用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-&gt; root为null,所以它在if语句中退出),但是当我尝试插入第二个并保留此函数时,树只有第一个节点。
如果我忘记提供相关信息,请告诉我。
答案 0 :(得分: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;
}
可以在不使用指针指针的情况下修复此问题,但是您必须记住上一个(父)指针,以及是否需要更改left
或right
。