如何在字符串数组上使用二进制搜索

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在字符串数组上使用二进制搜索相关的知识,希望对你有一定的参考价值。

我必须只使用我在课堂上学到的东西编写程序,在那里我从汽车中注册信息,对其进行排序并使用二进制搜索来搜索汽车的车牌。如果找到牌照,打印有关该特定车辆的所有信息,如果不打开“未找到”并返回-1。一切正常,直到二元搜索,问题是它不会找到车牌,它总是返回-1。

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

#define MAX_CARRO 5  // DEFINE TAMANHO DA STRUCT

typedef struct   // STRUCT
{
    char placa[50];
    char marca[50];
    char modelo[50];
    char ano[50];
    char valordiaria[50];
} carro;
carro car[MAX_CARRO];

int compare (const void * a, const void * b)
{    
    carro *carroA = (carro *)a;
    carro *carroB = (carro *)b;   

    return strcmp(carroA, carroB);
}

int main()
{
    int x=0; //COUNTER

    for(x=0; x<MAX_CARRO; x++) // CAR REGISTER
    {    
        printf("
Carro: %d", (x+1));

        printf("
Placa: ");
        scanf("%s",car[x].placa);    

        printf("Marca: ");
        scanf("%s",car[x].marca);    

        printf("Modelo: ");
        scanf("%s",car[x].modelo);    

        printf("Ano: ");
        scanf("%s",car[x].ano);    

        printf("Valor da diaria: ");
        scanf("%s",car[x].valordiaria);    
    }    

    qsort (car, MAX_CARRO, sizeof(carro), compare);  // USO DO QSORT

    printf("

STRUCT ORDENADA: 
");
    for(x=0; x<MAX_CARRO; x++) // MOSTRA NA TELA A STRUCT ORDENADA
    {
        printf("


Carro: %d", (x+1));
        printf("
Placa: %s", car[x].placa);
        printf("
Marca: %s", car[x].marca);
        printf("
Modelo: %s", car[x].modelo);
        printf("
Ano: %s", car[x].ano);
        printf("
Valor da diaria: %s", car[x].valordiaria);
    }

    char k[10];

    //           *****BINARY SEARCH******    
    printf("


*****BUSCA DE PLACAS*****



");
    printf("Digite a placa que deseja procurar: 
");
    scanf("%s", &k);

//              ***PROBLEM***     

    int low, high, mid;

    low=0;
    high = MAX_CARRO-1;
    while(low<=high)
    {
        mid = (low+high)/2;

        if (strcmp(k, car[mid].placa)<0)
            high=mid-1;    

        else if (strcmp(k, car[mid].placa)>0)
            low=mid+1;    

        else
        {
            printf("
Placa: %s", car[mid].placa);
            printf("
Marca: %s", car[mid].marca);
            printf("
Modelo: %s", car[mid].modelo);
            printf("
Ano: %s", car[mid].ano);
            printf("
Valor da diaria: %s", car[mid].valordiaria);
        }    

        printf("

****Not found****


");
        return -1; //     
    }    
}
答案

你有很多错误。

第一个是在你的compare()函数中。你不能写这一行

return strcmp(carroA, carroB);

因为strcmp只使用char *类型,而carroA和carroB属于carro *类型。你应该放置

 return strcmp(carroA->placo, carroB->placo);

现在,您将按照placo的值对结构进行排序。

现在让我们来看看你的主要功能。

main()中的第一个错误在你的代码行中

  scanf("%s", &k);

你不需要&,你应该这样做

  scanf("%s",k);

第二个错误在最后一行的while()循环中

  return -1;

这是一件很大的事情,因为main()将返回-1。如果你想让main()像发生错误一样退出,你应该写return 1;

也许您应该使用一个变量来确定您是否在二进制搜索中找到了您要查找的内容

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

#define MAX_CARRO 5  // DEFINE TAMANHO DA STRUCT

typedef struct   // STRUCT
{
    char placa[50];
    char marca[50];
    char modelo[50];
    char ano[50];
    char valordiaria[50];
} carro;
carro car[MAX_CARRO];

int compare (const void * a, const void * b)
{    
    carro *carroA = (carro *)a;
    carro *carroB = (carro *)b;   

    return strcmp(carroA->placa, carroB->placa);
}

int main()
{
    int x=0; //COUNTER

    for(x=0; x<MAX_CARRO; x++) // CAR REGISTER
    {    
        printf("
Carro: %d", (x+1));

        printf("
Placa: ");
        scanf("%s",car[x].placa);    

        printf("Marca: ");
        scanf("%s",car[x].marca);    

        printf("Modelo: ");
        scanf("%s",car[x].modelo);    

        printf("Ano: ");
        scanf("%s",car[x].ano);    

        printf("Valor da diaria: ");
        scanf("%s",car[x].valordiaria);    
    }    

    qsort (car, MAX_CARRO, sizeof(carro), compare);  // USO DO QSORT

    printf("

STRUCT ORDENADA: 
");
    for(x=0; x<MAX_CARRO; x++) // MOSTRA NA TELA A STRUCT ORDENADA
    {
        printf("


Carro: %d", (x+1));
        printf("
Placa: %s", car[x].placa);
        printf("
Marca: %s", car[x].marca);
        printf("
Modelo: %s", car[x].modelo);
        printf("
Ano: %s", car[x].ano);
        printf("
Valor da diaria: %s", car[x].valordiaria);
    }

    char k[10];

    //           *****BINARY SEARCH******    
    printf("


*****BUSCA DE PLACAS*****



");
    printf("Digite a placa que deseja procurar: 
");
    scanf("%s", k);

//              ***PROBLEM***     

    int low, high, mid;

    low=0;
    high = MAX_CARRO-1;
    int found=0;
    while(low<=high && !found)
    {
        mid = (low+high)/2;

        if (strcmp(k, car[mid].placa)<0)
            high=mid-1;    

        else if (strcmp(k, car[mid].placa)>0)
            low=mid+1;    

        else
        {
            found = 1;
            printf("
Placa: %s", car[mid].placa);
            printf("
Marca: %s", car[mid].marca);
            printf("
Modelo: %s", car[mid].modelo);
            printf("
Ano: %s", car[mid].ano);
            printf("
Valor da diaria: %s", car[mid].valordiaria);
        }    


    } 
    if(!found)
        printf("

****Not found****


");
 return 0; //
}

以上是关于如何在字符串数组上使用二进制搜索的主要内容,如果未能解决你的问题,请参考以下文章

字符串数组中字符串(多个实例)的递归二进制搜索 - C#

如何在 C 中的日期字符串中对字符串日期进行二进制搜索?

在java上给出错误索引的数组的二进制搜索

如何将别人ppt中的Flash动画导出

如何使用递归创建二进制搜索

如何创建片段以重复变量编号中的代码行