首页 > 解决方案 > 在结构数组中进行二进制搜索

问题描述

所以我有一个名为 jogo 的结构和一个带有 jogo 类型变量的数组。

结构:

typedef struct
{
    int id;
    char nome[1024];
    char equipas[2][1024];
    int pont[2];
} jogo;

我想要做的是二进制搜索以找到相应的名称并在找到名称时返回其id。

例子:

// Example of elements inside the array
jogo array[3] = {{0,ElClassico1,Barcelona,RealMadrid,2,0},
                 {1,ElClassico2,Barcelona,RealMadrid,1,3},    
                 {2,ElClassico3,Barcelona,RealMadrid,3,4}}

因此,例如,如果我对名称 ElClassico2 进行二进制搜索,我希望二进制搜索返回 1,它是该 jogo 的 id。

如果有人能告诉我如何做到这一点,我将不胜感激,因为我不明白如何做到这一点。

标签: carraysstructurebinary-search

解决方案


如果要使用标准库二进制搜索,可以这样使用:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

typedef struct
{
    int id;
    char nome[1024];
    char equipas[2][1024];
    int pont[2];
} jogo;

int jogo_compare_nome(void const *a, void const *b)
{
    return strcmp(((jogo*)a)->nome, ((jogo*)b)->nome);
}

int main(void)
{
    jogo array[3] = { 
        {0, "ElClassico1", {"Barcelona", "RealMadrid"}, { 2, 0}},
        {1, "ElClassico2", {"Barcelona", "RealMadrid"}, { 1, 3}},
        {2, "ElClassico3", {"Barcelona", "RealMadrid"}, { 3, 4}},
    };
    jogo j1 = { .nome = "ElClassico2" };
    jogo j2 = { .nome = "ElClassico7" };
    jogo* p;

    p = bsearch(&j1, array, 3, sizeof(jogo), jogo_compare_nome);
    if (p) {
        printf("Found id=%i\n", p->id);
    }
    else {
        printf("Not found!\n");
    }

    p = bsearch(&j2, array, 3, sizeof(jogo), jogo_compare_nome);
    if (p) {
        printf("Found id=%i\n", p->id);
    }
    else {
        printf("Not found!\n");
    }

    return EXIT_SUCCESS;
}

无论如何,请记住二进制搜索需要按搜索键排序的序列(好的,按键分区,但这是挑剔的)。您可以qsort()在搜索之前使用。

顺便说一句,那些 1 KB 的数组需要动态内存分配(我的观点)。


推荐阅读