2017-10-09 30 views
2

這是我的二進制搜索功能。我似乎無法找到錯誤,但每次我嘗試運行代碼時,它都會給我一個分段錯誤11.我覺得我的錯誤與我的最後一條if語句有關。如何確定一段代碼產生無限循環的原因?

void binary(struct list *A[], char search[15], int start, int 
end) { 

    if(start <= end) { 

     int middle = (start + end)/2; 

     if(strcmp(search, A[middle]->name) == 0){ 

      printf("found"); 
      exit(0); 

     } else if (strcmp(search, A[middle]->name) > 0){ 

      int start = middle + 1; 
      int end = end; 
      binary(A, search, start, end); 

     } else if (strcmp(search, A[middle]->name) < 0){ 

      int start = start; 
      int end = middle - 1; 
      binary(A, search, start, end); 

     } else if (start == (end - 1)) { 

      printf("%s was not found in the list", search); 
      exit(0); 

     } 

    } 

} 
+3

你是如何應對最後一種情況的 - if語句是否只在strcmp返回的數字不是0,小於0或大於0時才被調用? –

+0

列表按照字典順序升序或降序排列?另外,你可能從擺脫int end = end中受益;和int start = start;聲明。最後一個else塊如果不相關,「未找到」消息應該超出你的外部if塊的範圍。 –

+1

開始和結束是指數,所以它不應該不重要? –

回答

1

這些陳述

int end = end; 
int start = start; 

沒有意義,因爲變量本身,而他們有不確定的值進行初始化。

沒有必要聲明局部變量結束和開始。使用參數。

本聲明

} else if (start == (end - 1)) { 

     printf("%s was not found in the list", search); 
     exit(0); 

    } 

也沒有意義,因爲最初的變量startend滿足封閉的if語句的條件

if(start <= end) { 

,最後它沒有意義的使用標準功能exit而不是返回聲明。

+0

好吧,現在它可以工作,但如果我輸入的東西不在列表中,它不會打印出「%s沒有在列表中找到」 –

+0

btw感謝您的幫助 –

+0

@EthanItovitch最後一條if else語句必須置於最初的if語句之外併成爲其他語句。 –

0

首先,如其他已經指出,像int end = end這樣的任務正在尋求麻煩。做一個簡單的測試,並在函數的開始處打印startend值,以查看程序的工作情況。

接下來,您不需要遞歸!縮小搜索範圍可以在一個簡單的循環很容易做到:

void binary(struct list *A[], char search[15], int start, int end) { 
    while(start <= end) { 
     int middle = start + (end - start)/2; 

     int cmpresult = strcmp(search, A[middle]->name); 
     if (cmpresult > 0) { 
      start = middle + 1; 
     } else if (cmpresult < 0) { 
      end = middle - 1; 
     } else {    // cmpresult == 0 
      printf("found at %d", middle); 
      return; 
     } 
    } 

    printf("%s was not found in the list", search); 
} 

最後,請注意middle計算 - 添加(start + end)是一種常見的一步做到這一點,但它可能會導致錯誤,如果數組太長;具體來說,如果數組長度超過int類型可表示的最大值的一半。