#include<stdio.h>
#include<stdlib.h>
#define MAXC 10//MAXIMO TAMAÑO DE UNA CADENA
#define MAXA 10//TAMAÑO DE LA TABLA
struct nodo
{
char *cadena;
struct nodo *siguiente;
};
int clave (char cadenaux[MAXC])//OBTIENE LA SUMA DE LOS VALORES ASCII DE CADA CARACTER DE LA CADENA
{
int clave=0, ascii, i=0;
while((ascii=cadenaux[i++])!=' ')
clave+=ascii;
return clave;
}
int hash (int clave)//SE DETERMINA LA POSICIO EN LA QUE SE GUARDARA LA CADENA
{
int posicion=clave%MAXA;
return posicion;
}
void insertar(struct nodo **ptabla, char cadena[MAXC])//INSERTAR NUEVO ELEMENTO EN UNA LISTA
{
struct nodo
*nuevo
= (struct nodo
*) malloc(sizeof(struct nodo
));//CREAMOS EL NUEVO NODO nuevo->cadena = cadena;//GUARDAMOS CADENA
nuevo->siguiente = NULL;//COMO SE VA A INSERTAR AL FINAL, SERA EL QUE APUNTE A NULL
struct nodo *actual=*ptabla;//CREAMOS UN PUNTERO AUXILIAR A NODO
if (*ptabla==NULL)
{
*ptabla=nuevo;//SI LISTA VACIA, ENTONCES: NUEVO ES EL PRIMER ELEMENTO
}
else
{
while (actual->siguiente != NULL)
{
printf("n %s n", actual
->cadena
); actual = actual->siguiente;//SI NO ESTA VACIA, SE RECORRE LA LISTA
}
actual->siguiente =nuevo;//EL ULTIMO NODO AHORA ANTECEDE AL NUEVO
}
}
void mostrar(struct nodo *ptabla)//IMPRIMIR LA TABLA
{
struct nodo *actual=ptabla;//ACTUAL ES UN PUNTERO AUXILIAR PARA RECORRER LA LISTA
while (actual!=NULL)//MIENTRAS NO SEA EL FINAL DE LA LISTA
{
printf("[ %s ]->", actual
->cadena
);//IMPRIME EL DATO DEL NODO CORRESPONDIENTE actual = actual->siguiente;//AVANZAMOS AL SIGUIENTE NODO
}
}
main()
{
struct nodo *ptabla[MAXA];//ARREGLO DE PUNTEROS PARA NODOS
char cadenaux[MAXC];//ARREGLO AUXILIAR PARA GUARDAR CADENA INTRODUCIDA
int op, clavecadena, pos;//VARIABLES USADAS PARA MENU Y POSICION EN EL ARREGLO
for(pos=0;pos<MAXA;pos++) ptabla[pos]=NULL;
do
{
printf("n*********************************n"); t1.- Guardar una cadenan
t2.- Buscar una candenan
t3.- Borrar una cadenan
t0.- Salir.ttt");
printf("n*********************************n");
switch(op)
{
case 1:
clavecadena=clave(cadenaux);
pos=hash(clavecadena);
insertar(&(ptabla[pos]), cadenaux);
for(pos=0;pos<MAXA;pos++) mostrar(ptabla[pos]);
break;
}
}while(op!=0);
}