// EJEMPLO DE CODIGO HASH CON COLISIONES #include <stdio.h> #include <string.h> #include <stdlib.h> #define TAM 10 #define TAM_VECTOR 10 struct Colision { char *Nombre; char *Apellido; struct Colision *Sig; }; struct Dato { char *Nombre; char *Apellido; struct Colision *Lista; }; struct Dato VECTOR[TAM_VECTOR]; char *SubString(char *CAD, char Ini, char Fin) { int k = 0, Pos=0; char *SUB_STR = (char *)malloc(sizeof(char)*50); while (CAD[k] != Ini) k++; k++; while(CAD[k] != Fin) { SUB_STR[Pos] = CAD[k]; Pos++; k++; } SUB_STR[Pos] = '\0'; return SUB_STR; } char *Reserva( ) { return (char *)malloc(sizeof(char)*50); } int Codigo_Hash(char *Nombre) { int k=0, Suma = 0; // Suma de los cOdigos ascii while(Nombre[k] != '\0') { Suma += (int)Nombre[k]; k++; } return Suma % TAM_VECTOR; } void Almacena(int Indice, char *Nombre, char *Apellido) { struct Colision *AUX, *PREV; if(VECTOR[Indice].Nombre == NULL) { VECTOR[Indice].Nombre = Reserva(); VECTOR[Indice].Apellido = Reserva(); VECTOR[Indice].Lista = NULL; strcpy(VECTOR[Indice].Nombre, Nombre); strcpy(VECTOR[Indice].Apellido, Apellido); } // Y si sI hubo algo? (colisiOn) else { if (VECTOR[Indice].Lista != NULL) { AUX = VECTOR[Indice].Lista; while(AUX != NULL) { PREV = AUX; AUX = AUX->Sig; } AUX = (struct Colision*)malloc(sizeof(struct Colision)); AUX->Nombre = Reserva(); AUX->Apellido = Reserva(); strcpy(AUX->Nombre, Nombre); strcpy(AUX->Apellido, Apellido); AUX->Sig = NULL; PREV->Sig = AUX; } else { AUX = (struct Colision*)malloc(sizeof(struct Colision)); AUX->Nombre = Reserva(); AUX->Apellido = Reserva(); strcpy(AUX->Nombre, Nombre); strcpy(AUX->Apellido, Apellido); AUX->Sig = NULL; VECTOR[Indice].Lista = AUX; } } } void Ejecuta_Almacena(char *CAD) { char *Nombre = Reserva(); char *Apellido = Reserva(); Nombre = SubString(CAD, '(', ','); Apellido = SubString(CAD, ',', ')'); Almacena(Codigo_Hash(Nombre), Nombre, Apellido); } void Ejecuta_Muestra( ) { int k=0; struct Colision *AUX = NULL; while(k < TAM_VECTOR) { if (VECTOR[k].Nombre != NULL) { printf("%s ", VECTOR[k].Nombre); printf("%s ", VECTOR[k].Apellido); if(VECTOR[k].Lista != NULL) { AUX = VECTOR[k].Lista; while(AUX != NULL) { printf("{==} %s ", AUX->Nombre); printf(" %s ", AUX->Apellido); AUX = AUX->Sig; } } printf("\n"); } k++; } } int Interpreta(char *CAD) { char Comando[TAM], Nombre[TAM], Apellido[TAM]; int k = 0; while (CAD[k] != '(') { Comando[k] = CAD[k]; k++; } Comando[k] = '\0'; if (!strncmp(Comando, "Almacena", 8)) Ejecuta_Almacena(CAD); if (!strncmp(Comando, "Busca", 5)) printf("Busca\n"); //Ejecuta_Busca(CAD); if (!strncmp(Comando, "Muestra", 7)) Ejecuta_Muestra( ); if (!strncmp(Comando, "Fin", 3)) return 0; return 1; } void Ciclo( ) { int Seguir = 1; char *CAD = Reserva(); while(Seguir) { printf("==> "); gets(CAD); Seguir = Interpreta(CAD); } } int main() { Ciclo(); printf("Ok \n"); }