我正在尝试学习c(它的第一语言),但是我在执行此任务时遇到了一些问题。 (这不是功课!)
任务:
对以下类型的结构数组实施二进制搜索算法(对不起,我的英语水平)。
struct {
unsigned int number;
char* food;
int price;
} pk;
<nr>: <food> <price>\n
<nr> is not in pk \n
并返回-1 我的代码:
#include <stdio.h>
#include <stdlib.h>
struct {
unsigned int number;
char* food;
int price;
} pk;
int binary search(int pk[], int l, int r, unsigned int number){
int center;
int start = l;
int end = r;
if (start == end){
if (pk[start] == number){
printf ("%d is in pk\n", number); // do not know how to use the struct
}else{
printf ("%d is not in pk\n", number);
return -1;
}
}
else {
center = (start + end)/2;
if (number <= pk[center]){
return binary search(pk, start, center, number);
}else{
return binary search(pk, center+1, end, number);
}
}
}
我的问题:
1)该代码可以工作吗?
2)我如何使用该结构来完成任务,我认为应该完成与现在不同的任务。
答案 0 :(得分:0)
启用所有编译器警告!
当if (start == end){ if (pk[start] == number){
为true时,代码不返回 。
在这种情况下,我希望return start;
。
避免start + end
溢出
// center = (start + end)/2;
center = start + (end - start)/2;
稍有不同:
我建议成功时返回指向数组的指针,失败时返回指向NULL
的指针
// int binary search(pk a[], int l, int r, unsigned int number){
pk *binary search(pk a[], int l, int r, unsigned int number){
int start = l;
int end = r;
if (start == end){
if (a[start].number == number){
printf ("%d is in a[] at index\n", number, start);
return &a[start];
}else{
printf ("%d is not in a[]\n", number);
return NULL;
}
}
else {
int center = start + (end - start)/2;
if (number <= a[center].number){
return binary search(a, start, center, number);
}else{
return binary search(a, center+1, end, number);
}
}
}
高级:更好的代码将使用size_t
进行索引,并使用const a[]
pk *binary search(const pk a[], size_t l, size_t r, unsigned int number){