这是我的二元搜索功能。我似乎无法找到错误,但每次我尝试运行代码时都会给我一个分段错误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);
}
}
}
答案 0 :(得分:1)
这些陈述
int end = end;
int start = start;
没有意义,因为变量在具有不确定的值时会自行初始化。
无需声明局部变量的结束和开始。使用参数。
本声明
} else if (start == (end - 1)) {
printf("%s was not found in the list", search);
exit(0);
}
也没有意义,因为最初变量start
和end
满足封闭if语句的条件
if(start <= end) {
最后使用标准函数exit
而不是return语句是没有意义的。
答案 1 :(得分:0)
首先,正如其他人已经指出的那样,像int end = end
这样的任务就是在寻找麻烦。进行简单测试并在函数开头打印start
和end
值,看看程序运行时会发生什么......
接下来,你不需要递归!缩小搜索区域可以通过简单的循环轻松完成:
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
类型可表示的最大值的一半。