Olá, pessoal!
No nosso segundo lab de CES-11 tivesmos que implementar um dicionário utilizando hash table (tabela de dispersão). O programa está logo abaixo!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct palavra palavra;
typedef struct significado significado;
typedef palavra *vetor;
/***********************************************************************
estrutura de um significado de uma dada expressão
***********************************************************************/
struct significado{
char definicao[50];
significado *proximo;
};
/***********************************************************************
estrutura de uma expressao
***********************************************************************/
struct palavra{
char expressao[50];
significado *significados;
palavra *prox;
};
///Funções:
/***********************************************************************
funcao que calcula a posicao de uma expressao no dicionario
***********************************************************************/
int dispersao(char exp[], int N){
int soma=0;
for(int i=0; exp[i]!='\0'; i++)
soma+=exp[i];
soma=soma%N;
return soma;
}
/***********************************************************************
funcao que INSERE uma nova palavra com um novo significado na tabela
de dispersao
***********************************************************************/
void inserir(char exp[], char def[], vetor *dicionario, int n){
int posicao;
posicao=dispersao(exp, n);
palavra *auxiliar, *copia;
significado *aux, *cola;
int palavra_igual=0;
int significado_igual=0;
for(auxiliar=dicionario[posicao]; auxiliar!=NULL; auxiliar=dicionario[posicao]->prox){
if(strcmp(auxiliar->expressao, exp)==0){
palavra_igual=1;
for(aux=auxiliar->significados; aux!=NULL; aux=aux->proximo){
if(strcmp(aux->definicao, def)==0){
significado_igual=1;
}
}
if(significado_igual==0){
cola=auxiliar->significados;
aux=(significado*)malloc(sizeof(significado));
auxiliar->significados=aux;
aux->proximo=cola;
strcpy(aux->definicao, def);
}
}
}
if(palavra_igual==0){
copia=dicionario[posicao];
auxiliar=(palavra*)malloc(sizeof(palavra));
dicionario[posicao]=auxiliar;
dicionario[posicao]->significados=(significado*)malloc(sizeof(significado));
auxiliar->prox=copia;
strcpy(dicionario[posicao]->significados->definicao, def);
strcpy(dicionario[posicao]->expressao, exp);
dicionario[posicao]->significados->proximo=NULL;
}
}
/***********************************************************************
funcao que CARREGA A BASE DE DADOS inicial do dicionario
***********************************************************************/
void baseDeDados(vetor *dicionario, int n, FILE *inicio){
char linha[100], *pch, exp[50], total[100], def[50];
while(fscanf(inicio, "%s",total)!=EOF){
fgets(linha, 101, inicio);
strcat(total, linha);
total[strlen(total)-1]='\0';
strcpy(linha, total);
pch=strtok(total, "|");
strcpy(exp, pch);
pch=strtok(NULL, "|");
strcpy(def, pch);
inserir(exp, def, dicionario, n);
}
}
/***********************************************************************
funcao que CONSULTA uma expressao no dicionario
***********************************************************************/
void consultar(FILE *saida, char exp[], int n, vetor *dicionario){
int posicao;
palavra *auxiliar;
significado *aux;
posicao=dispersao(exp, n);
int encontrada=0;
for(auxiliar=dicionario[posicao]; auxiliar!=NULL; auxiliar=auxiliar->prox){
if(strcmp(auxiliar->expressao, exp)==0){
encontrada=1;
for(aux=dicionario[posicao]->significados; aux!=NULL; aux=aux->proximo){
fprintf(saida, "%s\n", aux->definicao);
}
fprintf(saida, "\n");
}
}
if(encontrada==0){
fprintf(saida, "nada consta\n\n");
}
}
/***********************************************************************
funcao que ELIMINA um significado do dicionario
***********************************************************************/
void eliminar_significado(vetor *dicionario, int n, char exp[], char def[]){
int posicao;
posicao=dispersao(exp, n);
palavra *auxiliar;
significado *aux, *copia, *anterior;
anterior=NULL;
for(auxiliar=dicionario[posicao]; auxiliar!=NULL; auxiliar=auxiliar->prox){
if(strcmp(auxiliar->expressao, exp)==0){
for(aux=dicionario[posicao]->significados; aux!=NULL; anterior=aux, aux=aux->proximo){
if(strcmp(aux->definicao, def)==0){
if(anterior==NULL){
dicionario[posicao]->significados=aux->proximo;
}
else{
copia=aux->proximo;
anterior=copia;
}
free(aux);
}
}
}
}
}
/***********************************************************************
funcao que ELIMINA uma expressao do dicionario
***********************************************************************/
void eliminar_expressao (vetor *dicionario, int n, char exp[]){
int posicao;
posicao=dispersao(exp, n);
palavra *auxiliar, *anterior;
significado *aux, *next;
anterior=NULL;
for(auxiliar=dicionario[posicao]; auxiliar!=NULL; anterior=auxiliar, auxiliar=auxiliar->prox){
if(strcmp(auxiliar->expressao, exp)==0){
aux=auxiliar->significados;
next=aux->proximo;
if(anterior!=NULL){
anterior=auxiliar->prox;
}
else{
dicionario[posicao]=auxiliar->prox;
}
while(aux!=NULL){
free(aux);
aux=aux->proximo;
}
free(auxiliar);
}
}
}
/***********************************************************************
funcao que gera a base de dados final
***********************************************************************/
void gerar_base(int n, vetor *dicionario){
palavra *auxiliar;
significado *aux;
FILE *base;
base=fopen("dicionitaa.txt", "w");
for(int i=0; i<n; i++){
for(auxiliar=dicionario[i]; auxiliar!=NULL; auxiliar=auxiliar->prox){
for(aux=dicionario[i]->significados; aux!=NULL; aux=aux->proximo){
fprintf(base, "%s|%s\n", auxiliar->expressao, aux->definicao);
}
}
}
fprintf(base, "\n");
fclose(base);
}
/*************************************************************************************/
int main(){
int vezes, operacao, n;
char linha[100], lixo, exp[50], def[50], *pch;
vetor *dicionario;
FILE *entrada, *inicio, *saida;
entrada=fopen("entrada.txt", "r");
inicio=fopen("DicionITA.txt", "r");
saida=fopen("saida.txt", "w");
fscanf(entrada, "%d %d", &n, &vezes);
dicionario=(vetor*)malloc(n*sizeof(vetor));
for(int i=0; i<n; i++){
dicionario[i]=NULL;
}
while(vezes>0){
fscanf(entrada, "%d%c", &operacao, &lixo);
fgets(linha, 101, entrada);
linha[strlen(linha)-1]='\0';
switch(operacao){
case 1:
baseDeDados(dicionario, n, inicio);
break;
case 2:
consultar(saida, linha, n, dicionario);
break;
case 3:
pch=strtok(linha, "|");
strcpy(exp, pch);
pch=strtok(NULL, "|");
strcpy(def, pch);
inserir(exp, def, dicionario, n);
break;
case 4:
pch=strtok(linha, "|");
strcpy(exp, pch);
pch=strtok(NULL, "|");
strcpy(def, pch);
eliminar_significado(dicionario, n, exp, def);
break;
case 5:
eliminar_expressao (dicionario, n, linha);
break;
case 6:
gerar_base(n, dicionario);
break;
}
vezes--;
}
fclose(entrada);
fclose(inicio);
fclose(saida);
return 0;
}