domingo, 25 de julio de 2010

Lista simplemente enlazada

#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;

}