#include <cstdlib>
#include <iostream>
using namespace std;
typedef int T;
class Nodo{private:
T dato;
Nodo *sigNodo;
public:
Nodo();
Nodo(T);
void setDato(T a){dato = a;}
void setSigNodo(Nodo *s){sigNodo = s;}
T getDato(){return dato;}
Nodo *getSigNodo(){return sigNodo;}
void imprimir();
void eliminar();
};
Nodo::Nodo()
{
dato = 0;
sigNodo = NULL;
}
Nodo::Nodo(T a)
{
dato = a;
sigNodo = NULL;
}
void Nodo::imprimir()
{
cout<<getDato()<<"->";
}
void Nodo::eliminar()
{
if(getSigNodo())
getSigNodo()->eliminar();
delete this;
}
class Lista{private:
Nodo *cab;
public:
int num_nodos;
Lista();
bool esVacia();
void imprimir();
void agregarPrincipio(T);
void agregarFinal(T);
void del_dato(T);
void del_pos(int);
void del_prim();
void del_ulti();
void del_all();
void invertir();
void ordenar();
};
Lista::Lista()
{
cab = NULL;
num_nodos = 0;
}
bool Lista::esVacia()
{
return (!cab);
}
void Lista::imprimir()
{
Nodo *aux = cab;
if(!cab){
cout << "La lista esta vacia " << endl;
}
else{
while(aux){
aux->imprimir();
if(!aux->getSigNodo())
cout << "NULL";
aux = aux->getSigNodo();
}
}
cout << endl << endl;
}
void Lista::agregarPrincipio(T a)
{
Nodo *aux = cab;
Nodo *nuevo = new Nodo (a);
if(!cab){
cab = nuevo;
}
else{
nuevo->setSigNodo(cab);
cab = nuevo;
while(aux){
aux = aux->getSigNodo();
}
}
num_nodos++;
}
void Lista::agregarFinal(T a)
{
Nodo *aux = cab;
Nodo *nuevo = new Nodo (a);
if(!cab){
cab = nuevo;
}
else{
while(aux->getSigNodo() !=NULL){
aux = aux->getSigNodo();
}
aux->setSigNodo(nuevo);
}
num_nodos++;
}
void Lista::del_pos(int pos)
{
Nodo *aux = cab;
Nodo *aux1 = aux->getSigNodo();
if(pos < 1 || pos > num_nodos){
cout << "Fuera de rango " << endl;
} else if(pos==1){
cab = aux->getSigNodo();
} else{
for(int i=2;i<=pos;i++){
if(i==pos){
Nodo *aux2 = aux1;
aux->setSigNodo(aux1->getSigNodo());
//delete aux2;
num_nodos--;
}
aux = aux->getSigNodo();
aux1 = aux1->getSigNodo();
}
}
}
void Lista::del_prim()
{
Nodo *aux = cab;
if(cab)
{
cab = aux->getSigNodo();
}
}
void Lista::del_dato(T dato_)
{
Nodo *temp = cab;
Nodo *temp1 = cab->getSigNodo();
int cont=0;
if(cab->getDato() == dato_){
cab = temp->getSigNodo();
} else {
while(temp1){
if(temp1->getDato() == dato_){
Nodo *aux = temp1;
temp->setSigNodo(temp1->getSigNodo());
//delete aux;
cont++;
num_nodos--;
}
temp = temp->getSigNodo();
temp1 = temp1->getSigNodo();
}
}
if(cont == 0){
cout << "No existe el dato " << endl;
}
}
void Lista::del_all()
{
cab->eliminar();
cab = 0;
}
void Lista::invertir()
{
Nodo *aux = cab;
Nodo *prev = NULL;
Nodo *next = NULL;
while(aux){
next = aux->getSigNodo();
aux->setSigNodo(prev);
prev = aux;
aux = next;
}
cab = prev;
}
void Lista::ordenar()
{
T aux2;
Nodo *aux = cab;
Nodo *temp = aux;
while(aux){
temp=aux;
while(temp->getSigNodo()){
temp=temp->getSigNodo();
if((aux->getDato())>(temp->getDato())){
aux2=aux->getDato();
aux->setDato(temp->getDato());
temp->setDato(aux2);
}
}
aux=aux->getSigNodo();
}
}
int main()
{
Lista *l = new Lista();
cout<<endl<<l->esVacia();
l->imprimir();
l->agregarPrincipio(5);
l->agregarFinal(25);
l->agregarFinal(3);
l->agregarPrincipio(4);
l->imprimir();
l->ordenar();
l->imprimir();
cout<<endl<<l->esVacia();
int a;
cin>>a;
}