elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [ESTRUCTURA DE DATOS] Listas doblemente ligadas [C++]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [ESTRUCTURA DE DATOS] Listas doblemente ligadas [C++]  (Leído 2,538 veces)
2Fac3R


Desconectado Desconectado

Mensajes: 300


Why be a king when you can be a god


Ver Perfil WWW
[ESTRUCTURA DE DATOS] Listas doblemente ligadas [C++]
« en: 29 Julio 2015, 20:50 pm »

Buenas!

Resulta que he estado estudiando en la universidad las estructuras de datos en C++, y me gustaría compartirles algunos códigos que he estado haciendo en este tiempo, son códigos más que nada de la escuela. He buscado información al respecto en internet, y la mayoria (por no decir todos) están hechos en C (los que he visto en español), utilizan estructuras con struct y no objetos en C++, así que sirve que alimentamos el internet y el foro  ;D .

No les voy a mostrar teoría sobre el tema, eso se los dejo a su búsqueda.

listas.h
Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. #ifndef __LISTAS_H_INCLUDED__
  6. #define __LISTAS_H_INCLUDED__
  7.  
  8. class Nodo{
  9.  
  10. private:
  11.    int dato;
  12.    Nodo *sig;
  13.    Nodo *ant;
  14. public:
  15.    Nodo(void) { sig = ant = NULL; }
  16.  
  17.    Nodo( int x , Nodo* s = NULL , Nodo* a = NULL )
  18.    {
  19.        dato = x;
  20.        sig = s;
  21.        ant = a;
  22.    }
  23.  
  24.    // SETTERS
  25.    void setDato(int x) { dato = x; }
  26.    void setAnt(Nodo *a) { ant = a; }
  27.    void setSig(Nodo *s) { sig = s; }
  28.  
  29.    // GETTERS
  30.    int getDato()  { return dato;}
  31.    Nodo *getAnt() { return ant; }
  32.    Nodo *getSig() { return sig; }
  33.  
  34. };
  35.  
  36. class Lista
  37. {
  38. private:
  39.    Nodo *lista; // ancla
  40. public:
  41.    Lista(void) { Inicializar(); } // CONSTRUCTOR
  42.  
  43.    // METODOS BASICOS
  44.  
  45.    Nodo *Primero() { return lista; }
  46.    Nodo *Siguiente(Nodo *pos) { return pos->getSig(); }
  47.    Nodo *Anterior(Nodo *pos) { return pos->getAnt(); }
  48.  
  49.    Nodo *Ultimo() {
  50.        Nodo *aux = lista;
  51.  
  52.        if ( !Vacia() ) { while ( aux->getSig() ) { aux = aux->getSig(); } }
  53.        return aux;
  54.    }
  55.  
  56.    // METODOS DE LA LISTA
  57.    void Inicializar() { lista = NULL; }
  58.    bool Vacia() { return lista==NULL; }
  59.    void Mostrar();
  60.    void Insertar(int x, Nodo* pos = NULL);
  61. };
  62.  
  63.  
  64. void Lista::Insertar(int x, Nodo* pos)
  65. {
  66.    Nodo* aux;
  67. Nodo* temp_n = new Nodo(x);
  68.  
  69. if ( Vacia() ){
  70. lista = temp_n;
  71.  
  72. }else{
  73. if ( pos == Primero() ){
  74. aux = Primero();
  75. aux->setAnt(temp_n);
  76.  
  77. temp_n->setSig(aux);
  78. lista = temp_n;
  79.  
  80. }else if ( pos == NULL ){
  81.  
  82. aux = Ultimo();
  83. aux->setSig(temp_n);
  84. temp_n->setAnt(aux);
  85.  
  86. }else{
  87. aux = Primero();
  88.  
  89. while ( aux ){
  90. if ( aux == pos ){
  91. Anterior(aux)->setSig( temp_n );
  92.  
  93. temp_n->setAnt( Anterior(aux) );
  94. temp_n->setSig( aux );
  95.  
  96. aux->setAnt( temp_n );
  97.  
  98. }else {
  99.    aux = aux->getSig();
  100.                }
  101. }
  102. }
  103. }
  104. }
  105.  
  106. void Lista::Mostrar()
  107. {
  108.    Nodo* aux;
  109.  
  110.    Primero();
  111.    aux = lista;
  112. if ( !Vacia() ){
  113. while ( aux ){
  114.            cout << aux ->getDato();
  115.            cout << "\n";
  116.            aux = aux ->getSig();
  117. }
  118. }
  119. }
  120.  
  121. #endif
  122.  
  123.  

main.cpp
Código
  1. #include <iostream>
  2. #include "listas.h"
  3.  
  4. using namespace std;
  5.  
  6. int main(void)
  7. {
  8.    Lista numeros; // Mi lista
  9.    char opc; // Opcion del menu
  10.    int n; // dato a insertar
  11.  
  12.    do{
  13.        cout << "\n \n  LISTAS DOBLEMENTE LIGADAS: ";
  14.        cout << "\n *- MENU -* ";
  15.        cout << "\n 1. AGREGAR A LA LISTA . ";
  16.        cout << "\n 2. MOSTRAR LOS DATOS . ";
  17.        cout << "\n 3. SALIR . ";
  18.        cout << "\n         _> ";
  19.        cin >> opc;
  20.  
  21.        switch(opc){
  22.        case '1':
  23.            cout << "\n AGREGANDO DATOS A LA LISTA . ";
  24.            cout << "\n INGRESE EL VALOR NUMERICO . ";
  25.            cout << "\n         _> ";
  26.            cin >> n;
  27.            numeros.Insertar(n);
  28.            cout << " --> < Guardado correctamente > " << endl;
  29.            break;
  30.        case '2':
  31.            if(numeros.Vacia())
  32.            {
  33.                cout << "\n < No hay registros!. > ";
  34.                break;
  35.            }
  36.  
  37.            cout << "\n \n DATOS GUARDADOS EN LA LISTA: \n ";
  38.            numeros.Mostrar();
  39.            break;
  40.        case '3':
  41.            cout << " - < Saliendo!...... >" << endl;
  42.            break;
  43.        default:
  44.            cout << " - < Opcion incorrecta!, intente de nuevo. >" << endl;
  45.            break;
  46.  
  47.        }
  48.  
  49.    }while(opc!='3');
  50.  
  51.    cin.ignore();
  52.    return 0;
  53. }
  54.  
  55.  

Espero que les sea de utilidad, y son bienvenidas sus criticas y/o comentarios  8)
Zalu2!



Buenas!

Hace poco cree un tema sobre un 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
  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!


« Última modificación: 29 Julio 2015, 23:35 pm por Eternal Idol » En línea

Escuela de Hackers & Programación. http://ihackndev.blogspot.com/
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [ESTRUCTURA DE DATOS] Listas doblemente ligadas [C++]
« Respuesta #1 en: 30 Julio 2015, 01:14 am »

Te faltó [ESTRUCTURA DE DATOS] Listas doblemente ligadas [C++] (otro ejemplo) xD


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: [ESTRUCTURA DE DATOS] Listas doblemente ligadas [C++]
« Respuesta #2 en: 30 Julio 2015, 08:49 am »

Te faltó [ESTRUCTURA DE DATOS] Listas doblemente ligadas [C++] (otro ejemplo) xD

En realidad no, lo adjunte a este hilo; como siempre la politica es que si quieren subir codigo (cosa que no aliento, esta mejor en un repositorio de codigo o en un Blog) lo hagan un solo hilo con su nombre.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Estructura de datos. Listas simplemente enlazadas-Flavio josefo
Java
carepapa 0 7,710 Último mensaje 8 Septiembre 2011, 05:16 am
por carepapa
Listas Doblemente Ligadas
Programación C/C++
m@o_614 4 3,700 Último mensaje 16 Enero 2013, 02:32 am
por dooque
¿Cómo cargar datos desde un archivo .txt en listas ligadas/enlazadas?
Programación C/C++
Juancho25 7 14,121 Último mensaje 1 Mayo 2013, 23:00 pm
por Juancho25
varias listas ligadas
Programación C/C++
m@o_614 1 1,657 Último mensaje 4 Diciembre 2013, 01:54 am
por edr89
Lista enlazada simple – listas ligadas [C]
Programación C/C++
DanielPy 3 2,798 Último mensaje 9 Junio 2015, 17:38 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines