如何确定一段代码产生无限循环的原因?

时间:2017-10-09 20:39:37

标签: c binary-search

这是我的二元搜索功能。我似乎无法找到错误,但每次我尝试运行代码时都会给我一个分段错误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);

       }

    }

}

2 个答案:

答案 0 :(得分:1)

这些陈述

int end = end;
int start = start;

没有意义,因为变量在具有不确定的值时会自行初始化。

无需声明局部变量的结束和开始。使用参数。

本声明

    } else if (start == (end - 1)) {

        printf("%s was not found in the list", search);
        exit(0);

   }

也没有意义,因为最初变量startend满足封闭if语句的条件

if(start <= end) {

最后使用标准函数exit而不是return语句是没有意义的。

答案 1 :(得分:0)

首先,正如其他人已经指出的那样,像int end = end这样的任务就是在寻找麻烦。进行简单测试并在函数开头打印startend值,看看程序运行时会发生什么......

接下来,你不需要递归!缩小搜索区域可以通过简单的循环轻松完成:

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类型可表示的最大值的一半。