C 如果二进制搜索数不在索引中,如何返回NULL?

C 如果二进制搜索数不在索引中,如何返回NULL?,c,algorithm,pointers,search,binary,C,Algorithm,Pointers,Search,Binary,我正在写一个代码,基本上是完成了一个主要问题。我编写了一个二进制搜索函数,返回找到的索引。每当我运行代码并搜索2的任何幂时,它都能正常工作。但是,每当我输入任何其他数字,例如50,它都会返回一个错误 在我的代码末尾,我有一个else语句,它说如果其他语句都不返回值,就返回NULL,所以我遇到了一点麻烦。谢谢我在Xcode上运行,也在UNIX服务器上运行,但我注释掉了UNIX服务器上运行的行 #include <stdio.h> #include <stdlib.h>

我正在写一个代码,基本上是完成了一个主要问题。我编写了一个二进制搜索函数,返回找到的索引。每当我运行代码并搜索2的任何幂时,它都能正常工作。但是,每当我输入任何其他数字,例如50,它都会返回一个错误

在我的代码末尾,我有一个else语句,它说如果其他语句都不返回值,就返回NULL,所以我遇到了一点麻烦。谢谢我在Xcode上运行,也在UNIX服务器上运行,但我注释掉了UNIX服务器上运行的行

#include <stdio.h>
#include <stdlib.h>
    int* search(int* begin, int* end, int needle);
    int main(int argc, char **argv) { //int argc = 1, char **argv array of char pointers
        int num = 0;
        int nums[10], i;
        int *found = NULL;
        if(argc != 2) {
            printf("Enter a number to a power of 2 to search for:\n");
            scanf("%d" , &num);
        }
       // num = atoi(argv[1]);
        for(i = 0; i < 10; i++) { // initialzes array by shifting binary code to the left adding powers of 2
            nums[i] = 1 << i; }
        found = search(nums, &nums[9], num);
        if(found) {
            printf("Number %d found in index %ld.\n", num, found - nums);
                 }
        else {
            printf("Number %d was not found.\n", num);
       }
        return 0;
    }
int* search(int* begin, int* end, int needle){
    int *middle = (end-begin)/2 + begin;
    if(*middle == needle){
        return middle;
    }
    else if(needle < *middle){
        end = middle;
        return search(begin, end-1, needle);
    }
    else if(needle > *middle)
    {
        begin = middle;
        return search(begin+1, end, needle);
    }
    else
        return NULL;
}
#包括
#包括
int*搜索(int*开始、int*结束、int指针);
int main(int argc,char**argv){//int argc=1,char**argv字符指针数组
int num=0;
int nums[10],i;
int*found=NULL;
如果(argc!=2){
printf(“输入一个2次方的数字以搜索:\n”);
scanf(“%d”和&num);
}
//num=atoi(argv[1]);
对于(i=0;i<10;i++){//通过将二进制代码向左移位并加上2的幂来初始化数组
nums[i]=1*中间)
{
开始=中间;
返回搜索(开始+1,结束,指针);
}
其他的
返回NULL;
}

每当搜索的值不在索引中时,我希望在main()函数中执行else语句。

您的问题是递归没有基本情况

这样想:如果数字不在数组中,指针将始终大于或小于中间

这意味着它永远不会到达最后一个else,它总是会发生递增或递减的递归,直到它尝试去引用胡言乱语,因此出现分段错误

您需要的是将旧的良好基本情况添加到二进制搜索中,如下所示:

int* search(int* begin, int* end, int needle) {
    int *middle = (end-begin)/2 + begin;

    if(begin == end) {
        //recursion ends when there are no more segments to divide in two
        //so after your final single element segment, a decrement or increment will happen
        //making your end and begin pointers the same 
        return NULL;
    }
    else if(*middle == needle) {
        return middle;
    }
    else if(needle < *middle) {
        end = middle;
        return search(begin, end-1, needle);
    }
    else if(needle > *middle) {
        begin = middle;
        return search(begin+1, end, needle);
    }   
}
int*搜索(int*开始,int*结束,int针){
int*middle=(结束开始)/2+开始;
如果(开始==结束){
//当没有更多的段可以分成两部分时,递归结束
//因此,在最后一个元素段之后,将发生递减或递增
//使您的结束和开始指针相同
返回NULL;
}
否则(*中间==针){
返回中间;
}
否则,如果(针<*中间){
末端=中间;
返回搜索(开始、结束1、针);
}
否则如果(指针>*中间){
开始=中间;
返回搜索(开始+1,结束,指针);
}   
}

此代码实际上不起作用。但是,您让我深入了解了将要执行的代码。如果我使用您的If语句:If(begin==end),我没有检查正确的索引字段。我必须使用此If语句让代码执行:If(begin+1==end-1)返回NULL;也许你可以进一步解释为什么?另外,我的第一个代码是错误的。在第二个else-if中,它应该是begin-1,第二个else-if应该是end+1。谢谢你的输入。代码确实有效。我自己编译并测试了它。不,你不需要添加begin-1和end+1。另外,我也解释了原因