comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

[ESTRUCTURA DE DATOS] Listas doblemente ligadas [C++] (otro ejemplo)

  • 1 Respuestas
  • 1773 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado 2Fac3R

  • *
  • Underc0der
  • Mensajes: 232
  • Actividad:
    5%
  • Reputación 0
  • Why be a king, when you can be a god
    • Ver Perfil
    • Escuela de Hackers & Programación
  • Skype: rockeg_18
  • Twitter: @2Fac3R
« en: Octubre 17, 2014, 03:58:47 pm »
Buenas!

Hace poco cree un tema sobre un You are not allowed to view links. Register or Login en C++, pues quería compartirles otro código que no lo hice para la escuela y por lo tanto me dió más tiempo de currarmelo más y agregarle más métodos  ;D .

Código: C++
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. #define ASCENDENTE 1
  5. #define DESCENDENTE 0
  6.  
  7. class nodo
  8. {
  9. private:
  10.     int valor;
  11.     nodo *siguiente;
  12.     nodo *anterior;
  13.  
  14.     friend class lista;
  15.  
  16. public:
  17.     nodo(int v, nodo *sig = NULL, nodo *ant = NULL) // CONSTRUCTOR
  18.     {
  19.         valor = v;
  20.         siguiente = sig;
  21.         anterior = ant;
  22.     }
  23.     // SETTERS
  24.     void setAnterior(nodo *ant) { anterior = ant; }
  25.     void setSiguiente(nodo *sig) { siguiente = sig; }
  26.  
  27.     // GETTERS
  28.     int getValor() { return valor; }
  29.     nodo *getSiguiente() { return siguiente; }
  30.     nodo *getAnterior() { return anterior; }
  31. };
  32.  
  33.  
  34. class lista
  35. {
  36. private:
  37.     nodo  *plista; // ANCLA
  38.  
  39. public:
  40.     lista(){ plista = NULL; } // CONSTRUCTOR
  41.  
  42.     ~lista(); // DESTRUCTOR
  43.  
  44.     // METODOS DE LA LISTA
  45.     void Insertar(int v);
  46.     void Borrar(int v);
  47.     bool ListaVacia() { return plista == NULL; }
  48.     void Mostrar(int);
  49.  
  50.     // METODOS DE POSICION
  51.     void Siguiente() { if(plista) plista = plista->getSiguiente(); }
  52.     void Anterior() { if(plista) plista = plista->getAnterior(); }
  53.     void Primero() {  while(plista && plista->getAnterior()) plista = plista->getAnterior(); }
  54.     void Ultimo() {  while(plista && plista->getSiguiente()) plista = plista->getSiguiente(); }
  55.     int ValorActual() { return plista->valor; }
  56.  
  57. };
  58.  
  59. lista::~lista() // VACIAMOS LA LISTA
  60. {
  61.    nodo *aux;
  62.  
  63.    Primero();
  64.    while(plista) {
  65.       aux = plista;
  66.       plista = plista->getSiguiente();
  67.       delete aux;
  68.    }
  69. }
  70.  
  71. void lista::Insertar(int v)
  72. {
  73.     nodo *nuevo;
  74.  
  75.     Primero();
  76.     // Si la lista está vacía
  77.     if(ListaVacia() || plista->getValor() > v)
  78.     {
  79.       nuevo = new nodo(v, plista);
  80.       if(!plista) plista = nuevo;
  81.       else plista->setAnterior(nuevo);
  82.     }
  83.     else
  84.     {
  85.       while(plista->getSiguiente() && plista->getSiguiente()->getValor() <= v) Siguiente();
  86.       // Creamos un nuevo nodo después del nodo actual
  87.       nuevo = new nodo(v, plista->getSiguiente(), plista);
  88.       plista->setSiguiente(nuevo);
  89.       if(nuevo->getSiguiente()) nuevo->getSiguiente()->setAnterior(nuevo);
  90.     }
  91. }
  92.  
  93. void lista::Borrar(int v)
  94. {
  95.    nodo *nodo;
  96.  
  97.    nodo = plista;
  98.    while(nodo && nodo->getValor() < v) nodo = nodo->getSiguiente();
  99.    while(nodo && nodo->getValor() > v) nodo = nodo->getAnterior();
  100.  
  101.    if(!nodo || nodo->getValor() != v) return;
  102.    // Borrar el nodo
  103.  
  104.    if(nodo->getAnterior()) // no es el primer elemento
  105.       nodo->getAnterior()->setSiguiente(nodo->getSiguiente());
  106.    if(nodo->getSiguiente()) // no el el último nodo
  107.       nodo->getSiguiente()->setAnterior(nodo->getAnterior());
  108.    delete nodo;
  109. }
  110.  
  111. void lista::Mostrar(int orden)
  112. {
  113.     nodo *nodo;
  114.     if(orden == ASCENDENTE)
  115.     {
  116.         Primero();
  117.         nodo = plista;
  118.         while(nodo)
  119.         {
  120.         cout << nodo->getValor() << "-> ";
  121.         nodo = nodo->getSiguiente();
  122.         }
  123.     }
  124.     else
  125.     {
  126.         Ultimo();
  127.         nodo = plista;
  128.         while(nodo)
  129.         {
  130.             cout << nodo->getValor() << "-> ";
  131.             nodo = nodo->getAnterior();
  132.         }
  133.     }
  134.     cout << endl;
  135. }
  136.  
  137. int main(void) {
  138.     lista Lista;
  139.  
  140.     Lista.Insertar(20);
  141.     Lista.Insertar(10);
  142.     Lista.Insertar(40);
  143.     Lista.Insertar(30);
  144.  
  145.     Lista.Mostrar(ASCENDENTE);
  146.     Lista.Mostrar(DESCENDENTE);
  147.  
  148.     Lista.Primero();
  149.     cout << "Primero: " << Lista.ValorActual() << endl;
  150.  
  151.     Lista.Ultimo();
  152.     cout << "Ultimo: " << Lista.ValorActual() << endl;
  153.  
  154.     Lista.Borrar(10);
  155.     Lista.Borrar(15);
  156.     Lista.Borrar(45);
  157.     Lista.Borrar(40);
  158.  
  159.     Lista.Mostrar(ASCENDENTE);
  160.     Lista.Mostrar(DESCENDENTE);
  161.  
  162.     return 0;
  163. }
  164.  

Espero que les guste y les sirva, cualquier duda y/o comentario me lo hacen saber  ::).

Zalu2!
Escuela de Hackers & Programación.
You are not allowed to view links. Register or Login

Conectado ANTRAX

  • *
  • Administrator
  • Mensajes: 5331
  • Actividad:
    58.33%
  • Reputación 30
  • ANTRAX
    • Ver Perfil
    • Underc0de
    • Email
  • Skype: underc0de.org
  • Twitter: @Underc0de
« Respuesta #1 en: Octubre 17, 2014, 04:01:51 pm »
Buenisimo bro!!
Justamente estaba trabajando en un proyecto en el que debo implementar algo similar a esto. Me viene de primera!!
Muchisimas gracias!!

Saludos!
ANTRAX


 

¿Te gustó el post? COMPARTILO!



[Libro] Programacion en C, metodología, algoritmos y estructuras datos

Iniciado por Stiuvert

Respuestas: 3
Vistas: 4013
Último mensaje Diciembre 11, 2016, 12:41:12 pm
por sanosuken
Script de C / Biblioteca / {Estructura}

Iniciado por Kr3L

Respuestas: 0
Vistas: 1411
Último mensaje Junio 22, 2016, 03:29:09 am
por Kr3L
Estructura de Datos [Cola Circular][C]

Iniciado por Olger346

Respuestas: 1
Vistas: 5721
Último mensaje Abril 06, 2017, 10:28:13 am
por sitoftonic
[ESTRUCTURA DE DATOS] Árbol binario [C++]

Iniciado por 2Fac3R

Respuestas: 0
Vistas: 1955
Último mensaje Octubre 17, 2014, 04:06:25 pm
por 2Fac3R
[ESTRUCTURA DE DATOS] Listas doblemente ligadas [C++]

Iniciado por 2Fac3R

Respuestas: 1
Vistas: 5344
Último mensaje Octubre 17, 2014, 04:04:50 pm
por Khala