LISTA_CIRCULAR.c



/* EJEMPLO DE LISTAS CIRCULARES CON DOBLE LIGA */

#include <stdio.h>
#include <stdlib.h>

struct Nodo { int Dato; struct Nodo *Sig, *Ant; };
struct Nodo *Inicio;			/* Apuntador a la lista circular */

struct Nodo *CreaNodo(int Dato)
{
	struct Nodo *Nuevo = (struct Nodo *)malloc(sizeof(struct Nodo));
	Nuevo->Dato = Dato;
	Nuevo->Sig = Nuevo->Ant = NULL;
	return Nuevo;
}

void Guardar( )
{
	struct Nodo *Nuevo;
	int Dato = 0;
	printf("Introduce el dato a guardar: "); scanf("%d", &Dato);

	Nuevo = CreaNodo(Dato);

	if ( !Inicio ) 			/* eres el primero? */
	{
		Inicio = Nuevo;
		Inicio->Ant = Inicio->Sig = Inicio;
	}
	else if (Inicio->Sig == Inicio)			/* Este es el segundo */
	{
		Inicio->Ant = Inicio->Sig = Nuevo;
		Nuevo->Sig = Nuevo->Ant = Inicio;
	}
	else						/* hay mas de dos */
	{
		Nuevo->Sig = Inicio->Sig;
		Nuevo->Ant = Inicio;
		Inicio->Sig->Ant = Nuevo;
		Inicio->Sig = Nuevo;
	}
}

void Muestra( )
{
	int nada = 0;
	struct Nodo *AUX = Inicio;
	while ( AUX )
	{
		printf("%d\n", AUX->Dato);
		scanf("%d", &nada);
		AUX = AUX->Sig;
	}
}

void Ejecuta(int Dato)
{
	if ( !Dato ) exit(1);
	if ( Dato == 1 ) Guardar(Dato);
	if ( Dato == 2 ) Muestra( );
/*	if ( Dato == 3 ) Borrar(Dato);
*/
}

void main()
{
	int Dato = 0;
	while ( 1 )
	{
		printf("[1] guardar dato\n[2] Muestre la lista\n[3] Borrar un dato\n[0] Salir\n");
		printf("Introduce una opciOn: "); scanf("%d", &Dato);
		Ejecuta(Dato);
	}
}