Lista Dinámica en C++ (Parte I)

Lista Dinámica en C++ (Parte I)





A mí en lo personal me costó mucho trabajo entender el concepto de programación orientada a objetos cuando la aprendí en su momento, es por eso que hoy les enseñaré a hacer una lista dinámica de la manera más sencilla y explícita posible.

Lo primero que haremos será crear nuestro objeto con sus respectivos get y set para obtener y fijar sus atributos.


class Mascota
{
    private:
        string nombre;
    public:
        Mascota *sig;
        void setNombre(string);
        string getNombre();
}

void Mascota::setNombre(string auxNombre)
{
    nombre = auxNombre;
}

string Mascota::getNombre()
{
    return nombre;
}

typedef Mascota *pMascota;

En este caso estamos utilizando un objeto llamado "Mascota", en el cual para no complicarnos mucho hoy sólo tiene un atributo, el cual es el nombre de la mascota, el método "setNombre()" pide un parámetro, el cual es el nombre (al que nuestro atributo "nombre" de la clase será igualado).

Nuestro segundo método; "getNombre()" es de tipo string, esto quiere decir que forzosamente nos debe regresar un valor de tipo string, en este caso es el nombre el que nos retorna, más adelante veremos cómo se utilizan estos dos métodos en el programa.

También estamos declarando un puntero de tipo "Mascota", este será utilizado más adelante para señalar a nuestro siguiente objeto.

La última línea sirve para que en el programa podamos utilizar el "pMascota" para declarar punteros de tipo Mascota, en lugar de poner "Mascota *puntero" cada que necesitemos crear uno nuevo.


class Lista
{
    public:
        pMascota inicio, fin;
        void Inicializar();
        bool Vacia();
        void InsertarFinal(string);
        void Mostrar();
        void Buscar(string);
        void Eliminar(string);
}

Creamos nuestra clase "Lista" que a diferencia de la otra que son sólo nodos que contienen nombres de mascotas, esta almacena todo el conjunto de esos nodos de manera ordenada, donde tendremos un nodo "inicio" y un nodo "fin". También tendremos nuestros respectivos métodos que explicaré en seguida.


void Lista::Inicializar()
{
    inicio = NULL;
    fin = NULL;
}

Nuestro primer método es bastante simple, sólo vamos a inicializar nuestros punteros que indicarán el inicio y el fin de nuestra lista como "NULL", para que no nos guarden "basura" y al final sean un desastre.


bool Lista::Vacia()
{
    if(inicio==NULL)
    {
        return true;
    }
    else
    {
        return false;
    }
}

Esta es una función que lo único que hará será decirnos si la lista está o no vacía. Al principio dijimos que tendremos un inicio y un fin, ¿verdad?... siempre que tengamos algún nodo, habrá un inicio y un fin entonces, es simple deducir cuándo está o no vacía, si inicio no apunta a nada o en código si es igual a "NULL", la lista está vacía.



void Lista::InsertarFinal(string auxNombre)
{
    pMascota nueva = new Mascota();
    nueva->setNombre(auxNombre);

    if(Vacia())
    {
        inicio = nuevo;
        fin = nuevo;
        nuevo->sig = NULL;
    }
    else
    {
        fin->sig = nuevo;
        fin = nuevo;
        nuevo->sig = NULL;
    }
}


Esta función ahora sí, va a insertar un nodo al final de la lista (Recuerden que si no tenemos ningún nodo, el único nodo a insertarse será el inicio y el fin de nuestra lista), recibe como parámetro un string que almacenará el nombre de la mascota a insertar.

1.- Creamos un nuevo nodo que almacenará el nuevo objeto de tipo Mascota.

2.- Llamamos a la función que asigna el nombre del objeto Mascota y le pasamos el nombre.

3.- Si la lista está vacía, tal y como ya les dije... el nuevo nodo será nuestro inicio y nuestro fin.

4.- Si no está vacía, entonces el campo que esté después del final, será donde se aloje nuestro nuevo nodo y claro, este será el nuevo fin de la lista.



void Lista::Mostrar()
{
    pMascota actual = inicio;
 
    if(!Vacia())
    {
        while(actual!=NULL)
        {
            cout<<"\nNombre: "<<actual->getNombre()<<endl;
            actual = actual->sig;
        }
    }
    else
    {
        cout<<"\nLa lista esta vacia."<<endl;
     }
}

En este método sólo vamos a imprimir en pantalla todos los nombres de los objetos Mascota que tengamos en nuestra lista dinámica, para esto vamos a necesitar un puntero que pueda moverse libremente por la lista sin alterar el orden de ella, primero lo posicionaremos en el inicio y si la lista no está vacía, mediante un ciclo while lo recorreremos sólo si el nodo siguiente no es NULL, si el nodo en el que actual se encuenta, sigue sin ser NULL, mandamos llamar a la función que nos retorna el nombre de ese objeto Mascota.
Si la lista está vacía pues imprimimos en pantalla un mensaje que lo informe.

3 comentarios :

  1. Muy buen post, bastante bien explicado.
    Un poco tarde para mi pero muy util para los que van entrando en este tema.

    ResponderBorrar
    Respuestas
    1. ¡Muchas gracias, Héctor! Más adelante subiré varios temas de programación dinámica en C++ y Java por lo pronto.

      Borrar
    2. ¿Dónde están los temas, hijo de tu puta madre?

      Borrar