【问题标题】:How to use structs in binary search?如何在二进制搜索中使用结构?
【发布时间】:2019-02-12 00:49:46
【问题描述】:

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

【问题讨论】:

  • 您没有将任何结构传递给搜索功能。再看看int pk[]——我不认为你打算在这里传递ints 的数组,是吗?
  • 这是真的,因为我不知道在这种情况下如何使用结构

标签: c struct binary-search


【解决方案1】:

启用所有编译器警告!

if (start == end){ if (pk[start] == number){ 为真时,代码返回nothing

在这种情况下,我希望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){

【讨论】:

  • 非常感谢。 a[start].number 有什么作用?我觉得点“。”是对结构的引用,但是是 [start] "."数字很​​奇怪
  • @Marie.L a[start] 索引数组 a[]a[start].number 引用该数组元素中的成员 .number
  • 但是为什么我们现在需要参考。 a[start].number 是如何工作的。设 a[] = {1,2,3} , start = 2 和 number = 3。然后我们有 a[2] = 3 == 3 = number 但 a[2].number 是什么?抱歉那些可能是微不足道的问题,但我很难理解
  • @Marie.L a 在答案中是pk a[],与pk *a 相同。它是指向pk 的指针,而不是int。 “让a[] = {1,2,3}”不清楚,因为似乎正在初始化int 的数组。 a[start] 不是参考。抱歉没有更多帮助。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多