// 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();
}