#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define TAM_MAX 7
struct reg {
int item;
int ocupado;
};
typedef struct reg HASH;
int funcaohash(int);
void inicializa(HASH []);
void insere(HASH [], int);
int busca(HASH [], int);
void apaga(HASH [], int);
void imprime(HASH []);
int cheia(HASH []);
int hash1(int chave) {
return abs(chave) % TAM_MAX;
}
int hash2(int chave) {
return (abs(chave)*2) % TAM_MAX; /* o valor da função */
}
void inicializa(HASH tabHash[]) {
int i;
for(i=0; i<TAM_MAX; i++)
tabHash[i].ocupado = 0; // falso
}
int insere(HASH tabHash[], int chave) {
int i = hash1(chave);
int k = hash2(chave);
int cont = 0;
/* procura a próxima posição livre */
while (tabHash[i] != -1) {
if (tabHash[i] == chave) return –1; /* valor já existente na tabela */
if (++cont == TAM_MAX) return –2; /* tabela cheia */
i = (i + k) % TAM_MAX; /* tabela circular */
}
/* achamos uma posição livre */
tabHash[i] = chave;
return i;
}
// Retorna -1 se não encontrou ou a posição caso encontre o item
int busca(HASH tabHash[], int chave) { // Recuperando um elemento
int i = hash1(chave);
int k = hash2(chave);
int cont = 0 ;
/* procura x a partir da posição i */
while (tabHash[i] != chave) {
if (tabHash[i] == -1) return –1; /* não achou x, pois há uma vazia */
if (++cont == TAM_MAX) return –2; /* a tabela está cheia */
i = (i + k) % TAM_MAX; /* tabela circular */
}
/* encontrou */
return i;
}
void apaga(HASH tabHash[], int chave) {
int pos = busca(tabHash,chave);
if (pos!=-1) {
tabHash[pos].ocupado=0;
printf("-> Dados HASH[%d] apagados",pos);
}
else printf("Item não encontrado");
}
void imprime(HASH tabHash[]) {
int i;
for (i=0; i<TAM_MAX; i++)
if( tabHash[i].ocupado == 1)
printf("\nCampo [%d] = %.2f",i,tabHash[i].item);
}
int cheia(HASH tabHash[]) {
int i, qtde=0;
for (i=0; i<TAM_MAX; i++)
if( tabHash[i].ocupado == 1)
qtde++;
if (qtde == TAM_MAX) return 1;
else return 0;
}
main() {
int i, pos;
HASH tab[TAM_MAX]; // criando tabela na memoria
float item;
inicializa(tab);
// Inserindo elementos (USUARIO)
printf("\n*************************************************************\n");
printf("Tabela HASH com tratamento de colisoes linear (7 itens reais)");
printf("\n*************************************************************");
int c;
while (1) {
printf("\nDigite uma opcao\n");
printf("[1]Inserir elemento na tabela\n[2]Procurar elemento na tabela\n[3]Deletar elemento na tabela\n[4]Imprimir\n[5]Sair\n\n");
scanf("%d",c);
switch(c) {
case 1:
printf("Informe o elemento a ser inserido: ");
scanf("%f",&item);
insere(tab,item);
break;
case 2:
printf("\nForneca o item: ");
scanf("%f",&item);
pos=busca(tab,item);
if (pos!=-1)
printf("Item %.2f encontrado na posicao %d", tab[pos].item,pos);
else printf("Item não encontrado");
break;
case 3:
printf("\n\Informe o item a ser deletado ");
scanf("%f",&item);
apaga(tab,item);
break;
case 4:
printf("\n\nImprimindo conteudo");
imprime(tab);
break;
case 5:
exit(1);
default:
printf("\nEsta opcao não existe. \n");
}
}
}