Ir ao conteúdo
  • Cadastre-se

C Código com dificuldades em impressão de nomes em ordem algabética


Tecprogram
Ir à solução Resolvido por Flávio Pedroza,

Posts recomendados

Como eu faço para imprimir as informações dessa tabela Hash em ordem alfabética, já tentei várias implementações, mais ela só imprime de forma aleatória, no momento ela esta imprimindo mais não em ordem alfabética e eu queria em ordem alfabética, alguém poderia me dar essa força. Obs: É uma TAD, e essa parte é a .c

<CODE>

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

#include "hash.h"


#define N 101


struct funcionario
{
    int matricula;
    char nome[21];
    char departamento;
    float salario;
};


struct hash
{
    Funcionario* v[N];
};


Hash* hash_cria(void){
    Hash* tab = (Hash*)malloc(sizeof(Hash));
    int i;
    for(i = 0; i < N; i++){
        tab->v = NULL;
    }
    return tab;
}

 

static int hash(int matricula){
    return(matricula % N);
}

Funcionario* hash_insere(Hash* tab, int matricula, char* nome, char departamento, float salario){
    int h = hash(matricula);
    while(tab->v[h] != NULL){
        h = (h + 1) % N;
    }
        Funcionario* a = (Funcionario*)malloc(sizeof(Funcionario));
        a -> matricula = matricula;
        strcpy(a->nome, nome);
        a -> departamento = departamento;
        a -> salario = salario;
        tab->v[h] = a;
    return (a);
}

void hash_imprime (Hash* tab){
    int i;
    for(i = 0; i < N; i++){
       if(tab->v != NULL){
        printf("Matricula: %d | Nome: %s | Departamento: %c | Salário: %.1f\n", tab->v->matricula, tab->v-> nome, tab->v->departamento, tab->v-> salario);
        }
    }
}
Funcionario* hash_busca(Hash* tab, int matricula){
    int h = hash(matricula);
    while(tab->v[h] != NULL){
        if(tab->v[h]->matricula == matricula){
            return tab->v[h];
        }
        h = (h+1) % N;
    }
    return NULL;
}

void hash_libera(Hash* tab){
    int i;
    for(i = 0; i< N; i++){
        free(tab->v);
    }
    free(tab);
}
 

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Tecprogram     antes de imprimir voce precisa colocar os nomes em ordem , e para isso voce usa o comando strcmp dentro de um loop comparando os nomes ,  e o que for maior eh por que a primeira letra do nome vem depois na ordem alfabetica , ai entao voce faz a troca de um pelo outro de forma que fique em ordem alfabetica  e depois de estar em ordem voce pode imprimir .

Link para o comentário
Compartilhar em outros sites

  • Solução

Acho que estão faltando alguns fornecer o índice de alguns arrays no seu código. Por exemplo:

Hash* hash_cria(void){
    Hash* tab = (Hash*)malloc(sizeof(Hash));
    int i;
    for(i = 0; i < N; i++){
        tab->v[i] = NULL; //faltou [i] aqui
    }
    return tab;
}
      
void hash_imprime (Hash* tab){
    int i;
    for(i = 0; i < N; i++){
       if(tab->v[i] != NULL){
        printf("Matricula: %d | Nome: %s | Departamento: %c | Salário: %.1f\n", tab->v[i]->matricula, tab->v[i]-> nome, tab->v[i]->departamento, tab->v[i]-> salario);
        }
    }
}

 Use essa função para ordenar pelo nome antes de imprimir:

void hash_ordena (Hash* tab){
    int i,j;
    funcionario* temp;
    for(i = 0; i < N-1; i++) 
      for (j = i+1; j < N ; j++) 
         if ((tab->v[i] != NULL) && (tab->v[j] != NULL) && (strcmp(tab->v[i]->nome,tab->v[j]->nome) > 0))
         {   
            temp = tab->v[i];
            tab->v[i] = tab->v[j];
            tab->v[j] = temp;
         }
      
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Só que eu ia fazer assim, mais ai não da para fazer assim porque iria destruir a tabela, e fugiria do conceito de tabela Hash.

adicionado 1 minuto depois
Em 13/02/2019 às 11:22, devair1010 disse:

@Tecprogram     antes de imprimir voce precisa colocar os nomes em ordem , e para isso voce usa o comando strcmp dentro de um loop comparando os nomes ,  e o que for maior eh por que a primeira letra do nome vem depois na ordem alfabetica , ai entao voce faz a troca de um pelo outro de forma que fique em ordem alfabetica  e depois de estar em ordem voce pode imprimir .

Só que eu ia fazer assim, mais ai não da para fazer assim porque iria destruir a tabela, e fugiria do conceito de tabela Hash.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 13/02/2019 às 00:06, Tecprogram disse:

Como eu faço para imprimir as informações dessa tabela Hash em ordem alfabética, já tentei várias implementações, mais ela só imprime de forma aleatória, no momento ela esta imprimindo mais não em ordem alfabética e eu queria em ordem alfabética, alguém poderia me dar essa força. Obs: É uma TAD, e essa parte é a .c


<CODE>

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

#include "hash.h"


#define N 101


struct funcionario
{
    int matricula;
    char nome[21];
    char departamento;
    float salario;
};


struct hash
{
    Funcionario* v[N];
};


Hash* hash_cria(void){
    Hash* tab = (Hash*)malloc(sizeof(Hash));
    int i;
    for(i = 0; i < N; i++){
        tab->v = NULL;
    }
    return tab;
}

 

static int hash(int matricula){
    return(matricula % N);
}

Funcionario* hash_insere(Hash* tab, int matricula, char* nome, char departamento, float salario){
    int h = hash(matricula);
    while(tab->v[h] != NULL){
        h = (h + 1) % N;
    }
        Funcionario* a = (Funcionario*)malloc(sizeof(Funcionario));
        a -> matricula = matricula;
        strcpy(a->nome, nome);
        a -> departamento = departamento;
        a -> salario = salario;
        tab->v[h] = a;
    return (a);
}

void hash_imprime (Hash* tab){
    int i;
    for(i = 0; i < N; i++){
       if(tab->v != NULL){
        printf("Matricula: %d | Nome: %s | Departamento: %c | Salário: %.1f\n", tab->v->matricula, tab->v-> nome, tab->v->departamento, tab->v-> salario);
        }
    }
}
Funcionario* hash_busca(Hash* tab, int matricula){
    int h = hash(matricula);
    while(tab->v[h] != NULL){
        if(tab->v[h]->matricula == matricula){
            return tab->v[h];
        }
        h = (h+1) % N;
    }
    return NULL;
}

void hash_libera(Hash* tab){
    int i;
    for(i = 0; i< N; i++){
        free(tab->v);
    }
    free(tab);
}
 

 

De fato essa forma de implementação deu certo a tabela se manteve construída e a ordenação se efetivou.

adicionado 3 minutos depois

@Flávio Pedroza De fato essa forma de implementação deu certo a tabela se manteve construída e a ordenação se efetivou, na verdade o índice dos vetores que estavam faltando fornecer no meu código tem, acho que deve ter sido quando eu trouxe para cá saiu, mais ainda sim obrigado.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!