• [ESTRUCTURA DE DATOS] Listas doblemente ligadas [C++]

 #475517  por 2Fac3R
 28 Jul 2015, 22:43
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 .

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

listas.h
#include <iostream>
 
using namespace std;
 
#ifndef __LISTAS_H_INCLUDED__
#define __LISTAS_H_INCLUDED__
 
class Nodo{
 
private:
    int dato;
    Nodo *sig;
    Nodo *ant;
public:
    Nodo(void) { sig = ant = NULL; }
 
    Nodo( int x , Nodo* s = NULL , Nodo* a = NULL )
    {
        dato = x;
        sig = s;
        ant = a;
    }
 
    // SETTERS
    void setDato(int x) { dato = x; }
    void setAnt(Nodo *a) { ant = a; }
    void setSig(Nodo *s) { sig = s; }
 
    // GETTERS
    int getDato()  { return dato;}
    Nodo *getAnt() { return ant; }
    Nodo *getSig() { return sig; }
 
};
 
class Lista
{
private:
    Nodo *lista; // ancla
public:
    Lista(void) { Inicializar(); } // CONSTRUCTOR
 
    // METODOS BASICOS
 
    Nodo *Primero() { return lista; }
    Nodo *Siguiente(Nodo *pos) { return pos->getSig(); }
    Nodo *Anterior(Nodo *pos) { return pos->getAnt(); }
 
    Nodo *Ultimo() {
        Nodo *aux = lista;
 
        if ( !Vacia() ) { while ( aux->getSig() ) { aux = aux->getSig(); } }
        return aux;
    }
 
    // METODOS DE LA LISTA
    void Inicializar() { lista = NULL; }
    bool Vacia() { return lista==NULL; }
    void Mostrar();
    void Insertar(int x, Nodo* pos = NULL);
};
 
 
void Lista::Insertar(int x, Nodo* pos)
{
    Nodo* aux;
        Nodo* temp_n = new Nodo(x);
 
        if ( Vacia() ){
                lista = temp_n;
 
        }else{
                if ( pos == Primero() ){
                        aux = Primero();
                        aux->setAnt(temp_n);
 
                        temp_n->setSig(aux);
                        lista = temp_n;
 
                }else if ( pos == NULL ){
 
                        aux = Ultimo();
                        aux->setSig(temp_n);
                        temp_n->setAnt(aux);
 
                }else{
                        aux = Primero();
 
                        while ( aux ){
                                if ( aux == pos ){
                                        Anterior(aux)->setSig( temp_n );
 
                                        temp_n->setAnt( Anterior(aux) );
                                        temp_n->setSig( aux );
 
                                        aux->setAnt( temp_n );
 
                                }else {
                                    aux = aux->getSig();
                }
                        }
                }
        }
}
 
void Lista::Mostrar()
{
    Nodo* aux;
 
    Primero();
    aux = lista;
        if ( !Vacia() ){
                while ( aux ){
            cout << aux ->getDato();
            cout << "\n";
            aux = aux ->getSig();
                }
        }
}
 
#endif
main.cpp
#include <iostream>
#include "listas.h"
 
using namespace std;
 
int main(void)
{
    Lista numeros; // Mi lista
    char opc; // Opcion del menu
    int n; // dato a insertar
 
    do{
        cout << "\n \n  LISTAS DOBLEMENTE LIGADAS: ";
        cout << "\n *- MENU -* ";
        cout << "\n 1. AGREGAR A LA LISTA . ";
        cout << "\n 2. MOSTRAR LOS DATOS . ";
        cout << "\n 3. SALIR . ";
        cout << "\n         _> ";
        cin >> opc;
 
        switch(opc){
        case '1':
            cout << "\n AGREGANDO DATOS A LA LISTA . ";
            cout << "\n INGRESE EL VALOR NUMERICO . ";
            cout << "\n         _> ";
            cin >> n;
            numeros.Insertar(n);
            cout << " --> < Guardado correctamente > " << endl;
            break;
        case '2':
            if(numeros.Vacia())
            {
                cout << "\n < No hay registros!. > ";
                break;
            }
 
            cout << "\n \n DATOS GUARDADOS EN LA LISTA: \n ";
            numeros.Mostrar();
            break;
        case '3':
            cout << " - < Saliendo!...... >" << endl;
            break;
        default:
            cout << " - < Opcion incorrecta!, intente de nuevo. >" << endl;
            break;
 
        }
 
    }while(opc!='3');
 
    cin.ignore();
    return 0;
}

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