簡體   English   中英

while循環條件檢查

[英]while-loop condition check

我想在C中創建一個二叉搜索樹。

我已經弄明白了大部分內容,但即使我完成任務,有一件事情一直困擾着我。

它是搜索函數,它應該與節點的數據一起返回(在這種情況下, 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;

}

當一個不在二叉樹內的鍵(因此應該返回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;

(請在stackoverflow上正確格式化您的代碼)

到達葉節點時,會將NULL存儲到temp中。

但是,之后立即執行: if(temp->key == key) 如果tempNULL這將崩潰並刻錄。

因此,通過重新排列語句,可以避免在tempNULL時嘗試訪問temp->key情況。

這種檢查和分支的標准方法如下:

    if( temp->key < key )
        temp = temp->right;
    else if( temp->key > key )
        temp = temp->left;
    else //temp->key == key
       return temp->data;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM