我想用指针实现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
请有人给我建议
答案 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;
}