HASH_2.c



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