带指针的binary_search

时间:2011-10-18 12:12:01

标签: c++

我想用指针实现binary_search

#include <cstdlib>
#include <iostream>
using namespace std;

int binary_p(int x[],int size,int target){
    int *p=&x[0];
    int *q=&x[size];

    while(p<q){
               int mid=(p+q)>>2;
               if (target==x[*mid]) return 1;
               else if(target<x[*mid])  q=mid-1;
               else p=mid+1;





               }   
    return -1;


}
int main(int argc, char *argv[])
{
    int x[]={2,4,6,7,9,10,12};
    int size=sizeof(x)/sizeof(int);
    int target=9;
    cout<<binary_p(x,size,target)<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}

但这里是错误列表

  prog.cpp: In function ‘int binary_p(int*, int, int)’:
prog.cpp:10: error: invalid operands of types ‘int*’ and ‘int*’ to binary ‘operator+’
prog.cpp:11: error: invalid type argument of ‘unary *’
prog.cpp:12: error: invalid operands of types ‘int*’ and ‘int’ to binary ‘operator*’
prog.cpp:12: error: invalid conversion from ‘int’ to ‘int*’
prog.cpp:13: error: invalid conversion from ‘int’ to ‘int*’
prog.cpp: In function ‘int main(int, char**)’:
prog.cpp:30: warning: ignoring return value of ‘int system(const char*)’, declared with attribute warn_unused_result

请有人给我建议

5 个答案:

答案 0 :(得分:2)

你不能添加(或移位或除)两个指针,但减去它们 给出一个整数类型(你可以添加和分割),所以你可以写 类似的东西:

int* mid = p + (q - p) / 2;

获取指向中间点的指针。

答案 1 :(得分:2)

你不能这样做:

  int mid=(p+q)>>2

添加指针没有任何意义。您认为int*int,但可能不是这样,C不会自动将它们视为此类。你可以施放,但那时它不会是标准的。

您可以减去同一数组中的指针。返回一个int。此外,您可以向指针添加int。

所以,

  int* mid=p + ((q-p) / 2);

会奏效。 mid应为int *,因此您需要更改其余代码才能使用该代码。你在别处也有类似的错误。例如,下一行

   if (target==x[*mid]) return 1;

没有意义,即使mid是一个int(* int不允许在int上),但是现在mid点在元素上,所以你想要:

   if (target==*mid) return 1;

等等。

答案 2 :(得分:1)

您无法添加指针。如果你真的坚持这样做(而不是使用索引),你应该使用std :: distance和std :: advance函数。

答案 3 :(得分:0)

while(p<=q){
    int *mid=p+(q-p)/2;
    if (target==*mid) return 1;
    else if(target<*mid)  q=mid-1;
    else p=mid+1;
}   
return -1;

答案 4 :(得分:-2)

这是工作代码。

#include <cstdlib>
#include <iostream>

using namespace std;

int binary_p(int x[],int size,int target){
    int *p = &x[0];
    int *q = &x[size - 1 ];

    while( *p < *q ){
        int mid = (*p + *q) >> 2;
        if (target == x[mid]) 
            return 1;
        else if (target < x[mid])  
            *q = mid - 1;
        else 
            *p = mid + 1;
    }   
    return -1;
}
int main(int argc, char *argv[])
{
    int x[] = {2,4,6,7,9,10,12};
    int size = sizeof(x) / sizeof(int);
    int target = 9;
    cout << binary_p(x,size,target) << endl;
    //system("PAUSE");
    return EXIT_SUCCESS;
}