while循环条件检查
while-loop condition check
我正在尝试用 C 语言创建一个二叉搜索树。
我已经弄明白了大部分,但有件事一直困扰着我,即使我完成了任务。
这是搜索函数,它应该 return 与节点的数据(在本例中为 temp->data
)。
但是,当我写出如下代码时,它一直报错:
char bst_search(int key){
tree_pointer temp = root;
while(temp != NULL){
if(temp->key < key){ // navigate down the tree
temp = temp->right;
} else temp = temp->left;
if(temp->key == key){
return temp->data;
}
}
return NULL;
}
当一个键不在二叉树中(因此应该 return NULL)并不断崩溃时,此函数失败。在尝试了几种可能性之后,我意识到将关键检查移到 while 循环的前面部分解决了这个问题。
char bst_search(int key){
tree_pointer temp = root;
while(temp != NULL){
if(temp->key == key){
return temp->data;
}
if(temp->key < key){ // navigate down the tree
temp = temp->right;
} else temp = temp->left;
}
return NULL;
}
我很好奇当循环条件 (temp) 中的变量在其循环的主体代码中被修改时(因为 temp 已更改为 temp->left 或 temp->right),条件是否得到再次检查?
我觉得我遗漏了一些对你们大多数人来说很明显的东西。感谢您的帮助!
不,while
循环(和一般的 C 语言)不会在你背后做一些事情,比如当条件变量改变时重新评估条件。
声明:
if(temp->key < key)
temp = temp->right;
else
temp = temp->left;
(请在 Whosebug 上 正确格式化代码 )
当你到达叶节点时,会将 NULL
存储到 temp
。
但是,紧接着,您做了:if(temp->key == key)
。如果 temp
是 NULL
.
,这将崩溃并烧毁
因此,通过重新排列语句,您可以避免在 temp
为 NULL
时尝试访问 temp->key
的情况。
这种检查和分支的标准方法如下:
if( temp->key < key )
temp = temp->right;
else if( temp->key > key )
temp = temp->left;
else //temp->key == key
return temp->data;
我正在尝试用 C 语言创建一个二叉搜索树。
我已经弄明白了大部分,但有件事一直困扰着我,即使我完成了任务。
这是搜索函数,它应该 return 与节点的数据(在本例中为 temp->data
)。
但是,当我写出如下代码时,它一直报错:
char bst_search(int key){
tree_pointer temp = root;
while(temp != NULL){
if(temp->key < key){ // navigate down the tree
temp = temp->right;
} else temp = temp->left;
if(temp->key == key){
return temp->data;
}
}
return NULL;
}
当一个键不在二叉树中(因此应该 return NULL)并不断崩溃时,此函数失败。在尝试了几种可能性之后,我意识到将关键检查移到 while 循环的前面部分解决了这个问题。
char bst_search(int key){
tree_pointer temp = root;
while(temp != NULL){
if(temp->key == key){
return temp->data;
}
if(temp->key < key){ // navigate down the tree
temp = temp->right;
} else temp = temp->left;
}
return NULL;
}
我很好奇当循环条件 (temp) 中的变量在其循环的主体代码中被修改时(因为 temp 已更改为 temp->left 或 temp->right),条件是否得到再次检查?
我觉得我遗漏了一些对你们大多数人来说很明显的东西。感谢您的帮助!
不,while
循环(和一般的 C 语言)不会在你背后做一些事情,比如当条件变量改变时重新评估条件。
声明:
if(temp->key < key)
temp = temp->right;
else
temp = temp->left;
(请在 Whosebug 上 正确格式化代码 )
当你到达叶节点时,会将 NULL
存储到 temp
。
但是,紧接着,您做了:if(temp->key == key)
。如果 temp
是 NULL
.
因此,通过重新排列语句,您可以避免在 temp
为 NULL
时尝试访问 temp->key
的情况。
这种检查和分支的标准方法如下:
if( temp->key < key )
temp = temp->right;
else if( temp->key > key )
temp = temp->left;
else //temp->key == key
return temp->data;