Inserir nome e tel, remover o nome e tel e consultar o tel em tabela hash em c++

5 respostas
ADRIANA_NUNES

olá pessoal , pois tenho que fazer um trabalho em c++ pela tabela hash seria o seguinte :
1-inserir nomes e telefones de uma pessoa,
2- depois remover o nome e o telefone e
3- E consultar o telefone .
alguém poderia me ajudar por favor. o que consegui fazer foi isso :
eu quero agora implementar o telefone , mais não sei fazer? se alguém souber me ajude por favor!

#include <stdio.h> 

#include <stdlib.h> 

#include <string.h> 

#define TAMTAB 37 



typedef char string[30]; 


typedef struct{ 

string tab[TAMTAB]; 

int ocup; 

}tabela; 


void pausa(){ 

fflush(stdin); 

getchar(); 

} 


int hash(char *nom){ 

int soma, i; 

soma = 0; 

for(i = 0; i < strlen(nom); i++) 

soma += (i+1)*nom[i]; 

soma = soma%TAMTAB; 

if(soma == 0) 

return 1; 

return soma; 

} 


int hash_insere(tabela *t, char *nome, int h){ 

if(strcmp(t->tab[h],"\0") == 0 || strcmp(t->tab[h], "*") == 0){ 

strcpy(t->tab[h], nome); 

t->ocup++; 

printf("\n\tO nome foi inserido na posicao %d\n", h); 

return 0; 

} 

return 1; 

} 


int hash_procura(tabela *t, char *nome, int h){ 

int i = 0; 

while(strcmp(t->tab[(h*++i*i)%TAMTAB],"\0") != 0 && strcmp(t->tab[(h*i*i)%TAMTAB], nome) != 0); //Faz ateh achar um espaco vazio ou achar o nome. 

if(strcmp(t->tab[(h*i*i)%TAMTAB],"\0") == 0){ 

return -1;//Se nao achou, devolve -1 

} 

else{ 

printf("\n\tO nome foi encontrado na posição %d\n", h*i*i%TAMTAB); 

return (h*i*i)%TAMTAB; //se achou, em que posicao achou? 

} 

} 


void hash_remover(tabela *t, char *nome){ 

int a; 

a = hash_procura(t, nome, hash(nome)); 

if(a < 0) 

printf("\n\tO nome %s procurado nao consta na tabela.\n", nome); 

else{ 

strcpy(t->tab[a], "*"); 

t->ocup--; 

printf("\n\tO nome foi removido: %s\n", nome); 

} 

} 



void menu(){ 


printf("\t0. Sair do programa\n"); 

printf("\t1. Inserir Nomes;\n"); 

printf("\t2. Procurar Nomes;\n"); 

printf("\t3. Remover Nomes;\n"); 




printf("\n\nSua escolha: "); 

} 


void escolha(tabela *t){ 

string nome; 

int i, h, opc; 

scanf("%d", &opc); 

switch(opc){ 

case 0: 

break; 

case 1: 

printf("\nDigite os nomes a serem colocados na tabela.\n"); 

printf("Termine a sequencia com \"*\":\n"); 

do{ 

scanf("%s", nome); 

if(strcmp(nome, "*") != 0){ 

i = 0; 

h = hash(nome); 

while(hash_insere(t, nome, ((++i*h*i)%TAMTAB))); 

//printf("i = %d\n", i); //imprimir o numero de tentativas 

} 

}while(strcmp(nome, "*")); //leitura 

break; 

case 2: 

printf("\nDigite os nomes a serem consultados.\n"); 

printf("Termine a sequencia com \"*\"\n"); 

do{ 

scanf("%s", nome); 

if(strcmp(nome, "*") != 0){ 

h = hash(nome); 

i = hash_procura(t, nome,h); 

if(i < 0){ 

printf("\n\tO nome %s nao foi encontrado\n"); 

} 

else{ 

printf("\n\t%s esta na tabela!\n"); 

} 

} 

}while(strcmp(nome, "*"));//procura 

break; 

case 3: 

printf("\nDigite os nomes a serem removidos.\n"); 

printf("Termine a sequencia com \"*\":\n"); 

do{ 

scanf("%s", nome); 

if(strcmp(nome, "*") != 0){ 

hash_remover(t, nome); 

} 

}while(strcmp(nome, "*"));//remocao 

break; 







default: 

printf("Opcao invalida. Por favor, digite uma opcao valida.\n"); 

break; 

} 

if(opc != 0){ 

menu(); 

escolha(t); 

} 

} 

int main(){ 

tabela t; 

int i; 

for(i = 0; i < TAMTAB; i++){ 

strcpy(t.tab[i],"\0"); 

} 

t.ocup = 0;//Ateh aqui, iniciar tabela. 

menu(); 

escolha(&t); 

printf("Saindo do programa....\n"); 

}

5 Respostas

T

Credo, isso é C++? Isso parece mais com C puro e simples. Em C++ eu já tenho pronto o hash (#include <unordered_map> e as strings (#include <string>) e a entrada e saída de dados é normalmente com cout e cin, mas como suponho que o professor recomendou que se implementasse a hash table na mão, vou ficar devendo.

ADRIANA_NUNES

teria como me enviar o que vc tem? pelo menos pode me servir.
obrigada

T

Acho que não me expressei corretamente.

Em C++, na biblioteca STL ou na TR1, existem várias coisas prontas; depende só da sua versão do compilador.

A hash table, por exemplo, pode ser encontrada como stdext::hash_map (Visual Studio 2005 ou posterior) ou std::tr1::unordered_map (Visual Studio 2008); no g++ eu já não sei qual é o nome da classe.
A string, em C++, na STL, é importada usando-se “#include <string>”; “using namespace std” e coisas parecidas.

Não sei se sua hash table foi corretamente implementada em C; só sei que você precisa, usando sua implementação de hash, incluir o mesmo dado (nome + telefone) em dois hashs, um indexado por nome, e outro indexado por telefone, para atender ao seu requisito. E é por isso que o ideal é criar uma classe que implementa o hash e que receba um parâmetro indicando se você precisa indexar por nome ou telefone; do jeito que você fez (padrão C) está certo, mas é bitolada para o hash por nomes.

ADRIANA_NUNES

valeu thingo vou tentar fazer, no caso eu preciso fazer um hash para telefone também né… um Abração

ADRIANA_NUNES

olá thingo, será que vc pode me daralguma demonstração de como devo fazer a class para inserir nome e telefone? porque não estou conseguindo fazer… obrigada

Criado 7 de janeiro de 2009
Ultima resposta 12 de jan. de 2009
Respostas 5
Participantes 2