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

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





Siguiendo con la explicación de las listas enlazadas o listas dinámicas, continuaremos con el método "Buscar", en el que tomaremos como referencia un atributo de nuestro objeto "Mascota" y a partir de ahí, hacer una búsqueda secuencial en nuestros nodos hasta encontrar una coincidencia.


NOTA: normalmente debemos buscar mediante un atributo que sea único para cada objeto, ya que si tenemos 2 objetos con la misma referencia pues... ocasionaría un error, para ello también debemos agregar algo que se conoce como "Duplicidad", para que, valga la redundancia, evitemos que 2 atributos se dupliquen en nuestros registros, pero eso es un tema que trataré más adelante.

void Lista::Buscar(string nombre)
{
    if(Vacia())
    {
        cout<<"La lista esta vacia"<<endl;
    }
    else
    {
        pMascota nodoBuscar = new Mascota();
        nodoBuscar = inicio;

        while((nodoBuscar!=NULL)&&(nodoBuscar->getNombre()!=nombre))
        {
            nodoBuscar = nodoBuscar->sig;
        }
        if(nodoBuscar==NULL)
        {
            cout<<"La mascota no esta registrada"<<endl;
        }
        else if(nodoBuscar->getNombre()==nombre)
        {
            cout<<"Nombre encontrado: "<<nodoBuscar->getNombre()<<endl;
        }
    }
}
Lo primero que se hace para poder hacer una búsqueda dentro de una lista dinámica es crear algo que nos haga referencia al nodo de la lista en el que nos encontramos; un nodo que sólo tome los valores de los demás nodos pero no afecte a la lista, un nodo "auxiliar/temporal" que en este caso llamaremos "nodoBuscar".

1.- Verificamos si la lista está o no vacía.

2.- Si no está vacía, entonces mientras el nodoBuscar no termine de ver todos los nodos y mientras el nombre del nodo en el que está no es igual al nombre que nosotros estamos buscando, que el nodoBuscar deje de apuntar al nodo actual y apunte al nodo que sigue.

3.- Si el nodoBuscar terminó de ver la lista, significa que a pesar de que ya recorrió todos los nodos, no encontró ninguna coincidencia, entonces la mascota no existe.

4.- Si el nombre del nodo en el que se quedó coincide con el nombre que buscábamos, nos mostrará el nodo en el que se quedó.

NOTA: Mostramos el nombre porque es el único atributo que tenemos, podríamos agregar un atributo "idMascota" buscar por medio del ID y mostrar el nombre para que sea más explícita la explicación pero pueden programarlo con facilidad si ya leyeron Listas Dinámicas (Parte I) o si ya tienen conocimientos previos de programación.

void Lista::Eliminar(string nombre)
{
    if(inicio!=NULL)
    {
        pMascota nodoBorrar = inicio;
        pMascota nodoAnterior = NULL;
        while((nodoBorrar!=NULL)&&(nodoBorrar->getNombre()!=nombre))
        {
            nodoAnterior = nodoBorrar;
            nodoBorrar = nodoBorrar->sig;
        }
        if(nodoBorrar==NULL)
        {
            cout<<"La mascota no esta registrada."<<endl;
        }
        else if(nodoAnterior==NULL)
        {
            if(nodoBorrar->sig!=NULL)
            {
                inicio = nodoBorrar->sig;
            }
            else
            {
                inicio = NULL;
                fin = NULL;
            }
            delete nodoBorrar;
        }
        else
        {
            nodoAnterior->sig = nodoBorrar->sig;
            delete nodoBorrar;
        }
    }
}
Para eliminar un nodo, al igual que en buscar debemos crear una referencia hacia los nodos, sin embargo, al tener una lista que no es doblemente ligada, necesitamos referenciar el nodo, el nodo siguiente y el nodo anterior del nodo en el que nos encontramos; la referencia al siguiente ya la tenemos, pero al anterior no, por lo que debemos crear una.

1.- Si la lista no esta vacía, vamos una referencia "nodoBorrar" que colocaremos al inicio de nuestra lista y una referencia "nodoAnterior" que será el nodo anterior a nuestro nodoBorrar, esa la colocaremos antes de donde colocamos a nodoBorrar, o sea... en NULL.

2.- Como en la búsqueda, si el nodoBorrar no ha recorrido todos los nodos de la lista y tampoco ha coincidido con ninguno, vamos a moverlo al siguiente nodo, pero antes de eso, vamos a apuntar nodoAnterior a donde apunta nodoBorrar, sólo entonces podremos moverlo, antes no.

3.- Vamos con las condiciones una vez terminado el proceso del paso 2; si el nodoBorrar recorrió todos los nodos, significa que jamás encontró coincidencias.

4.- Si el nodoAnterior quedó en NULL significa que jamás se movió, entonces el nodoBorrar está en el inicio de la lista, por lo que tendremos 2 condiciones:

a) Si el nodo siguiente al nodoBorrar no es NULL, hacemos que el nuevo inicio de nuestra lista sea el nodo que estaba después del nodoBorrar.

b) Si no (Si sí es NULL), significa que sólo teníamos un elemento en nuestra lista, por lo que debemos hacer que el inicio y el final de ella, sean NULL.

5.- Debemos borrar el nodoBorrar con un "delete".

6.- Y por último, si ni nuestro nodoBorrar ni nuestro nodoAnterior son NULL, significa que el elemento a borrar está en alguna parte en medio de nuestra lista, por lo que independientemente de dónde sea, vamos a hacer que el nodo siguiente al nodoAnterior sea lo que esta después del nodoBorrar para "Brincarnos" el nodoBorrar e ignorarlo en la lista, ¿ya está ignorado pero sigue ahí?, ¡Borrémoslo y se acabó!

1 comentario :