Listas Enlazadas Simples en C++: Implementación Práctica con Nodos, Inserción, Búsqueda y Eliminación
Listas Enlazadas Simples en C++
A continuación se presenta un programa en C++ que implementa una lista enlazada simple para gestionar registros de contactos formados por nombre, edad y número telefónico. El código incluye operaciones de inserción, búsqueda, eliminación y visualización, controladas mediante un menú interactivo.
Código fuente
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
int n, m, c, b, t, z;
string x;
/* Clase Nodo: representa un elemento de la lista */
class Nodo {
public:
string nombre;
int edad;
int telefono;
Nodo *next;
// Constructor sin parámetros (por defecto)
Nodo() {
next = NULL;
}
// Constructor con parámetros
Nodo(string x, int t, int z) {
nombre = x;
edad = t;
telefono = z;
next = NULL;
}
};
/* Clase Lista: contiene las operaciones sobre la lista enlazada */
class Lista {
private:
Nodo *cabeza;
Nodo *cola;
public:
Lista() {
cabeza = cola = NULL;
}
int insertar_inicio(string x, int t, int z);
int insertar_final(int y);
int insertar_n(int n, int m);
bool buscar(int x, int c);
void eliminar_cab();
void eliminar_fin();
int eliminar_pos(int b);
int contar();
void mostrar();
};
/* Inserta un nuevo nodo al inicio de la lista */
int Lista::insertar_inicio(string x, int t, int z) {
Nodo *aux;
aux = new Nodo(x, t, z); // Se crea un nuevo nodo
aux->nombre = x;
aux->edad = t; // Se asignan los datos al nuevo nodo
aux->telefono = z;
aux->next = cabeza; // El nuevo nodo apunta a la cabeza actual
cabeza = aux; // La cabeza pasa a ser el nuevo nodo
return 0;
}
/* Inserta un nuevo nodo al final de la lista */
int Lista::insertar_final(int y) {
Nodo *aux2;
aux2 = new Nodo(); // Se crea un nuevo nodo
aux2->dato = y; // Se asigna el dato al nuevo nodo
aux2->next = NULL;
Nodo *punt = cabeza;
if (punt != NULL) {
while (punt->next != NULL) {
punt = punt->next;
}
punt->next = aux2;
}
return 0;
}
/* Inserta un nuevo nodo en la posición indicada */
int Lista::insertar_n(int n, int m) {
Nodo *nuevo = new Nodo();
nuevo->dato = n;
Nodo *aux = cabeza;
int cont = 2;
if (aux == NULL) {
cout << "No hay elementos!!";
} else {
while (aux->next != NULL && cont) {
aux = aux->next;
cont += 1;
}
nuevo->next = aux->next;
aux->next = nuevo;
}
return 0;
}
/* Busca un valor en la lista */
bool Lista::buscar(int x, int c) {
Nodo *aux = cabeza;
bool band = false;
for (int i = 0; i < c; i++) {
if (aux->dato == x) {
band = true;
}
aux = aux->next;
}
return band;
}
/* Cuenta el número de nodos de la lista */
int Lista::contar() {
int c = 0;
Nodo *aux = cabeza;
if (cabeza == NULL) {
cout << "\n\t\t Pila vacia\n";
} else {
while (aux != NULL) {
c++;
aux = aux->next;
}
}
return c;
}
/* Elimina el nodo de la cabeza */
void Lista::eliminar_cab() {
Nodo *aux = cabeza;
if (cabeza == NULL) {
cout << "\n\t Lista vacia\n";
} else {
cabeza = cabeza->next;
delete aux;
}
}
/* Elimina el último nodo de la lista */
void Lista::eliminar_fin() {
Nodo *aux = cabeza;
while (aux->next->next != NULL) {
if (aux->next != NULL)
aux = aux->next;
}
aux->next = NULL;
}
/* Elimina el nodo que contiene el valor indicado */
int Lista::eliminar_pos(int b) {
Nodo *aux1, *aux2;
Nodo *aux;
aux = cabeza;
int a = 0;
aux1 = aux2 = cabeza;
contar();
while (aux1 != NULL) {
if (aux1->dato == b) {
c++;
}
aux1 = aux1->next;
a++;
}
a--;
if (c != 0) {
for (int i = 1; i < a; i++) {
aux2 = aux2->next;
}
aux2->next = aux1;
} else {
cout << "\nNo se encontro el valor!\n";
}
return 0;
}
/* Muestra todos los elementos de la lista */
void Lista::mostrar() {
Nodo *aux = cabeza;
if (cabeza == NULL) {
cout << "\n\tLista vacia\n";
} else {
while (aux != NULL) {
cout << aux->dato;
aux = aux->next;
}
}
}
/* Función principal: menú interactivo */
int main() {
int op, c;
char op2;
Lista L1;
do {
system("cls");
cout << "\n MENU ";
cout << "\n1.- Ingresar (cabeza).";
cout << "\n2.- Ingresar (cola).";
cout << "\n3.- Ingrese en N-posicion.";
cout << "\n4.- Buscar elemento.";
cout << "\n5.- Eliminar cabeza.";
cout << "\n6.- Eliminar final.";
cout << "\n7.- Eliminar posicion.";
cout << "\n8.- Contar.";
cout << "\n9.- Imprimir.";
cout << "\n10.- Salir.";
cout << "\n\n\t Opcion: ";
cin >> op;
switch (op) {
case 1: {
do {
system("cls");
cout << "Ingrese el nombre: ";
cin >> x;
cout << "Ingresar la edad: ";
cin >> t;
cout << "Ingresar el numero telefonico: ";
cin >> z;
L1.insertar_inicio(x, t, z);
cout << "Desea ingresar otro numero? (S/N) - ";
cin >> op2;
} while (op2 == 'S' || op2 == 's');
break;
}
case 2: {
do {
system("cls");
cout << "Ingrese un numero: ";
cin >> n;
L1.insertar_final(n);
cout << "Desea ingresar otro numero? (S/N) - ";
cin >> op2;
} while (op2 == 'S' || op2 == 's');
break;
}
case 3: {
do {
system("cls");
cout << "Ingrese un numero: ";
cin >> n;
cout << "\nIngrese la posicion: ";
cin >> m;
L1.insertar_n(n, m);
cout << "Desea ingresar otro numero? (S/N) - ";
cin >> op2;
} while (op2 == 'S' || op2 == 's');
break;
}
case 4: {
do {
system("cls");
cout << "Ingrese el numero: ";
cin >> x;
c = L1.contar();
if (L1.buscar(x, c) == true) {
cout << "Elemento encontrado!\n";
} else {
cout << "No se encontro!\n";
}
cout << "Desea buscar otro numero? (S/N) - ";
cin >> op2;
} while (op2 == 'S' || op2 == 's');
break;
}
case 5: {
system("cls");
L1.eliminar_cab();
system("pause");
break;
}
case 6: {
system("cls");
x = L1.contar();
if (x == 0) {
cout << "Lista vacia";
} else {
L1.eliminar_fin();
}
system("pause");
break;
}
case 7: {
system("cls");
cout << "Ingrese numero: ";
cin >> b;
L1.eliminar_pos(b);
break;
}
case 8: {
system("cls");
L1.contar();
c = L1.contar();
system("pause");
break;
}
case 9: {
system("cls");
L1.mostrar();
cout << "\n";
system("pause");
break;
}
}
} while (op != 10);
return 0;
}Descripción de la estructura
- Nodo: contiene los campos
nombre,edad,telefonoy un punteronextque enlaza con el siguiente elemento. - Lista: mantiene los punteros
cabezaycola, y ofrece las operaciones de inserción, búsqueda, eliminación y conteo. - Menú principal: permite al usuario interactuar con la lista mediante opciones numéricas.
Observaciones
El documento original contenía errores de sintaxis (fragmentos de código HTML mal escapados, operadores de flujo corruptos y nombres de miembros inexistentes como dato en la clase Nodo). En la versión corregida se han ajustado estos aspectos para que el código sea compilable, aunque se recomienda revisar la lógica de algunas funciones, como eliminar_pos o insertar_n, ya que presentan comportamientos no previstos en ciertos casos límite.