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