2017-07-20 64 views
-1

我被要求用一些特定的條件編寫一個二進制搜索程序。我必須傳遞下限,上限,指向數組的指針和搜索元素。我寫的程序給了我警告。我無法糾正程序中的錯誤。請指出我錯在哪裏。用C中的指針進行二進制搜索

#include <stdio.h> 
int BinarySearch(int , int , int *, int); 

int main() 
{ 
    int n, i, a[20], h, l, x, r=0; 
    int *p; 

    printf("Enter the number of elements:\n"); 
    scanf("%d",&n); 

    printf("Enter the elements:\n"); 
    for(i=0 ; i<n ; i++) 
    { 
     scanf("%d",&a[i]); 
    } 

    p = &a[0]; 
    printf("Enter the element to be searched:\n"); 
    scanf("%d", &x); 

    l = 0; 
    h = n-1; 

    r = BinarySearch(l, h, p, x); 

    if(r == 1) 
    printf("The element %d is found in position %d", x, i); 
    else 
    printf("The element %d is not present in the array", x); 

    return 0; 
} 

int BinarySearch(int l, int h, int *p, int x) 
{ 
    int mid, a[20], f =0; 
    *p = a[0]; 
    mid = (l + h)/2; 

    while(l <= h) 
    { 
     if(a[mid] == x) 
     { 
      f=1; 
      break; 
     } 
     else if(a[mid] > x) 
     { 
      h = mid-1; 
     } 
     else if(a[mid] < x) 
     { 
      l = mid+1; 
     } 
    } 
    if(f == 1) 
    {return 1;} 
    else 
    {return -1;} 
} 

我編譯這個時得到這個警告。

main.c|38|warning: 'a[0]' is used uninitialized in this function [-Wuninitialized]| 

當我刪除行*p = a[0];,然後我得到了以下錯誤消息:

main.c|43|warning: 'a[mid]' may be used uninitialized in this function [-Wmaybe-uninitialized]| 
main.c|48|warning: 'a[mid]' may be used uninitialized in this function [-Wmaybe-uninitialized]| 
main.c|52|warning: 'a[mid]' may be used uninitialized in this function [-Wmaybe-uninitialized]| 

當我運行該程序,該程序在搜索元素的值,並在一段時間後終止。該控件不會傳輸到二分查找功能。

+4

你爲什麼要介紹'a'數組?你應該在'p'中搜索(而不是修改它)。你也應該返回該位置,而不是'1'或'-1'。 – molbdnilo

+2

使用初始化程序列表進行測試。如果每次都手動輸入數據,那麼很容易出錯,輸入未分類的數據,或者每次只輸入不同的數據,從而使調試變得困難。此外,當你花大部分時間進入東西時,它會使調試變得無聊。 –

+2

是不是有一個很好的理由來實現你自己的'BinarySearch()'而不是僅僅使用''中的'bsearch()'? –

回答

2

讓我們考慮如何您int BinarySearch(int l, int h, int *p, int x)應該工作:

  1. l,h是邊界
  2. p是指針的數據(該數據是a[20]主聲明:int n, i, a[20], h, l, x, r=0;
  3. x是檢查值針對

如果p是指針ter在你的數據中,沒有必要(它實際上是錯誤的,因爲它不會搜索你想要的數據)在函數內部聲明一個新的a[20],也不在*p = a[0];中,因爲p已經指向正確的地址... Remove的那些,並且使用的if(p[mid] == x)代替if(a[mid] == x)

2

原始數組內主定義()和一個單獨的陣列在BinarySearch的()定義。指針p被分配爲指向main中定義的數組。

p = &a[0]; 

指針p在BinarySearch的傳遞(),然後分配

*p = a[0] 

是INFACT改變指針內容第一元件新的數組在BinarySearch的()定義的。新陣列未初始化,因此提供了適當的編譯器警告。

0

前兩次的答案似乎有效,但快速的修正問題將修訂:

int mid, a[20], f =0; 
*p = a[0]; 

int mid, f =0; 

然後更新所有引用的函數二分查找到頁。

當您只是從p指向的數組中讀取數據時,不需要分配整個數組a。