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

int main()
{
    struct naturales{ //Se define la estructura.
        int n;
        struct naturales *sig; //Puntero a la estructura.
    }*lista=NULL, *rec=NULL, *nodo=NULL;

    int pos, ant;
    char opcion;
    while(1)
    {
        system("cls"); //Limpia pantalla.
        printf("1.- Agregar Numero\n"
               "2.- Mostrar lista de Numeros\n"
               "3.- Salir\n"); //Muestra Menú
        while(opcion=getch(), opcion<'1'||opcion>'3');//Espera a que se teclee entre 1 y 3
        switch(opcion)
        {
            case '1':
            {
                nodo=(struct naturales*)malloc(sizeof(struct naturales)); //Se crea nodo.
                if(!nodo) //hay memoria disponible?
                {
                    printf("No hay memoria disponible.\n");
                    break;
                }
                printf("Ingrese n%cmero a agregar: ", 163);
                scanf("%d", &nodo->n);
                nodo->sig=NULL;  //Como se agrega nodo al final de la lista, siempre el elemento siguiente del nuevo nodo apunta a NULL
                if(!lista) //Si no hay lista se crea.
                    lista=nodo; //Siempre la primera dirección de la lista se debe tener, pues sino no se tendría acceso a estos elementos
                else{
                    rec=lista; //Si hay lista, se hace apuntar rec hacia el inicio de la lista.
                    pos=0; //variable tener referencia de las posiciones de los nodos, en este caso 0 valor inicial.
                    while(rec) //Se recorre lista hasta encontrar un valor mayor al del dato del nuevo nodo.
                    {
                        if(rec->n > nodo->n)
                            break;
                        rec=rec->sig;
                        pos++; //Se le suma 1 a la posicion.
                    }
                    rec=lista;
                    ant=0;  //Variable para tener una referencia de cual es la posicion anterior al nodo encontrado antes.
                    while(rec)
                    {
                        if(pos-1<0) //Si estamos al inicio de la lista.
                        {
                            nodo->sig=lista; //La direccion siguient del nodo es la del inciio de la lista
                            lista=nodo; //Y el inicio de la lista ahora es el nuevo nodo.
                            break; //Se rompe ciclo.
                        }
                        if(ant==pos-1)
                        {
                            nodo->sig=rec->sig;
                            rec->sig=nodo;
                            break;

                        }
                        ant++;
                        rec=rec->sig;
                    }
                }

            }break;
            case '2':
            {
                if(!lista) //Tiene que haber lista para mostrarse
                {
                    printf("No hay lista.\n");
                    break;
                }
                rec=lista; //Se hace apuntar rec al primer elemento de la lista.
                while(rec) //Mientras hayan datos que mostrar se imprimen en pantalla.
                {
                    printf("%d\n", rec->n);
                    rec=rec->sig;
                }
            }break;
            case '3':
            {
                if(lista) //Si es que hay lista, se debe borrar.
                    do{
                        rec=lista->sig; //Se hace apuntar rec al valor siguiente de la lista
                        free(lista); //Se libera la memoria del nodo
                        lista=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; //Se termina el programa.
            }
        }
        system("pause");
    }
}
