#include "stdafx.h"
#include "iostream"
#include <conio.h>
using namespace System;
using namespace std;
struct nodo 
{
    int   codigo; // Nuevo
    char *nombre; // Nuevo
    int   nivel; // Nuevo
    nodo *sig; // Nuevo
};
 
nodo *inicial=NULL;
/////////////////////////////////////////////////////
void leer_nodo(nodo *nuevo)
{
    cout<<"Entre codigo del estudiante"<<endl;  // Nuevo
    cin>>nuevo->codigo;                         // Nuevo
    cout<<"Entre nombre del estudiante"<<endl;  // Nuevo
    cin.ignore();                               // Nuevo
    nuevo->nombre=new char[30];                 // Nuevo
    cin.getline(nuevo->nombre,30);              // Nuevo
    cout<<"Entre nivel del estudiante"<<endl;   // Nuevo 
    cin>>nuevo->nivel;                          // Nuevo 
}
 
/////////////////////////////////////////////////////
void crear_lista(nodo *anterior, nodo *nuevo)
{
    if(anterior == NULL)
    {
        nuevo->sig = inicial;
        leer_nodo(nuevo); 
        inicial = nuevo;
    }
    else
    {
        nuevo->sig = anterior->sig;
        anterior->sig = nuevo;
        leer_nodo(nuevo);
    }
}
 
/////////////////////////////////////////////////////
void imprime_nodo(nodo *apun)
{
    cout<<"-----------------------------"<<endl;
    cout<<"El codigo es:     "<<apun->codigo<<endl;
    cout<<"El nombre es:     "<<apun->nombre<<endl;
    cout<<"El nivel  es:     "<<apun->nivel<<endl;
    cout<<"-----------------------------"<<endl;
}
 
/////////////////////////////////////////////////////
void reco_recur(nodo *apun)
{
    if (apun != NULL)
    {
        imprime_nodo(apun);
        reco_recur(apun->sig);
    }
}
 
/////////////////////////////////////////////////////
void borrar_lista(nodo *apun)
{
    nodo *inicial; 
    while(apun != NULL)
    {
        inicial=apun->sig;
        delete apun; 
        apun=inicial;
    }
}
 
/////////////////////////////////////////////////////
nodo *buscar_nodo(nodo *apun,int &codigo)
{
    while(apun != NULL)
    {
        if(apun->codigo==codigo)return apun;
        else apun=apun->sig;
    }
    return NULL;
}
 
////////// INVENTADO ////////////////////////
nodo *eliminar_nodo(nodo *apun,int &codigo)
{
    nodo *aux;
    aux=inicial;
 
    while(aux->sig != apun)aux=aux->sig;
    aux->sig = apun ->sig;
    delete apun;
    return NULL;
}
 
/////////////////////////////////////////////////////
nodo *agregar_nodo(nodo *anterior,nodo *nuevo,int &codigo)
{
    if(codigo == 0)
    {
        //agrega al inicio de la lista
        nuevo->sig=anterior;
        anterior=nuevo;
        leer_nodo(nuevo);
        return anterior;
    }
    else
    {
        //Agrega despues del primero, segundo,..., o último
        //elemento de la lista
        nuevo->sig=anterior->sig;
        anterior->sig=nuevo;
        leer_nodo(nuevo);
        return anterior;
    }
};
 
 /////////////////////////////////////////////////////
void main()
{
    nodo *anterior, *nuevo, *apun; char resp; anterior=NULL;
    cout<<"EMPIEZA A CREAR LA LISTA ORIGINAL"<<endl<<endl;;
    do
    {
        nuevo = new nodo; 
        crear_lista(anterior, nuevo); 
        anterior = nuevo; 
        cout<<endl ;
        cout<<"DESEA CREAR OTRO NODO? (s/n) "<<endl<<endl;;
        cin>>resp; 
    }while(resp != 'n');
 
    //inicio del recorrido de la lista
    cout<<"LA LISTA ORIGINALMENTE CREADA ES : "<<endl;
    apun = inicial;
    reco_recur(apun);
    //inicio de la agregación de nuevos nodos
    cout<<endl ;
    cout<<"INICIO DE LA AGREGACION DE NUEVOS NODOS A LA LISTA ORIGINAL"<<endl;
    int codigo;
    apun=inicial;
    do 
    {
        cout<<endl;
        cout<<"Entre codigo clave (Digite 0 si va agregar a la cabeza de la lista,"<<endl;
        cout<<"en caso contrario digite el codigo del nodo anterior al que va a crear) "<<endl<<endl;
        
        cin>>codigo ; 
        if(codigo==0)
        {
            nuevo =new nodo;
            inicial = agregar_nodo(inicial,nuevo,codigo);
        }
        else
        {
            anterior=inicial;
            anterior = buscar_nodo(anterior,codigo); 
            if(anterior!=NULL)
            {
                nuevo =new nodo;
                anterior = agregar_nodo(anterior,nuevo,codigo);
            }
            else cout<<"El nodo no ha sido encontrado "<<endl;
        }
        cout<<"DESEA AGREGAR OTRO NODO (s/n)"<<endl;
        cin>>resp;
    }while(resp != 'n');
 
    cout<< "LA LISTA COMPLETA ES: "<<endl;
    apun = inicial;
    reco_recur(apun);
 
        //inicio de la agregación de nuevos nodos
    cout<<endl ;
    cout<<"INICIO DE LA ELIMINACION DE NODOS DE LA LISTA ACTUAL"<<endl;
    
    apun=inicial;
    do 
    {
        cout<<endl;
        cout<<"Entre codigo clave (Digite el codigo del estudiante que va a eliminar) "<<endl<<endl;
        
        cin>>codigo ; 
 
        anterior=inicial;
        anterior = buscar_nodo(anterior,codigo); 
 
        if(anterior!=NULL)
        {
            anterior = eliminar_nodo(anterior,codigo);
            if ( anterior==NULL)
            {
                cout<<"El nodo ha sido eliminado existosamente "<<endl;
            }
        }
        else cout<<"El nodo no ha sido encontrado "<<endl;
        
        cout<<"DESEA ELIMINAR OTRO NODO (s/n)"<<endl;
        cin>>resp;
    }while(resp != 'n');
 
    cout<< "LA LISTA COMPLETA ES: "<<endl;
    apun = inicial;
    reco_recur(apun);
 
    borrar_lista(inicial);
}