#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;
};
class lista // Nueva clase - Lista
{
private:
nodo *inicial;
public:
lista(); // La lista - Publico
~lista(); // ~La lista - Publico
void crear_lista(nodo *anterior, nodo *nuevo); // Funcion "crear_lista" - Publico
void leer_nodo(nodo *nuevo); // Funcion - Leer nodo
void imprime_nodo(nodo *apun);
void reco_recur(); // Cambio - Nueva Funcion Recursiva
void reco_recur(nodo *apun); // Cambio - Nueva Funcion Recursiva
};
lista::lista()
{
inicial=NULL; // Inicializa NULL
}
/////////////////////////////////////////////////////
void lista::leer_nodo(nodo *nuevo) // Método - Leer nodo
{
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;
}
/////////////////////////////////////////////////////
void lista::crear_lista(nodo *anterior, nodo *nuevo)
{
if(anterior == NULL)
{
nuevo->sig = inicial;
leer_nodo(nuevo); // Lee 1ra vez
inicial = nuevo;
}
else
{
nuevo->sig = anterior->sig;
anterior->sig = nuevo;
leer_nodo(nuevo); // Lee N vez
}
}
/////////////////////////////////////////////////////
void lista::imprime_nodo(nodo *apun) // Cambio
{
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 lista::reco_recur() // Cambio - Nueva Funcion Recursiva - Se crea debido a conflictos con la recursividad en la forma Estructural
{
reco_recur(inicial);
}
/////////////////////////////////////////////////////
void lista::reco_recur(nodo *apun) // Cambio - Nueva Funcion Recursiva
{
if (apun != NULL)
{
imprime_nodo(apun); // Imprime valor nodo
reco_recur(apun->sig); // Cambio - Nueva Funcion Recursiva
}
}
/////////////////////////////////////////////////////
nodo *buscar_nodo(nodo *apun,int &codigo)
{
while(apun != NULL)
{
if(apun->codigo==codigo)return apun;
else apun=apun->sig;
}
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;
}
};
lista::~lista() // Metodo "borrar_lista" es el desctructivo- Publico
{
nodo *apun = inicial; // " * " es para crear nodo
while(apun != NULL)
{
cout << "borro" << endl;
inicial = apun->sig;
delete apun;
apun = inicial;
}
}
int main()
{
nodo *anterior, *nuevo, *apun; char resp; anterior=NULL;
lista objlista; // Dar memoria a la lista
cout<<"EMPIEZA A CREAR LA LISTA ORIGINAL"<<endl<<endl;;
do
{
nuevo = new nodo;
objlista.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;
objlista.reco_recur();
//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;
objlista.reco_recur();
objlista.~lista();
return 0;
}