/* BUSQUEDA (HASH) DESPUES DE LEER UN ARCHIVO Objetivo: Lee un archivo de texto y lo almacena en una tabla hash para efectuar bUsquedas J. Rafael R. Ochoa */ #include <stdio.h> #include <ctype.h> #include <conio.h> #include <string.h> #include <stdlib.h> #include <math.h> #define valmax 300 struct cadena {char palabra[16]; int frec; struct cadena *psig; }; typedef struct cadena *LISTA; struct {int totp; LISTA pc; }tabla[valmax]; void agrega_palabra(char *, int); LISTA search(LISTA, char *); LISTA getnode(); void insfin(LISTA, char *); void pausa(void); void libera_tabla(void); void free_cad(LISTA); int gen_hash(char *); void bushash(char []); void main() { int i, ip, vp=0, cp=0; char letra, palabra[16], bfin[16], patron[16]; FILE *fpt; clrscr(); for (i=0; i < valmax; i++) {tabla[i].totp = 0; tabla[i].pc = NULL; } if ((fpt = fopen("diccesp.txt","r")) == NULL) pausa(); } else do {letra = getc(fpt); if (isalpha(letra)) {ip=0; palabra[ip]=letra; while (isalpha(letra = getc(fpt)) && ip<15) {ip++;palabra[ip]=letra;} if (ip < 15) {ip++;palabra[ip]='\0';} else palabra[ip]='\0'; vp=gen_hash(palabra); agrega_palabra(palabra, vp); } cp++; } while (feof(fpt) == 0 && cp < 1500); fclose(fpt); strcpy(bfin,"//"); while (strcmp(patron,bfin)!=0) {clrscr(); printf("\nBUSQUEDA POR DISPERSION..."); printf("\n\nPalabra a buscar? (Salir: //)"); scanf("%s",patron); if (strcmp(patron,bfin)!=0) bushash(patron); } libera_tabla(); clrscr(); } void bushash(char match[]) { int pos; LISTA p=NULL; pos=gen_hash(match); if (tabla[pos].totp != 0) p=search(tabla[pos].pc, match); if (p==NULL) printf("\n ...No encontrada"); else printf("\n ...Encontrada en la celda: %d",pos); pausa(); } int gen_hash(char *p) { int longp, ccod, valp=0, ptab; longp = strlen(p); for (ccod=0; ccod <longp ; ccod++) valp = valp + toascii(p[ccod]); ptab = fmod(valp,300); return ptab; } void agrega_palabra(char *p, int ptab) { LISTA ppal; if (tabla[ptab].totp == 0) {tabla[ptab].pc=getnode(); strcpy(tabla[ptab].pc->palabra,p); tabla[ptab].pc->frec = 1; ++tabla[ptab].totp; tabla[ptab].pc->psig=NULL; } else {ppal=search(tabla[ptab].pc,p); if (ppal == NULL) {insfin(tabla[ptab].pc,p); ppal=search(tabla[ptab].pc,p); ppal->frec = 1; ++tabla[ptab].totp; } else ++ppal->frec; } } LISTA search(LISTA primera, char* plb) { LISTA l; for (l = primera; l != NULL; l = l->psig) if (strcmp(l->palabra, plb) == 0) return (l); return (NULL); } void insfin(LISTA primera, char *plb) { LISTA m,l; l=getnode(); strcpy(l->palabra,plb); l->psig = NULL; if (primera == NULL) { printf("Error\n"); exit(1); } else {for (m = primera; m->psig != NULL; m = m->psig); m->psig = l; } } LISTA getnode() { LISTA l; l = (LISTA) malloc(sizeof(struct cadena)); if (l==NULL) {printf("\nERROR: !memoria agotada!!"); exit(1);} return l; } void libera_tabla() { int i; for (i=0;i<valmax;i++) if (tabla[i].totp != 0) free_cad(tabla[i].pc); } void free_cad(LISTA l) { if (l==NULL) return; else { free_cad(l->psig); free(l); } } void pausa() { gotoxy(40,23); printf("oprima una tecla: "); getche(); }