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

时间:2018-05-15 14:25:45

标签: c struct binary-search

我必须只使用我在课堂上学到的东西来编写程序,在那里我从汽车注册信息,对其进行排序并使用二进制搜索来搜索汽车'牌照。如果找到了车牌,打印有关该特定车辆的所有信息,如果没有找到"未找到"并且返回-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("\nCarro: %d", (x+1));

        printf("\nPlaca: ");
        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("\n\nSTRUCT ORDENADA: \n");
    for(x=0; x<MAX_CARRO; x++) // MOSTRA NA TELA A STRUCT ORDENADA
    {
        printf("\n\n\nCarro: %d", (x+1));
        printf("\nPlaca: %s", car[x].placa);
        printf("\nMarca: %s", car[x].marca);
        printf("\nModelo: %s", car[x].modelo);
        printf("\nAno: %s", car[x].ano);
        printf("\nValor da diaria: %s", car[x].valordiaria);
    }

    char k[10];

    //           *****BINARY SEARCH******    
    printf("\n\n\n*****BUSCA DE PLACAS*****\n\n\n\n");
    printf("Digite a placa que deseja procurar: \n");
    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("\nPlaca: %s", car[mid].placa);
            printf("\nMarca: %s", car[mid].marca);
            printf("\nModelo: %s", car[mid].modelo);
            printf("\nAno: %s", car[mid].ano);
            printf("\nValor da diaria: %s", car[mid].valordiaria);
        }    

        printf("\n\n****Not found****\n\n\n");
        return -1; //     
    }    
}

1 个答案:

答案 0 :(得分:0)

你的错误很少。

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

return strcmp(carroA, carroB);

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

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

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

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

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

  scanf("%s", &k);

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

  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("\nCarro: %d", (x+1));

        printf("\nPlaca: ");
        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("\n\nSTRUCT ORDENADA: \n");
    for(x=0; x<MAX_CARRO; x++) // MOSTRA NA TELA A STRUCT ORDENADA
    {
        printf("\n\n\nCarro: %d", (x+1));
        printf("\nPlaca: %s", car[x].placa);
        printf("\nMarca: %s", car[x].marca);
        printf("\nModelo: %s", car[x].modelo);
        printf("\nAno: %s", car[x].ano);
        printf("\nValor da diaria: %s", car[x].valordiaria);
    }

    char k[10];

    //           *****BINARY SEARCH******    
    printf("\n\n\n*****BUSCA DE PLACAS*****\n\n\n\n");
    printf("Digite a placa que deseja procurar: \n");
    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("\nPlaca: %s", car[mid].placa);
            printf("\nMarca: %s", car[mid].marca);
            printf("\nModelo: %s", car[mid].modelo);
            printf("\nAno: %s", car[mid].ano);
            printf("\nValor da diaria: %s", car[mid].valordiaria);
        }    


    } 
    if(!found)
        printf("\n\n****Not found****\n\n\n");
 return 0; //
}