INF1010 - Tabelas de Dispersão
entrega: até sexta, dia 17/5, às 23h
Neste laboratório, vamos implementar uma tabela de dispersão (ou hash)
com a mesma interface mapa.h
de sempre.
O esqueleto de implementação usa
usar as seguintes estruturas para representar a tabela:
typedef struct {
int chave;
void* dados;
int prox;
} ttabpos;
struct smapa {
int tam;
int ocupadas;
ttabpos *tabpos;
};
Ou seja, a tabela é uma struct contendo um campo com o tamanho inicial
e um ponteiro para a tabela propriamente dita.
Sua implementação deve tratar conflitos através de encadeamento interno,
de maneira semelhante ao que foi exposto na aula de segunda
(esboçado nesses slides).
Cada posição da tabela contém, além da chave e dos dados,
um campo prox, apontando para o índice da tabela contendo
a próxima chave mapeada para o mesmo valor de hash que a chave na posição
atual.
Se não houver essa "próxima" chave, o campo prox deve conter o
valor -1.
Pegue o arquivo mapa.c que tem um esboço
da implementação, e o arquivo de teste em
teste.c.
- (4 pontos) Implemente a função insere,
inicialmente sem redimensionamento.
O esqueleto de implementação está criando tabelas com 11 posições.
A função insere deve seguir o seguinte algoritmo:
-
Calcula pos fazendo o hash da chave modulo o tamanho da tabela
-
Caso pos esteja livre, realiza inserção e retorna.
Caso contrário, procura por poslivre, uma próxima posição livre na tabela.
-
Caso a chave em pos tenha o mesmo valor de hash que a chave a inserir,
estamos em um conflito primário:
insere a nova chave em poslivre e encadeia poslivre
na lista atual.
-
Caso a chave em pos tenha valor diferente de hash que a chave a inserir,
estamos em um conflito secundário:
move a chave em pos para poslivre e corrige a lista
encadeada referente aos conflitos deste outro valor de hash.
- Teste sua implementação usando o programa de testes dados.
A função de hash usada inicialmente gera conflitos
para todos os números iguais módulo o tamanho da tabela
(definido inicialmente como 11).
Use isto para gerar conflitos propositalmente.
- (2 pontos) Implemente o redimensionamento
da tabela (função redimensiona, chamado
quando a tabela atinge 75% de ocupação.
- (2 pontos)
Implemente a função de busca.
- (2 pontos)
Implemente a função de retirada.
(Não há esqueleto ou teste para essa função!)
obs: Nesse laboratório não é necessário copiar os testes realizados
para a área de comentários. Basta entregar o arquivo mapa.c e, caso tenha alterado
os testes, entregue também seu arquivo teste.c.