Busca em Vetor de Ponteiros em C

Considere um tipo que representa um funcionario de uma empresa, definido pela estrutura a seguir:

typedef struct funcionario Funcionario;
struct funcionario {
char nome[81]; // nome do funcionario
float valor_hora; // valor da hora de trabalho em Reais
int horas_mes; // horas trabalhadas em um mês
};

Escreva uma função que faça uma busca binária em um vetor de ponteiros para o tipo Funcionario, cujos elementos estão em ordem alfabética dos nomes dos funcionários. Esta função deve receber como parâmetros o número de funcionários, o vetor e o nome do funcionário que se deseja buscar, e deve ter como valor de retorno um ponteiro para o registro do funcionário procurado. Se não houver um funcionário com o nome procurado, a função deve retornar NULL. A função deve obedecer ao seguiinte protótipo:

Funcionario* busca (int n, Funcionario** v, char* nome);

Segue meu código, não encontro o erro
typedef struct funcionario Funcionario;

struct funcionario{
char nome[81];
float valor_hora;
int horas_mes;
};

static int comp(char a, Funcionario b){
return strcmp(a,b->nome);
}

Funcionario* busca(int n, Funcionario** v, char* nome){
int i, ini, fim, meio, cmp;
ini = 0;
fim = n - 1;
while(ini <= fim){
meio = (ini + fim) / 2;
cmp = comp(nome,v[meio]);
if(cmp < 0)
fim = meio - 1;
else if(cmp > 0)
ini = meio + 1;
else
return v[meio];

}
return NULL;

}

int main(){
int i, n;
char name[85];
scanf("%d", &n);
Funcionario *a[n];
for(i = 0; i < n; i++){
Funcionario vet = malloc(sizeof(Funcionario));
a[i] = vet;
scanf("%s", vet->nome);
scanf("%d", &vet->horas_mes);
scanf("%f", &vet->valor_hora);
}
scanf("%s", name);
Funcionario
resp = busca(n,a,name);
printf("%s\n", resp->nome);
printf("%d %.1f\n", resp->horas_mes, resp->valor_hora);
}

Observação: a busca binária só funciona em vetor ordenado.

1 - Programação Descomplicada - Busca em Vetor de Struct
2 - IME/USP - Busca Binária

to ligado, os casos de testes já tão em ordem.

Bom, já que não teve uma solução, lá vai…

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

typedef struct funcionario Funcionario;
struct funcionario{
    char nome[81];
    float valor_hora;
    int horas_mes;
};

int comparador(char* nome, Funcionario* f){
    return strcmp(nome, f->nome);
}

Funcionario* busca(int n, Funcionario** v, char* nome){
    int comparacao;
    int inicio = 0;
    int fim = n - 1;
    int meio = (inicio + fim + 1) / 2;

    while(inicio <= fim){
        comparacao = comparador(nome, v[meio]);
        
        if(comparacao == 0)
            return v[meio];

        else if(comparacao < 0)
            fim = meio - 1;
        else
            inicio = meio + 1;

        meio = (inicio + fim + 1) / 2;
    }
    return NULL;
}

void limpar(int n, Funcionario** a){
    int i;
    for(i = 0; i < n; i++)
        free(*a);

    free(a);
}

int main(){
    int i, n;
    char nomeInformado[81];
    Funcionario* funcionario = NULL;

    printf("\nInforme o número de funcionários: ");
    scanf("%d", &n);
    setbuf(stdin, NULL);

    Funcionario* a[n];

    for(i = 0; i < n; i++){
        Funcionario* vetor = (Funcionario*) malloc(sizeof(Funcionario));
        a[i] = vetor;

        printf("\nNome: ");
        scanf("%[^\n]81s", vetor->nome);
        setbuf(stdin, NULL);

        printf("Valor da hora: ");
        scanf("%f", &vetor->valor_hora);
        setbuf(stdin, NULL);

        printf("Carga horária mensal: ");
        scanf("%d", &vetor->horas_mes);
        setbuf(stdin, NULL);
    }

    printf("\nInforme o nome a ser pesquisado: ");
    scanf("%s", nomeInformado);
    setbuf(stdin, NULL);

    funcionario = busca(n, a, nomeInformado);
    if(funcionario != NULL)
        printf("\t\nNome: %s\t\nValor/h: %.2f\t\nHoras/mês: %d", funcionario->nome, funcionario->valor_hora, funcionario->horas_mes);
    else
        printf("\t\nFuncionário não cadastrado!");

    limpar(n, a);

    printf("\n\n");
    system("pause");
    return 0;
}

Rodando…

image

image

image

1 curtida

vlw brother!