Você está na página 1de 7

/* * Implementacao de um dicionario usando listas encadeadas * Trabalho Prtico da disciplina Estrutura de Dados e Algoritmos 1 * * File: dicionario.

c * Author: lucas * * Created on May 24, 2011, 11:43 AM */ #include #include #include #include <stdio.h> <stdlib.h> <string.h> /*necessario para strcmp()*/ <strings.h>

#define NTABHASH 11 /*estrutura para vetor de apontadores*/ typedef struct vetor { struct NoPalavra *vet; /*ponteiro para estruturas do tipo NoPalavra*/ } vetor; vetor vet[NTABHASH]; /*definio do vetor de apontadores para as listas*/ /* estrutura para palavra no idioma de origem*/ typedef struct NoPalavra { char palavra[30]; /*palavra no idioma de origem*/ char class; /*classe da palavra [s] = substantivo, [a] = adjetivo e [v] = verbo*/ struct NoPalavra *ant_class, *prox_class; /*ponteiros para listas de cla sses*/ struct NoPalavra *ant_ord, *prox_ord; /*ponteiros para lista de todas pa lavras em ordem alfabtica*/ struct NoPalavra *prox; /*ponteiro para o prxima palavra armazenada no me smo ndice do vetor*/ struct NoTranslate *trans; /*ponteiro para lista de tradues*/ } NoPalavra, *Palavra; /*estrutura para lista de tradues no idioma destino*/ typedef struct NoTranslate { char trans[50]; /*string com o significado no idoma destino*/ struct NoTranslate *prox; /*ponteiro para proximo significado no idioma destino*/ } NoTranslate; /*listas de classe das palavras*/ Palavra ListAdj = NULL; /*lista de adjetivos*/ Palavra ListVerb = NULL; /*lista de verbos*/ Palavra ListSubst = NULL; /*lista de substantivos*/ /*lista que contem todas as palavras do idioma origem em ordem alfabetica*/ Palavra ListTodas = NULL; //NoPalavra ListTodas = NULL; int inicializaVetor(){ int i; NoPalavra *l;

for (i = 0; i == NTABHASH; i++,l++){ vet[i] = *l;/*coloca um ponteiro na posicao do vetor*/ } return &(vet[0]);/*retorna o endereco do vetorde apontadores*/ } /** * funcao para calcular o indice de armazenamento no vetor de apontadores * * @param palavra * @return hash [inteiro que ser indice do vetor de apontadores] */ int hashing(char palavra[]) { int i, soma, hash; int letra; printf("\n%s\n", palavra); soma = 0; /* varre a string para somar o valor dos caracteres*/ for (i = 0; palavra[i] != '\0'; i++) { letra = (palavra[i] - 96); /*usa a tabela ascii para setar valor seq uencial, a partir de 1, nas letras do alfabeto*/ soma = soma + letra; /*soma os valores das letras de uma palavra par a calculo do hash*/ } /*calcula o valor de hash para armazenamento no vetor de apontadores*/ hash = (soma % NTABHASH); /*retornando o indice do vetor onde ser armaznada a palavra em questao*/ return hash; } /** * funcao para inserir palavras do idoma origem * passa como parametros a lista de todas as palavras, a lista da classe, a palvra * e a classe da mesma * * @return */ //int insereOrig(NoPalavra *ListTodas, NoPalavra *ListClass, char origem[30] , char class){ Palavra insereOrig(NoPalavra *ListClass, char origem[30], char class, int in diceVetor) { NoPalavra *nova, *elemen, *ant; int i; /*secao de checagem - provisoria*/ printf("\nentrando na funcao de insercao\n"); printf("\npalavra a ser inserida = %s\n", origem); printf("\nclasse a ser inserida = %c\n", class); printf("\nLista todas = %p", ListTodas); printf("\nLista classe = %p", ListClass); /*alocacao para insercao de nova palavra*/

if (!(nova = (NoPalavra *) malloc(sizeof (NoPalavra)))) { printf("\nnao conseguiu alocar memoria\n"); return 0; /*retorna falso se nao conseguir alocar a nova palavra*/ } /*INICIO DA INSERCAO*/ printf("\nantes insercao >> origem = %s\n", origem); /*strcpy(str-destino, str-origem);*/ strcpy(nova->palavra, origem); /*insere a palavra*/ printf("\n palavra inserida = %s", nova->palavra); nova->class = class; printf("\n classe inserida = %s", nova->class); /*INSERCAO NO INDICE CORRETO DO VETOR*/ /*AJUSTE DE LISTA DE PALAVRAS POR CLASSE*/ if (!(ListClass)) { /*se for a primeira insercao*/ printf("\nentrando no if de lista"); ListClass = nova; /*recebe o endereco da nova palavra*/ printf("\nendereco do ponteiro para nova palavra = %p", nova); printf("\nlista de classe ponteiro recebe end p/ palavra= %p", ListC lass); } else {/*segunda insercao em diante*/ /*FOR PARA VERIFICAR A ORDEM ALFABETICA DA LISTA DE PALAVRAS POR CLA SSE*/ for (ant = NULL, elemen = (ListClass); (elemen) && (strcmp(elemen->p alavra, nova->palavra) <= 0); ant = elemen, elemen = elemen->prox_class); if (elemen) { /*saindo antes do final da lista*/ nova->prox_class = elemen; /*nova inserida antes de elemen*/ elemen->ant_class->prox_class = nova; /*elemento anterior de ele men aponta para nova*/ nova->ant_class = elemen->ant_class->prox_class; /*nova anterior aponta para o anterior de elemen*/ elemen->ant_class = nova; /*anterior de elemen aponta para nova* / } else { /*Lista vazia ou final da lista -- ant ser o ultimo elemento */ if (elemen->ant_class) {/*se existe elemento anterior nao esta v azia*/ ant->prox_class = nova; /*elemento anterior aponta para nova */ } else { /*lista vazia*/ ListClass = nova; /*lista aponta para primeiro elemento*/ } /*acoes comuns a lista vazia e insercao no final da lista*/ nova->ant_class = ant; nova->prox_class = elemen; } } printf("\nponteiro Lista Classes = %p", ListClass); /*AJUSTE DA LISTA COM TODAS AS PALAVRAS EM ORDEM ALFABETICA*/ if (ListTodas == NULL) { /*se for a primeira insercao*/ ListTodas = nova; /*recebe o endereco da nova palavra*/ printf("\nendereco do ponteiro para nova palavra = %p", nova); printf("\nlista de classe ponteiro recebe end p/ palavra= %p", ListT odas); } else {/*segunda insercao em diante*/

/* for para verificar onde a ordem alfabetica da lista de todas as p alavras*/ for (ant = NULL, elemen = ListTodas; (elemen) && (strcmp(elemen->pal avra, nova->palavra) <= 0); ant = elemen, elemen = elemen->prox_ord); if (elemen) { /*saindo antes do final da lista*/ nova->prox_ord = elemen; /*nova inserida antes de elemen*/ elemen->ant_ord->prox_ord = nova; /*elemento anterior de elemen aponta para nova*/ nova->ant_ord = elemen->ant_ord->prox_ord; /*nova anterior apont a para o anterior de elemen*/ elemen->ant_ord = nova; /*anterior de elemen aponta para nova*/ } else { /*Lista vazia ou final da lista -- ant ser o ultimo elemento */ if (elemen->ant_ord) {/*se existe elemento anterior nao esta vaz ia*/ ant->prox_ord = nova; /*elemento anterior aponta para nova*/ } else { /*lista vazia*/ ListTodas = nova; /*lista aponta para primeiro elemento*/ } /*acoes comuns a lista vazia e insercao no final da lista*/ nova->ant_ord = ant; nova->prox_ord = elemen; } } //imprimeListaTodas(); printf("\nponteiro Lista TODAS = %p", ListTodas); // return 1; /*elemento inserido com sucesso*/ return nova; } /** * funcao para inserir uma lista de traducoes de uma palavra * * @param endNova <endereco da palavra no idioma origem -- recebido de inser eOrig();> * @param trans <string de traducao -- recebida do for de insercao de trad ucoes> */ void insereTrans(Palavra endNova, char trans) { NoTranslate *novaTrans, elem; /*alocacao para insercao de nova palavra*/ if (!(novaTrans = (NoTranslate *) malloc(sizeof (NoTranslate)))) { printf("\nnao conseguiu alocar memoria\n"); exit(); } /*INSERCAO DA TRADUCAO*/ strcpy(novaTrans->trans, trans); /*insere a traduo */ printf("\n traducao inserida = %s", novaTrans->trans); /*ACERTO DA LISTA DE TRADUCOES*/ if (endNova->trans) {/*lista no vazia*/ novaTrans->prox = *(endNova->trans); /*insercao no inicio da lista*/ endNova->trans = novaTrans; } else {/*lista vazia*/ endNova->trans = novaTrans; /*sera primeiro elemento da lista de tra ducoes*/ novaTrans->prox = NULL; /*unico elemento aponta para NULL -- fim da lista*/

} } /** * funcao para imprimir a lista de todas as palavras do idoma origem em orde m alfabetica * * @param ListTodas * @return */ int imprimeListaTodas(Palavra ListTodas) { NoPalavra *list; /*varrer a lista de todas as palavras e imprimir*/ for (list = ListTodas; (list); list = ListTodas->prox_ord) { printf("\n %s\t->", ListTodas->palavra); } } /** * funcao principal * * @return */ int main() { /*scanf(" %d", &b); //repare no espao entre o " e o %.ou ainda:scanf("\n% d", &b); //agora o "\n"Simples no ? Isso j o suficiente pra limpar o buffer.*/ /*nword = numero de palavras; ntrad = numero de traducoes; indice do vet or onde sera armazenada a palavra*/ int i, j, nword, ntrad, indice; /*orig = palavra idioma origem; tran = traducao; class = classe; ord = o rdem da listagem -- crescente [c] ou decrescente [d]*/ char orig[30], trans[50], class, op, ord; NoPalavra *endNova; /*ponteiro para palavra inserida -- usado no armazen amento da traducao*/ inicializaVetor(); /*entradas*/ scanf(" %d", &nword); getchar(); /*for de leitura das palavras no idioma origem*/ for (i = 0; i < nword; i++) { scanf(" %s %c %d", orig, &class, &ntrad); getchar(); /*leitura de palavra, classe e numero de traducoes*/ printf(" \norigem = %s\nclasse = %c\nn_trad = %d\n ", orig, class, n trad); /*Chama funo de hashing para calcular onde sera armazenada a palavra*/ indice = hashing(orig); /*passando as variaveis a serem inseridas na lista de classe*/ switch (class) { case 'a': printf("\npassando adjetivos"); /*passa lista de todas as palavras, de adjetivos, palavra e classe*/

//insereOrig(ListTodas, ListAdj, orig, class); endNova = insereOrig(ListAdj, orig, class); /*passa o retorn o de insereOrig para endNova que sera usada na insercao de traducoes*/ break; case 'v': printf("\npassando verbos"); /*passa lista de todas as palavras, de verbos, palavra e cla sse*/ // insereOrig(ListTodas, ListVerb, orig, class); //insereOrig( , ListVerb, orig, class); break; case 's': printf("\npassando substantivos"); /*passa lista de todas as palavras, de substantivos, palavra e classe*/ // insereOrig(ListTodas, ListSubst, orig, class); break; } /*LOOP DE LEITURA DAS TRADUCOES*/ for (j = 0; j < ntrad; j++) { scanf(" %s", &trans); getchar(); insereTrans(endNova, trans); } } /*OPERACOES SOBRE O DICIONARIO*/ scanf(" %c", &op); switch (op) { case 'l': /*lista palavras em ordem crescente ou decrescente*/ scanf(" %c", &ord); /*pega ordem para listagem*/ getchar(); /*limpeza de buffer -- evita sujeiras vindas da entra da*/ printf("ord = %c", ord); break; case 'o': /*lista um intervalo de palavras em ordem alfabtica crescente ou decrescente a partir de duas letras dadas [intervalo]*/ break; case 't': /*lista traducoes de uma palavra*/ break; case 'a': /*lista palavras por classe*/ break; case 'i': /*lista palavras pelo indice do vetor de apontadores*/ break; case 'c': /*consulta classe de uma palavra dada*/ break; case 'r': /*remove uma palavra do dicionarios*/ break; case 'e': /*saida do programa. Retorno ao sistema operacional*/ exit(0); break;

} }

Você também pode gostar