Eliminar elemento repetido de una lista en C++

Las listas en C++ son contenedores de tamaño dinámico que pueden almacenar valores de un mismo tipo en tiempo de ejecución; por lo tanto pueden expandirse o reducirse cuando se añade o se elimina un elemento usando sus diferentes métodos.

Descripción del tema: dada una lista de números repetidos, el usuario ingresa el número que desea eliminar y el programa debe eliminar todos los elementos de la lista que sean igual a dicho número. El programa debe mostrar en pantalla primero la lista actual con los elementos que posee y después la lista modificada.

Código fuente
#include <iostream>
#include <list>
using namespace std;

int item;

bool son_iguales(const int &valor) {
    return valor == item;
}

int main() {
    int enteros[] = {2, 90, 89, 2, 5, 101, 90, 35, 2, 43, 89, 101, 5, 89, 90, 5};
    list<int> lista(enteros, enteros + 16);

    cout << "Lista actual: ";
    for(list<int>::iterator iter = lista.begin(); iter != lista.end(); iter++) {
        cout << *iter << " ";
    }
    cout << "\n";

    cout << "\nIngrese el elemento que desea eliminar: ";
    cin >> item;

    lista.remove_if(son_iguales);

    cout << "Lista modificada: ";
    for(list<int>::iterator iter = lista.begin(); iter != lista.end(); iter++) {
        cout << *iter << " ";
    }
    cout << "\n";

    return 0;
}

Para poder hacer uso de las listas en C++ necesitamos incluir la cabecera <list> de la biblioteca estándar, allí se encuentran los métodos .begin(), .end() y .remove_if(). También vamos a necesitar la cabecera <iostream> para hacer uso de los objetos cout y cin; además debemos incluir el espacio de nombres de la biblioteca estándar std usando la sentencia using namespace, en este link podrá saber más sobre este tema.

Declarando variable global

Necesitamos declarar una variable que reciba el elemento ingresado por el usuario, este será el elemento que el programa va a eliminar más adelante.

int item;

Un detalle a observar es que la variable item está fuera de la función main() debido a que será utilizada en la función son_iguales(), solo hay una razón para esto, toda variable en C++ debe ser declarada antes ser usada.

Función son_iguales()

El nombre de la función es lo de menos, cada quien la llama como quiera.

bool son_iguales(const int &valor) {
    return valor == item;
}

Esta función devuelve un valor booleano y toma un parámetro constante de tipo int como referencia llamado valor, usando el símbolo «&»; luego compara dicho valor y lo compara con la variable item, devolviendo true si son iguales o false si no lo son. Esta función será usada más adelante para eliminar los elementos.

Función main()

En C++ es obligatorio tener una función main() siempre.

int main() {
    int enteros[] = {2, 90, 89, 2, 5, 101, 90, 35, 2, 43, 89, 101, 5, 89, 90, 5};
    list<int> lista(enteros, enteros + 16);

    cout << "Lista actual: ";
    for(list<int>::iterator iter = lista.begin(); iter != lista.end(); iter++) {
        cout << *iter << " ";
    }
    cout << "\n";

    cout << "\nIngrese el elemento que desea eliminar: ";
    cin >> item;

    lista.remove_if(son_iguales);

    cout << "Lista modificada: ";
    for(list<int>::iterator iter = lista.begin(); iter != lista.end(); iter++) {
        cout << *iter << " ";
    }
    cout << "\n";

    return 0;
}

Aquí será ejecutado todo el código que procesa la información en la lista y la ingresada por el usuario.

Array estático

Para este ejemplo es mejor tener un array estático con valores predefinidos.

int enteros[] = {2, 90, 89, 2, 5, 101, 90, 35, 2, 43, 89, 101, 5, 89, 90, 5};

Este array contiene todos los elementos de tipo int que serán copiados a la lista más adelante, se hace de esta forma para ahorrar código en lugar de llenar la lista anexando elemento por elemento.

Creando objeto lista

Como se explicó al inicio, las listas son objetos contenedores de tamaño dinámico, cuya clase se encuentra en la cabecera <list>.

list<int> lista(enteros, enteros + 16);

Creamos un objeto lista llamado lista que contiene elemento de tipo int y será inicializada con los valores del array estático creado anteriormente. Pasamos el array como primer argumento del constructo y luego el array junto con su tamaño como segundo argumento, en este caso tiene 16 elementos.

Mostrando la lista actual al usuario

Recordemos que en la descripción dijimos que el programa tiene que mostrar la lista actual, lógicamente para que el usuario sepa qué elementos hay y así mismo escoja cual desea eliminar.

cout << "Lista actual: ";
for(list<int>::iterator iter = lista.begin(); iter != lista.end(); iter++) {
    cout << *iter << " ";
}
cout << "\n";

El objeto cout en la primera línea solo imprime el texto «Lista actual:», nada más. Normalmente para recorrer un array se usan los índices con la sintaxis array[indice], pero con las listas esto no funciona así; por lo tanto necesitamos crear un objeto iterator al que hemos llamado iter, este objeto se recibe un puntero al primer elemento de la lista llamando al método .begin() y el bucle for() va a iterar hasta que iter sea diferente al último valor que arroje el método .end().

Luego de obtener cada elemento de la lista «lista» solo queda imprimir el valor con el objeto cout, pero debemos usar el operador «*» con el objeto iter debido a que es un puntero.

Solicitar y leer elemento ingresado por el usuario

El programa debe permitir al usuario ingresar el elemento que desea eliminar de la lista.

cout << "\nIngrese el elemento que desea eliminar: ";
cin >> item;

Le solicitamos al usuario que ingrese el elemento que desea eliminar, luego el programa lo lee y almacena con el objeto cin en la variable item.

Eliminando los elementos de la lista

El proceso es muy rápido y ocupa una sola línea de código gracias al método .remove_if().

lista.remove_if(son_iguales);

El método .remove_if() recibe como parámetro la función son_iguales (sin paréntesis) y cada elemento de la lista es pasado como argumento a dicha función para compararlo con el valor de item; cada elemento de la lista que sea igual a item es eliminado.

Mostrando lista modificada

Así como el programa muestra la lista sin modificar, también muestra la lista modificada sin los elementos que han sido eliminados.

cout << "Lista modificada: ";
for(list<int>::iterator iter = lista.begin(); iter != lista.end(); iter++) {
    cout << *iter << " ";
}
cout << "\n";

Este bucle for() funciona exactamente de la misma forma que el bucle que se encarga de mostrar la lista sin modificaciones descrito anteriormente, así que no es necesario repetir explicaciones.

Probando el programa

Es bueno probar los programas para saber si en realidad funcionan.

[fixedtorres@linuxero]$ g++ -std=c++14 EliminarElementoDeUnaLista.cpp -o EliminarElementoDeUnaLista
[fixedtorres@linuxero]$ ./EliminarElementoDeUnaLista
Lista actual: 2 90 89 2 5 101 90 35 2 43 89 101 5 89 90 5 

Ingrese el elemento que desea eliminar: 5
Lista modificada: 2 90 89 2 101 90 35 2 43 89 101 89 90 
[fixedtorres@linuxero]$ 

El programa funciona perfecto, ha eliminado de la lista el elemento indicado por el usuario.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *