sábado, 23 de enero de 2016

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.

// Lista circular en C++
// (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