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

Iniciado por 2Fac3R, Octubre 17, 2014, 03:46:12 PM

Tema anterior - Siguiente tema

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

Octubre 17, 2014, 03:46:12 PM Ultima modificación: Octubre 17, 2014, 03:48:33 PM por 2Fac3R
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: cpp

#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
Código: 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  8)
Zalu2!
Sólo el conocimiento te hace libre.