LISTA CIRCULAR
Código:
El siguiente cogido, lee la lista, luego la muestra, borra los valores 10000 y -3500, luego presenta la lista, y después agrega los valores 2500, 25000 y -500, despues muestra la lista de nuevo, pero en este caso se puede ver claramente donde se insertaron los datos ya que quedan justo entre el que era el ultimo valor y el primero.
// (C) Agosto 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)
{
valor = v;
siguiente = sig;
}
private:
int valor;
nodo *siguiente;
friend class lista;
};
typedef nodo *pnodo;
class lista {
public:
lista() { actual = NULL; }
~lista();
void Insertar(int v);
void Borrar(int v);
bool ListaVacia() { return actual == NULL; }
void Mostrar();
void Siguiente();
bool Actual() { return actual != NULL; }
int ValorActual() { return actual->valor; }
private:
pnodo actual;
};
lista::~lista()
{
pnodo nodo;
// Mientras la lista tenga más de un nodo
while(actual->siguiente != actual) {
// Borrar el nodo siguiente al apuntado por lista
nodo = actual->siguiente;
actual->siguiente = nodo->siguiente;
delete nodo;
}
// Y borrar el último nodo
delete actual;
actual = NULL;
}
void lista::Insertar(int v)
{
pnodo Nodo;
// Creamos un nodo para el nuevo valor a insertar
Nodo = new nodo(v);
// Si la lista está vacía, la lista será el nuevo nodo
// Si no lo está, insertamos el nuevo nodo a continuación del apuntado
// por lista
if(actual == NULL) actual = Nodo;
else Nodo->siguiente = actual->siguiente;
// En cualquier caso, cerramos la lista circular
actual->siguiente = Nodo;
}
void lista::Borrar(int v)
{
pnodo nodo;
nodo = actual;
// Hacer que lista apunte al nodo anterior al de valor v
do {
if(actual->siguiente->valor != v) actual = actual->siguiente;
} while(actual->siguiente->valor != v && actual != nodo);
// Si existe un nodo con el valor v:
if(actual->siguiente->valor == v) {
// Y si la lista sólo tiene un nodo
if(actual == actual->siguiente) {
// Borrar toda la lista
delete actual;
actual = NULL;
}
else {
// Si la lista tiene más de un nodo, borrar el nodo de valor v
nodo = actual->siguiente;
actual->siguiente = nodo->siguiente;
delete nodo;
}
}
}
void lista::Mostrar()
{
pnodo nodo = actual;
do {
cout << nodo->valor << "-> ";
nodo = nodo->siguiente;
} while(nodo != actual);
cout << endl;
}
void lista::Siguiente()
{
if(actual) actual = actual->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();
cout<<"\n";
cout << "Lista de elementos:" << endl;
Lista.Borrar(10000);
Lista.Borrar(-3500);
Lista.Mostrar();
cout<<"\n";
cout << "Lista de elementos:" << endl;
Lista.Insertar(2500);
Lista.Insertar(25000);
Lista.Insertar(-500);
Lista.Mostrar();
cout<<"\n";
cin.get();
return 0;
}
No hay comentarios:
Publicar un comentario