/*listas.c*/
#include "listas.h"
/* Programa principal */
main()
{
struct lista *existe;
struct lista *cabeza;
char nombre[15];
char ape1[20];
char ape2[20];
int edad = 0;
int opcion;
char resp;
char fichero[35];
/* opciones */
do{
crearLista(&cabeza);
do{
cogerDatosTexto(&cabeza);
printf("\n La lista enlazada es asi: \n\n");
mostrarLista(cabeza);
presentaMenu();
printf("Introduce una opcion: ");
scanf("%d",&opcion);
fflush(stdin);
}while(opcion <0 || opcion > 11);
switch(opcion)
{
case 1: /*Insercion al principio*/
introducirDatos(nombre, ape1, ape2, edad);
/*comprobamos si existe la persona*/
existe = buscarPersona(cabeza, ape1);
if(!existe) //existe == NULL
{
do{
insertarPrincipio(&cabeza, nombre,ape1, ape2,edad);
printf("\n Persona insertada");
printf("\n\n¿Desea introducir otra persona? (S/N): ");
scanf("%c", &resp);
}while(resp == 's' || resp =='S');
mostrarLista(cabeza);
getchar();
}
else
printf("\n Esta persona ya existe");
visualizarNodo(existe);
getchar();
getchar();
break;
case 2: /*Insercion al final*/
introducirDatos(nombre, ape1, ape2, edad);
/*comprobamos si existe la persona*/
existe = buscarPersona(cabeza, ape1);
if(!existe) //si no existe
{
do{
insertarFinal(&cabeza, nombre, ape1, ape2, edad);
printf("\n Persona insertada");
printf("\n\n¿Desea introducir otra persona? (S/N): ");
scanf("%c", &resp);
system("clear");
}while(resp == 's' || resp =='S');
mostrarLista(cabeza);
}
else
printf("\n Esta persona ya existe");
visualizarNodo(existe);
getchar();
getchar();
break;
case 3: /*Insertar por apellido1*/
introducirDatos(nombre, ape1, ape2, edad);
/*comprobamos si existe la persona*/
existe = buscarPersona(cabeza, ape1);
if(!existe)
{
do
{
insertarPorApellido1(&cabeza, nombre, ape1, ape2, edad); printf("\n\n¿Desea introducir otra persona? (S/N): ");
scanf("%c", &resp);
getchar();
}while(resp == 's' || resp =='S');
mostrarLista(cabeza);
getchar();
getchar();
}
else
printf("\n Esta persona ya existe");
visualizarNodo(existe);
getchar();
getchar();
break;
case 4: /*Borrar por apellido1*/
printf("\n Introduzca el apellido a borrar: ");
gets(ape1);
//comprobamos si la persona existe
existe = buscarPersona(cabeza, ape1);
if(existe) //si existe
{
borrarPorApellido1(&cabeza, ape1);
printf("\n Elemento borrado");
getchar();
mostrarLista(cabeza);
}
else
printf("\n Elemento no encontrado\n");
getchar();
getchar();
break;
case 5: /* Visualizar por apellido1 */
printf("Introduzca el apellido de la persona a buscar => ");
gets(ape1);
existe = buscarPersona(cabeza,ape1);
if (!existe){
printf("\nEl apellido no existe\n");
}
else
{ visualizarPorApellido1(cabeza,ape1);
getchar();
getchar();
}
break;
case 6: visualizarCabezaCola(cabeza);
getchar();
break;
case 7: visualizarColaCabeza(cabeza);
getchar();
case 10: printf("Introduzca el nombre del fichero: ");
scanf("%s", fichero);
fflush(stdin);
grabarLista(cabeza, fichero);
break;
} //cierre del switch
}while (opcion); /* opcion != 0 */
}
/************************ Función crear() ***************************/
/*
Propósito..: Crea la lista.
Parámetros.: Puntero cabeza de lista por referencia.
Devuelve...: Nada.
*/
/********************************************************************/
void crearLista(struct lista **cabeza)
{
*cabeza = NULL;
}
void cogerDatosTexto(struct lista **cabeza)
{
FILE *p; //declaro un puntero al fichero
struct lista *actual;
struct lista *aux;
char nombre[15];
char ape1[20];
char ape2[20];
int edad = 0;
if((p=fopen("listas.txt","r")) == NULL) // abro para lectura
{
printf("\n Error al abrir el archivo\n");
exit (1);
}
*cabeza=NULL;
while(fscanf(p,"%s %s %s %d",nombre,ape1,ape2,&edad)!=EOF)
{
//reservamos espacio para el nuevo elemento
actual = nuevoElemento();
strcpy(actual->nombre,nombre);
strcpy(actual->ape1,ape1);
strcpy(actual->ape2,ape2);
actual->edad=edad;
actual->sig = NULL;
if(*cabeza ==NULL)
*cabeza = actual;
else
aux->sig = actual;
fflush(stdin);
aux = actual;
}
fclose(p);
}
void presentaMenu(void)
{
printf("EJEMPLO DE LISTA ENLAZADA\n");
printf("-------------------------\n\n");
printf("1.- Insertar al Principio\n");
printf("2.- Insertar al Final\n");
printf("3.- Insertar por apellido1\n");
printf("4.- Borrar por apellido 1\n");
printf("5.- Visualizar por apellido1 \n");
printf("6.- Visualizar cabeza cola\n");
printf("7.- Visualizar cola cabeza\n");
printf("8.- Liberar Memoria\n");
printf("9.- Liberar Memoria Recursivo\n");
printf("10.- Grabar Lista\n");
printf("0.- TERMINAR.\n\n\n");
}
/******************************Funcion nuevoElemento****************/
/*Funcion que sirve para reservar espacio para un nuevo elemento*/
struct lista* nuevoElemento()
{
struct lista *a;
a = (struct lista*)malloc(sizeof(struct lista));
return a;
}
/************************ Función vacia() ***************************/
/*
Propósito: Comprueba si la lista está vacía.
Parámetros: Puntero cabeza de lista por valor.
Devuelve: 1 si la lista está vacía.
0 si no lo está.
*/
/********************************************************************/
int listaVacia(struct lista *cabeza)
{
if (cabeza==NULL)
return SI; /* verdad */
else
return NO; /* falso */
}
/*Funcion que sirve para insertar los datos al principio de la lista*/
void insertarPrincipio(struct lista **cabeza, char *nombre, char *ape1, char *ape2, int edad)
{
struct lista *nuevo;
/*reservamos espacio para el nuevo elemento*/
nuevo = nuevoElemento();
strcpy(nuevo->nombre, nombre);
strcpy(nuevo->ape1, ape1);
strcpy(nuevo->ape2, ape2);
nuevo->edad = edad;
nuevo->sig = *cabeza;
*cabeza = nuevo;
}
//FUNCION BUSCAR PERSONA
struct lista* buscarPersona(struct lista *cabeza, char *ape1)
{
struct lista *existe;
existe = cabeza;
if (listaVacia(cabeza) == SI)
{
printf("\n La lista esta vacia.\n");
}
//se recorre la lista hasta encontar el elemento o hasta llegar al final
while(existe!=NULL)
{
if(strcmp(existe->ape1, ape1)== 0)
{
return existe;
}
else{
existe= existe->sig;
}
}
return (NULL);
}
//Funcion que sirve para insertar los datos al final de la lista
void insertarFinal(struct lista **cabeza, char *nombre, char *ape1, char *ape2, int edad)
{
struct lista *nuevo = NULL;
struct lista *aux = NULL;
//se reserva espacio para el nuevo elemento
nuevo = nuevoElemento();
strcpy(nuevo->nombre, nombre);
strcpy(nuevo->ape1, ape1);
strcpy(nuevo->ape2, ape2);
nuevo->edad = edad;
nuevo->sig = NULL;
if(listaVacia(*cabeza) == SI) //la lista esta vacia, el nuevo sera la cabeza
*cabeza = nuevo;
else //se localiza el ultimo elemento para enlazarlo al nuevo
{
aux = *cabeza;
while(aux->sig != NULL)
{
aux = aux->sig;
}
aux->sig = nuevo; //cuando recorra la lista aux->sig apunta a nuevo
}
}
void introducirDatos(char *nombre, char *ape1, char *ape2, int edad)
{
printf("\n Introduzca el nombre => ");
gets(nombre);
fflush(stdin);
printf("\nIntroduzca el apellido1 => ");
gets(ape1);
fflush(stdin);
printf("\nIntroduzca el apellido2 => ");
gets(ape2);
fflush(stdin);
printf("\nIntroduzca la edad => ");
scanf("%d",&edad);
fflush(stdin);
}
void mostrarLista(struct lista *cabeza)
{
struct lista *actual;
actual = cabeza;
while(actual!=NULL)
{
printf("%s %s %s %d \n",actual->nombre,actual->ape1,actual->ape2,actual->edad);
actual = actual->sig;
}
printf("\n");
}
void visualizarNodo(struct lista *nodo)
{
printf("\n Nombre.....: %s"
"\n Apellido1......: %s"
"\n Apellido2.....: %s"
"\n Edad.....: %d \n",nodo->nombre,nodo->ape1,nodo->ape2,nodo->edad);
}
//Esta funcion sirve para insertar por orden alfabetico el primer apellido
void insertarPorApellido1(struct lista **cabeza, char *nombre, char *ape1, char *ape2, int edad)
{
struct lista *aux=NULL; //almacena elemento posterior al que se inserta
struct lista *ant =NULL; //almacena elemento anterior al que se inserta
struct lista *nuevo = NULL; //almacena el nuevo elemento
int encontrado = 0;
//Se reserva espacio para el nuevo elemento
nuevo = nuevoElemento();
strcpy(nuevo->nombre, nombre);
strcpy(nuevo->ape1, ape1);
strcpy(nuevo->ape2, ape2);
nuevo->edad = edad;
if(listaVacia(*cabeza) == SI) //comprueba si la lista esta vacia
{
*cabeza = nuevo; //la cabeza será el nuevo elemento
nuevo->sig = NULL;
}
else{
aux = *cabeza;
if(strcmp(aux->ape1, ape1)>0 ) //nuevo elemento se inserta delante de
//la cabeza
{
nuevo->sig=*cabeza; //El siguiente de nuevo será la cabeza
*cabeza=nuevo;
}
else //buscamos la posicion de insercion, se interrumpe cuando se
//encuentra el primer elemento mayor que n o cuando se llega al final de la lista
{
while(aux!=NULL && encontrado == 0) {
if( strcmp( aux->ape1, ape1 ) >=0 ) //hemos encontrado la posicion de insercion
{
encontrado = 1;
break;
}
else //se actualizan los valores de ayx y ant
{
ant=aux;
aux=aux->sig;
}
}
if(aux == NULL){ //el elemento se inserta al final
ant->sig = nuevo;
nuevo->sig = aux;
}
}
}
}
void borrarPorApellido1(struct lista **cabeza, char *ape1)
{
struct lista *ant = NULL; //almacena el elemento anterior al que se borra
struct lista *borrar; //almacena el elemento a borrar
if (listaVacia(*cabeza) == SI)
{
printf("\n La lista esta vacia.\n");
exit (0);
}
else if (strcmp(ape1, (*cabeza)->ape1) == 0 ) //el elemento a borrar es cabeza
{
borrar = *cabeza;
*cabeza = (*cabeza)->sig;
free(borrar); //se libera la antigua cabeza
}
else {
ant = *cabeza;
borrar = (*cabeza) -> sig;
}
while(borrar != NULL)
{
if(!strcmp(ape1, borrar->ape1)) break;
else{ //si son distintos
ant = borrar;
borrar = borrar->sig;
}
}
//el elemento a borrar no es la cabeza
if (borrar != NULL) //Si borrar es distinto de NULL
{
//si el elemento a borrar no es la cabeza
ant->sig = borrar->sig;;
free(borrar);
}
printf("\n\n El apellido ha sido borrado\n");
fflush(stdin);
getchar();
}
//Visualizar por Apellido1
void visualizarPorApellido1(struct lista *cabeza,char *ape1)
{
struct lista *aux = NULL;
aux = cabeza;
while( aux!= NULL )
{
if( strcmp(aux->ape1, ape1)==0 )
{
visualizarNodo(aux);
aux = aux->sig;
}
else {
aux=aux->sig;
}
}
}
void visualizarCabezaCola(struct lista *cabeza)
{
if (listaVacia(cabeza) == SI)
{
printf("\n La lista esta vacia\n");
}
else{
printf("\n Nombre.........: %s", cabeza->nombre);
printf("\n Apellido1......: %s", cabeza->ape1);
printf("\n Apellido2......: %s", cabeza->ape2);
printf("\n Edad...........: %d\n", cabeza->edad);
//visualizaCabezaCola(cabeza->sig);
getchar();
fflush(stdin);
}
}
void visualizarColaCabeza(struct lista *cabeza)
{
if (listaVacia(cabeza) == SI)
{
printf("\n La lista esta vacia\n");
}
else{
visualizarColaCabeza(cabeza->sig);
printf("\n Nombre.........: %s", cabeza-> nombre);
printf("\n Apellido1......: %s", cabeza->ape1);
printf("\n Apellido2......: %s" ,cabeza->ape2);
printf("\n Edad...........: %d\n", cabeza->edad);
getchar();
fflush(stdin);
}
}
//grabar lista
void grabarLista(struct lista *cabeza, char *fichero)
{
FILE *f;
struct lista *actual = cabeza;
if (listaVacia(cabeza) ==SI)
{
printf("\n La lista esta vacia\n");
}
f=fopen(fichero, "wb");
while(actual!=NULL){
fwrite(actual, sizeof(struct lista), 1, f);
actual = actual->sig;
}
fclose(f);
}
/*listas.h*/
/*Declaracion de estructuras y funciones*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#define SI 1
#define NO 0
struct lista
{
char nombre[15];
char ape1[20];
char ape2[20];
int edad;
struct lista *sig;
};
struct lista *nuevo;
void cogerDatosTexto(struct lista **cabeza);
void introducirDatos(char *nombre, char *ape1, char *ape2, int edad);
struct lista* nuevoElemento();
void presentaMenu(void);
void crearLista(struct lista **cabeza);
int listaVacia(struct lista *cabeza);
void insertarPrincipio(struct lista **cabeza, char *nombre, char *ape1, char *ape2, int edad);
void visualizarNodo(struct lista *nodo);
void mostrarLista(struct lista *cabeza);
void insertarFinal(struct lista **cabeza, char *nombre, char *ape1, char *ape2, int edad);
void insertarPorApellido1(struct lista **cabeza, char *nombre, char *ape1, char *ape2, int edad);
void visualizarPorApellido1(struct lista *cabeza,char *ape1);
struct lista* buscarPersona(struct lista *cabeza, char *ape1);
void visualizarCabezaCola(struct lista *cabeza);
void visualizarColaCabeza(struct lista *cabeza);
void liberarMemoria(struct lista **cabeza);
void liberarMemoriaRecursivo(struct lista **cabeza);
void grabarLista(struct lista *cabeza, char *fichero);
void borrarPorApellido1(struct lista **cabeza, char *ape1);