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

int main()
{
    struct num{ //Se define la estructura.
        int n;
        struct num *sig;
    }*inicio=NULL,*fin=NULL, *rec=NULL, *nodo=NULL;//Se define estructura y las variables a usar.
    int i;
    for(i=0;i<8;i++) //A modo de ejemplo en cada nodo se agregan numeros del 0 al 7
    {
        nodo=(struct num*)malloc(sizeof(struct num)); //Se reserva memmoria para el nodo
        nodo->n=i; //Se le da el dato al nodo
        nodo->sig=NULL; //El elemento siguiente al nodo apunta a NULL
        if(!inicio)
        {
            inicio=nodo; //si no hay lista, el inicio a la lista es el primer nodo.
            fin=nodo; //Final será el inicio.
        }
        else{
            fin->sig=nodo; //El nodo siguiente sera el nodo creado.
            fin=nodo; //El nodo final será el agregado. Notar que de esta forma no es necesario recorrer toda la lista
                      //a medida que se agreguen nodos.
        }
    }
    fin->sig=inicio; //El nodo siguiente al nodo final es el nodo de inicio (lista circular)
    char opcion;
    while(1)
    {
        system("cls"); //Limpia pantalla.
        printf("1.- Iniciar cuenta\n"
               "2.- Salir\n"); //Muestra Menú
        while(opcion=getch(), opcion<'1'||opcion>'3');//Espera a que se teclee entre 1 y 3
        switch(opcion)
        {
            case '1':
            {
                rec=inicio;
                while(1)
                {
                    printf("Cuenta va en: %d\n", rec->n); //Se muestra como va la cuenta
                    if(rec==fin) //Si se lleg%c al final de la lista se pregunta si se quiere continuar el conteo.
                    {
                        printf("Reiniciar el conteo?:(s/n)");
                        while(opcion=getch(), opcion!='s'&&opcion!='n'); //Se espera a que se pulse s o n
                        if(opcion=='n') //Si no se desea lo preguntado se rompe el ciclo.
                            break;
                        else
                            printf("\n"); //Salto de linea...
                    }
                    rec=rec->sig; //Se recorre la lista, al ser circular, si se llega al final, rec->sig apuntara al nodo de inicio
                }
            }break;
            case '2':
                fin->sig=NULL;
                if(inicio)
                     do{
                        rec=inicio->sig; //Se hace apuntar rec al valor siguiente de la lista
                        free(inicio); //Se libera la memoria del nodo
                        inicio=rec; //Ahora lista apunta al valor apuntado por rec
                    }while(rec); //Si se finaliza de usar la memoria, se debe liberar
                system("pause");return 0;
        }
        system("pause");
    }
}
