如何在二进制搜索中使用结构?

时间:2019-02-12 00:49:47

标签: c struct binary-search

我正在尝试学习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)我如何使用该结构来完成任务,我认为应该完成与现在不同的任务。

1 个答案:

答案 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){