DAS5102 - Tabela Hash
De Aulas
Links Relacionados: DAS5102 Fundamentos da Estrutura da Informação
Roteiro
Observe o código abaixo:
1#include <stdio.h>
2
3#define TAMHASH 113
4
5struct registro
6{
7 int prio;
8 char nome[30];
9 struct registro *prox;
10};
11
12struct registro *tabela[TAMHASH];
13
14int hash( char *n)
15{
16 int i, h;
17 for( i=0, h=1; n[i]!='\0'; ++i)
18 {
19 h = (h * n[i]) % TAMHASH;
20 }
21 printf("Funcao hash de <%s> deu <%d>\n", n, h);
22 return h;
23}
24
25void insere( int p, char *n)
26{
27 struct registro *novo;
28 int h;
29
30 if( (novo = (struct registro *) malloc( sizeof(struct registro))) == NULL )
31 {
32 printf("Erro na alocacao\n");
33 exit(1);
34 }
35
36 novo->prio = p;
37 strcpy( novo->nome, n);
38
39 h = hash(n);
40
41 novo->prox = tabela[h];
42 tabela[h] = novo;
43}
44
45struct registro * consulta( char *n)
46{
47 int h;
48 struct registro *x;
49
50 h = hash(n);
51 x = tabela[h];
52 while( x != NULL && strcmp( n, x->nome) != 0 )
53 {
54 x = x->prox;
55 }
56 return x;
57}
58
59int main( int argc, char *argv[])
60{
61 int i;
62 struct registro *p;
63
64 for(i=0; i<TAMHASH; ++i)
65 {
66 tabela[i] = NULL;
67 }
68
69 insere( 5, "5555");
70 insere( 5, "55555");
71 insere( 8, "8888");
72 insere( 7, "7777");
73 insere( 3, "3333");
74 insere( 9, "9999");
75 insere( 89, "8889");
76 insere( 98, "9998");
77
78 p = consulta("5555");
79
80 if( p == NULL )
81 {
82 printf("Nao encontrou 5555!\n");
83 }
84 else
85 {
86 printf("Encontrou 5555 com prioridade %d!\n", p->prio);
87 }
88}
1. Implemente a tabela hash como apresentada em aula (arquivos .h e .c).
2. Implemente um programa principal que faça várias inserções e consultas a esta tabela.
3. Na aula tinha funções para: Criar, inserir e consultar. Contudo, não eram genéricas, mas especificas para "alunos" cujo campo chave era o nome. Modifique-as para que fiquem genéricas, podendo receber qualquer tipo.