Tabelas Hash - Exemplo em C

De Aulas
Revisão de 15h27min de 26 de novembro de 2016 por Admin (discussão | contribs) (Substituição de texto - "<code c n>" por "<syntaxhighlight lang=c line>")
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)

Links relacionados: DAS5102 Fundamentos da Estrutura da Informação

contato.h

 1#ifndef CONTATO_H_INCLUDED
 2#define CONTATO_H_INCLUDED
 3
 4typedef struct contato Contato;
 5
 6Contato* contato_criar(int codigo, char nome[], char telefone[], char email[]);
 7
 8int contato_getCodigo(Contato *c);
 9char* contato_getNome(Contato *c);
10char* contato_getTelefone(Contato *c);
11char* contato_getEmail(Contato *c);
12
13void contato_setCodigo(Contato *c, int codigo);
14void contato_setNome(Contato *c, char nome[]);
15void contato_setTelefone(Contato *c, char telefone[]);
16void contato_setEmail(Contato *c, char email[]);
17
18void contato_destruir(Contato *c);
19
20#endif // CONTATO_H_INCLUDED

contato.c

 1#include "contato.h"
 2#include "string.h"
 3#include <stdlib.h>
 4
 5struct contato
 6{
 7	int codigo;
 8	char nome[255];
 9	char telefone[30];
10	char email[50];
11};
12
13Contato* contato_criar(int codigo, char nome[], char telefone[], char email[])
14{
15	Contato *c = (Contato*) malloc (sizeof(Contato));
16	c->codigo = codigo;
17	strcpy(c->nome, nome);
18	strcpy(c->telefone, telefone);
19	strcpy(c->email, email);
20	return c;
21}
22
23int contato_getCodigo(Contato *c)
24{
25	return c->codigo;
26}
27
28char* contato_getNome(Contato *c)
29{
30	return c->nome;
31}
32
33char* contato_getTelefone(Contato *c)
34{
35	return c->telefone;
36}
37
38char* contato_getEmail(Contato *c)
39{
40	return c->email;
41}
42
43void contato_setCodigo(Contato *c, int codigo)
44{
45    c->codigo = codigo;
46}
47
48void contato_setNome(Contato *c, char nome[])
49{
50    strcpy(c->nome, nome);
51}
52
53void contato_setTelefone(Contato *c, char telefone[])
54{
55    strcpy(c->telefone, telefone);
56}
57
58void contato_setEmail(Contato *c, char email[])
59{
60    strcpy(c->email, email);
61}
62
63void contato_destruir(Contato *c)
64{
65    free(c);
66    c = NULL;
67}

lista.h

 1#ifndef LISTA_H_INCLUDED
 2#define LISTA_H_INCLUDED
 3
 4typedef struct lista Lista;
 5
 6Lista* lista_criar();
 7void lista_inserirInicio(Lista* l, int codigo, void *item);
 8void lista_inserirFim(Lista* l, int codigo, void *item);
 9void lista_inserir(Lista* l, int codigo, void *item, int posicao);
10void* lista_buscar(Lista* l, int posicao);
11void* lista_buscarCodigo(Lista* l, int codigo);
12void lista_excluir(Lista* l, int posicao);
13int lista_tamanho(Lista* l);
14void lista_destruir(Lista* l);
15
16#endif // LISTA_H_INCLUDED

lista.c

  1#include "lista.h"
  2#include <stdio.h>
  3#include <stdlib.h>
  4#include <string.h>
  5
  6typedef struct no No;
  7
  8struct no
  9{
 10    int codigo;
 11	void* item;
 12	No* proximo;
 13};
 14
 15struct lista
 16{
 17	int tamanho;
 18	No* inicio;
 19	No* fim;
 20};
 21
 22Lista* lista_criar()
 23{
 24	Lista* l = malloc(sizeof(Lista));
 25	l->tamanho = 0;
 26	l->inicio = NULL;
 27	l->fim = NULL;
 28	return l;
 29}
 30
 31void lista_inserirInicio(Lista* l, int codigo, void* item)
 32{
 33	No* n = malloc (sizeof(No));
 34	n->codigo = codigo;
 35	n->item = item;
 36	if (l->tamanho == 0)
 37	{
 38		n->proximo = NULL;
 39		l->inicio = n;
 40		l->fim = n;
 41		l->tamanho++;
 42		return;
 43	}
 44	n->proximo = l->inicio;
 45	l->inicio = n;
 46	l->tamanho++;
 47}
 48
 49void lista_inserirFim(Lista* l, int codigo, void *item)
 50{
 51	if(l->tamanho == 0)
 52	{
 53		lista_inserirInicio(l, codigo, item);
 54		return;
 55	}
 56	No* n = malloc(sizeof(No));
 57	n->codigo = codigo;
 58	n->item = item;
 59	n->proximo = NULL;
 60	l->fim->proximo = n;
 61	l->fim = n;
 62	l->tamanho++;
 63}
 64
 65void lista_inserir(Lista* l, int codigo, void *item, int posicao)
 66{
 67	if (posicao <= 0)
 68	{
 69		lista_inserirInicio(l, codigo, item);
 70		return;
 71	}
 72	if (posicao >= l->tamanho)
 73	{
 74		lista_inserirFim(l, codigo, item);
 75		return;
 76	}
 77	int i;
 78	No* local = l->inicio;
 79	for (i = 0; i < posicao - 1; i++)
 80	{
 81		local = local->proximo;
 82	}
 83	No* n = malloc(sizeof(No));
 84	n->codigo = codigo;
 85	n->item = item;
 86	n->proximo = local->proximo;
 87	local->proximo = n;
 88	l->tamanho++;
 89}
 90
 91void* lista_buscar(Lista* l, int posicao)
 92{
 93	if (l->tamanho == 0)
 94	{
 95		return ""; // Lista vazia
 96	}
 97	if ((posicao < 0) || (posicao >= l->tamanho))
 98	{
 99		return ""; // fora da area de abrangencia
100	}
101	No* local = l->inicio;
102	int i;
103	for (i = 0; i < posicao; i++)
104	{
105		local = local->proximo;
106	}
107	return local->item;
108}
109
110void* lista_buscarCodigo(Lista* l, int codigo)
111{
112    No* local = l->inicio;
113    while (local != NULL)
114    {
115        if (local->codigo == codigo)
116        {
117            return local->item;
118        }
119        local = local->proximo;
120    }
121    return NULL;
122}
123
124void lista_excluir(Lista* l, int posicao)
125{
126	if (l->tamanho == 0)
127	{
128		return;
129	}
130	if (l->tamanho == 1)
131	{
132		free(l->inicio);
133		l->tamanho = 0;
134		l->inicio = NULL;
135		l->fim = NULL;
136	}
137	if (posicao == 0)
138	{
139		No* aux = l->inicio;
140		l->inicio = aux->proximo;
141		free(aux);
142		l->tamanho--;
143		return;
144	}
145	No* local = l->inicio;
146	int i = 0;
147	for (i = 0; i < posicao - 1; i++)
148	{
149		local = local->proximo;
150	}
151	No* aux = local->proximo;
152	local->proximo = aux->proximo;
153	free(aux->item);
154	free(aux);
155	if (local->proximo == NULL)
156	{
157		l->fim = local;
158	}
159	l->tamanho--;
160}
161
162int lista_tamanho(Lista* l)
163{
164	return l->tamanho;
165}
166
167void lista_destruir(Lista* l)
168{
169	if (l->tamanho == 0)
170	{
171		return;
172	}
173	while (l->inicio != NULL)
174	{
175		No* aux = l->inicio;
176		l->inicio = l->inicio->proximo;
177		free(aux->item);
178		free(aux);
179	}
180	l->tamanho = 0;
181	free(l);
182	l = NULL;
183}

hash.h

 1#ifndef HASH_H_INCLUDED
 2#define HASH_H_INCLUDED
 3
 4typedef struct hash Hash;
 5
 6Hash* hash_criar();
 7void hash_destruir(Hash* h);
 8void* hash_buscar(Hash* h, int codigo);
 9void hash_inserir(Hash* h, int codigo, void *item);
10
11#endif // HASH_H_INCLUDED

hash.c

 1#include "hash.h"
 2#include "lista.h"
 3#include <stdlib.h>
 4#include <stdio.h>
 5
 6#define OPERADOR    4
 7
 8struct hash
 9{
10	Lista* vet[OPERADOR];
11};
12
13Hash* hash_criar()
14{
15	int i;
16	Hash* h = malloc(sizeof(Hash));
17	for (i = 0; i < OPERADOR; i++)
18	{
19		h->vet[i] = lista_criar();
20	}
21	return h;
22}
23
24void hash_inserir(Hash* h, int codigo, void *item)
25{
26	int chave = (codigo % OPERADOR);
27	lista_inserirInicio(h->vet[chave], codigo, item);
28}
29
30void* hash_buscar(Hash* h, int codigo)
31{
32    return lista_buscarCodigo(h->vet[codigo % OPERADOR], codigo);
33}
34
35void hash_destruir(Hash* h)
36{
37	int i;
38	for (i = 0; i < OPERADOR; i++)
39	{
40		lista_destruir(h->vet[i]);
41	}
42	free(h);
43	h = NULL;
44}

main.c

 1#include <stdio.h>
 2#include <stdlib.h>
 3#include "hash.h"
 4#include "contato.h"
 5
 6int main()
 7{
 8	Hash* h = hash_criar();
 9	hash_inserir(h, 2, contato_criar(2, "Saulo", "99990000", "saulopz@gmail.com"));
10	hash_inserir(h, 6, contato_criar(6, "Joao", "99009900", "joao@gmail.com"));
11	hash_inserir(h, 13, contato_criar(13, "Marta", "99778877", "marta@gmail.com"));
12	hash_inserir(h, 12, contato_criar(12, "Roberta", "87872222", "roberta@gmail.com"));
13	hash_inserir(h, 7, contato_criar(7, "Marta", "77887777", "marta@gmail.com"));
14	int i;
15	for (i = 0; i < 20; i++)
16	{
17		Contato *c = (Contato*)hash_buscar(h, i);
18		if (c != NULL)
19		{
20			printf("%d - %d: %s - %s\n", i % 4, i, contato_getNome(c), contato_getEmail(c));
21		}
22	}
23	hash_destruir(h);
24	return 0;
25}