// HASH VERSION 2.0 // tabla de tamanio N con listas ligadas #include <stdio.h> #include <stdlib.h> #include <string.h> #define TAM 15 #define true 1 struct lista { char *Nombre; int Edad; struct lista *sig; }; struct datos { struct lista *der; }; struct datos Tabla[TAM]; void LimpiarTabla() { int x = 0; while( x < TAM ) { Tabla[x].der = NULL; x++; } } void PideNombre(char *Var) { printf("Introduce el Nombre: "); scanf("%s", Var); } void PideEdad(int *Var) { printf("Introduce la edad: "); scanf("%d", Var); } int Hash(char *Nom) { int x=0, Suma = 0; while(x < strlen(Nom) ) { Suma += Nom[x]*x + strlen(Nom); Nom++; x++; } return Suma%TAM; } void Guarda(char *Nom, int Edad) { int Index=0; struct lista *NEW = (struct lista*)malloc(sizeof(struct lista)); NEW->Nombre = (char*)malloc(sizeof(char)*80); strcpy(NEW->Nombre, Nom); NEW->Edad = Edad; NEW->sig = NULL; Index = Hash(Nom); if ( !Tabla[Index].der ) // primer elemento de la lista { Tabla[Index].der = NEW; } else // ya habIa datos ... lo metemos al principio { NEW->sig = Tabla[Index].der; Tabla[Index].der = NEW; } } void MuestraTabla() { int x =0; char *CAD=(char*)malloc(sizeof(char)*100); struct lista *AUX = NULL; system("clear"); printf("IDX\tNOMBRE\t\tEDAD\n"); while( x<TAM ) { AUX = Tabla[x].der; printf("%i.- ", x); while (AUX) { printf(" %s %i\t", AUX->Nombre, AUX->Edad); AUX = AUX->sig; } printf("\n"); x++; } } int Comando() { int Com = 0; printf("Que operaciOn deseas? [0|1] "); scanf("%d", &Com); return Com; } void Ciclo() { char *Nombre = (char*)malloc(sizeof(char)*80); int Idx=0, Edad = 0; while(true) { if ( Comando() ) // 1=guardar 0=consultar { PideNombre(Nombre); PideEdad(&Edad); Guarda(Nombre, Edad); MuestraTabla(); } else { // PREVER EN CASO DE COLISION PideNombre(Nombre); Idx = Hash(Nombre); printf("La edad de %s es de %i\n", Nombre, Edad); } } } int main(int N, char **A) { LimpiarTabla(); Ciclo(); }