LISTA DOBLE ENLAZADA
Código:
El siguiente código lee una lista, la organiza ascendente mente y descendente mente, la muestra, luego elimina los valores 10000, 5000, 4500 y -4000, de nuevo ordena la lista y la presenta de forma ascendente y descendente.
Por ultimo inserta el valor 9000 y de nuevo ordena la lista y la presenta ascendente y descendente mente y la muestra
// Cola doblemente enlazada en C++
// (C) Septiembre 2001, Salvador Pozo
// C con Clase: http://c.conclase.net
#include <iostream>
using namespace std;
#define ASCENDENTE 1
#define DESCENDENTE 0
class nodo {
public:
nodo(int v, nodo *sig = NULL, nodo *ant = NULL) :
valor(v), siguiente(sig), anterior(ant) {}
private:
int valor;
nodo *siguiente;
nodo *anterior;
friend class lista;
};
typedef nodo *pnodo;
class lista {
public:
lista() : plista(NULL) {}
~lista();
void Insertar(int v);
void Borrar(int v);
bool ListaVacia() { return plista == NULL; }
void Mostrar(int);
void Siguiente();
void Anterior();
void Primero();
void Ultimo();
bool Actual() { return plista != NULL; }
int ValorActual() { return plista->valor; }
private:
pnodo plista;
};
lista::~lista()
{
pnodo aux;
Primero();
while(plista) {
aux = plista;
plista = plista->siguiente;
delete aux;
}
}
void lista::Insertar(int v)
{
pnodo nuevo;
Primero();
// Si la lista está vacía
if(ListaVacia() || plista->valor > v) {
// Asignamos a lista un nuevo nodo de valor v y
// cuyo siguiente elemento es la lista actual
nuevo = new nodo(v, plista);
if(!plista) plista = nuevo;
else plista->anterior = nuevo;
}
else {
// Buscar el nodo de valor menor a v
// Avanzamos hasta el último elemento o hasta que el siguiente tenga
// un valor mayor que v
while(plista->siguiente && plista->siguiente->valor <= v) Siguiente();
// Creamos un nuevo nodo después del nodo actual
nuevo = new nodo(v, plista->siguiente, plista);
plista->siguiente = nuevo;
if(nuevo->siguiente) nuevo->siguiente->anterior = nuevo;
}
}
void lista::Borrar(int v)
{
pnodo nodo;
nodo = plista;
while(nodo && nodo->valor < v) nodo = nodo->siguiente;
while(nodo && nodo->valor > v) nodo = nodo->anterior;
if(!nodo || nodo->valor != v) return;
// Borrar el nodo
if(nodo->anterior) // no es el primer elemento
nodo->anterior->siguiente = nodo->siguiente;
if(nodo->siguiente) // no el el último nodo
nodo->siguiente->anterior = nodo->anterior;
delete nodo;
}
void lista::Mostrar(int orden)
{
pnodo nodo;
if(orden == ASCENDENTE) {
Primero();
nodo = plista;
while(nodo) {
cout << nodo->valor << "-> ";
nodo = nodo->siguiente;
}
}
else {
Ultimo();
nodo = plista;
while(nodo) {
cout << nodo->valor << "-> ";
nodo = nodo->anterior;
}
}
cout << endl;
}
void lista::Siguiente()
{
if(plista) plista = plista->siguiente;
}
void lista::Anterior()
{
if(plista) plista = plista->anterior;
}
void lista::Primero()
{
while(plista && plista->anterior) plista = plista->anterior;
}
void lista::Ultimo()
{
while(plista && plista->siguiente) plista = plista->siguiente;
}
int main()
{
lista Lista;
Lista.Insertar(500);
Lista.Insertar(1000);
Lista.Insertar(-4000);
Lista.Insertar(3000);
Lista.Insertar(5000);
Lista.Insertar(10000);
Lista.Insertar(4000);
Lista.Insertar(-3500);
Lista.Insertar(4500);
Lista.Insertar(2000);
Lista.Mostrar(ASCENDENTE);
Lista.Mostrar(DESCENDENTE);
cout<<"\n";
Lista.Primero();
cout << "Primero: " << Lista.ValorActual() << endl;
Lista.Ultimo();
cout << "Ultimo: " << Lista.ValorActual() << endl;
cout<<"\n";
Lista.Borrar(10000);
Lista.Borrar(5000);
Lista.Borrar(4500);
Lista.Borrar(-4000);
Lista.Mostrar(ASCENDENTE);
Lista.Mostrar(DESCENDENTE);
cout<<"\n";
Lista.Insertar (9000);
Lista.Mostrar(ASCENDENTE);
Lista.Mostrar(DESCENDENTE);
cin.get();
return 0;
}
No hay comentarios:
Publicar un comentario