簡體   English   中英

如何在字符串數組上使用二進制搜索

[英]How to use Binary Search on array of string

我只需要使用我在課堂上學到的東西來編寫程序,在那兒我從汽車上注冊信息,對其進行排序,然后使用二進制搜索來搜索汽車的車牌。 如果找到車牌,則打印有關該特定汽車的所有信息。如果未打印,則返回-1 在Binary Search之前一切正常,問題是它找不到車牌,它總是返回-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; //     
    }    
}

您有幾個錯誤。

第一個是在您的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("\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; //
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM