Practica2 7322
Practica2 7322
Practica2 7322
PRÁCTICA No. 02 –
1. DATOS GENERALES:
2023/12/20 2023/12/21
2. OBJETIVO(S):
2.1. GENERAL
Desarrollar un programa en C++ que utilice listas enlazadas para encontrar y almacenar los
valores más cercanos a cada elemento de una lista dada.
2.2. ESPECÍFÍCOS
• Implementar funciones recursivas para acceder y procesar los elementos de la lista enlazada.
3. METODOLOGÍA
La metodología utilizada en el desarrollo de este programa sigue los principios de
programación modular y orientada a objetos. Se ha enfocado en la implementación de
funciones especializadas para realizar tareas específicas, promoviendo la reutilización de
código y facilitando el mantenimiento. El uso de listas enlazadas y recursividad se
seleccionó para abordar de manera eficiente la manipulación de datos y la resolución del
problema planteado.
4. EQUIPOS Y MATERIALES:
- Computador
- Entorno integrado de desarrollo (IDE)
- Aula virtual
- Acceso a internet
- Bibliografía
5. MARCO TEORICO:
Para comprender mejor el funcionamiento del programa, es necesario revisar algunos
conceptos clave relacionados con listas enlazadas y recursividad:
Listas Enlazadas:
Las listas enlazadas son estructuras de datos dinámicas que consisten en nodos conectados,
donde cada nodo contiene un valor y una referencia al siguiente nodo. Esto permite una
gestión eficiente de la memoria y la manipulación de datos.
Nodos y Conexiones:
Nodo: En una lista enlazada, cada elemento se almacena en un nodo. Cada nodo contiene
dos campos principales: el dato que guarda la información específica y un puntero que apunta
al siguiente nodo en la secuencia.
Conexiones: Estos nodos están vinculados mediante punteros, formando una cadena o
secuencia. El último nodo generalmente apunta a NULL, indicando el final de la lista.
Recursividad:
La recursividad es una técnica de programación en la que una función se llama a sí misma
para abordar un problema. En este programa, las funciones como ingresarLista, imprimirLista,
y otras, utilizan la recursividad para manipular los elementos de las listas de manera eficiente.
La recursividad en C++ se basa en la idea de que un problema se puede dividir en casos más
pequeños y manejables hasta llegar a un caso base, que es la instancia más simple del
problema y no requiere una llamada recursiva para su resolución.
Funciones y Prototipos:
Los prototipos de funciones permiten al compilador conocer la firma de una función antes de
su implementación, lo que facilita la llamada a funciones antes de que estén definidas en el
código. Este enfoque mejora la modularidad del código.
Punteros y Referencias:
El uso de punteros y referencias en C++ es esencial para trabajar con estructuras de datos
dinámicas como las listas enlazadas. Facilitan la manipulación de datos y la navegación a
través de la estructura.
Punteros:
Almacenamiento de Direcciones: Permiten almacenar direcciones de memoria, crucial para
gestionar estructuras dinámicas como nodos en una lista enlazada.
Referencias:
Facilidad de Lectura: Su uso mejora la legibilidad del código al proporcionar una sintaxis más
limpia y fácil de entender.
6. PROCEDIMIENTO:
El código es un programa en C++ que realiza diversas operaciones con listas enlazadas. A
continuación, se detalla el procedimiento general del programa:
Prototipos de Funciones:
Se declaran los prototipos de funciones que se utilizarán más adelante en el programa, para
poder cumplir con el objetivo del programa.
Función ingresarLista:
Recursivamente solicita al usuario que ingrese valores para la lista l1 hasta que se ingrese el
valor FIN.
Inserta cada valor al final de la lista l1.
Función imprimirLista:
Función obtenerValor:
Recursivamente obtiene el valor en la posición N de una lista enlazada dada.
Verificar si el nodo es nulo o si N es menor que 0.
Si N es 0, devolver el dato del nodo actual.
Llamar recursivamente a obtenerValor con el siguiente nodo y decrementar N.
Función encontrarYAlmacenarCercanos:
Función procesarLista:
Función encontrarCercano:
Encuentra el valor más cercano a un nodo dado (nodoActual) comparando con cada nodo en
la lista original.
Calcula la diferencia absoluta y actualiza el valor más cercano y la diferencia mínima.
En resumen, el programa realiza la manipulación de listas enlazadas para encontrar y
almacenar los valores más cercanos a cada elemento de la lista original, utilizando funciones
recursivas para acceder y procesar los elementos de la lista.
Dada toda la lógica y la implementación de las funciones procedemos a realizar pruebas para
ver si el programa no marca errores y si cumple con lo solicitado y ahí mirar su eficiencia.
7. CONCLUSIONES Y RECOMENDACIONES:
Recomendaciones:
• Se sugiere mejorar la interacción con el usuario proporcionando información
adicional durante la ejecución del programa, como mensajes que indiquen el
progreso o el propósito de cada parte del programa.
• Podría considerarse la implementación de mecanismos de manejo de errores para
abordar posibles situaciones en las que el usuario ingrese datos incorrectos o
inesperados.
8. BIBLIOGRAFÍA:
• Deitel, H. M., Deitel, P. J. (1995). Cómo programar en C/C+. Argentina: Prentice Hall
Hispanoamericana.
• Deitel, H. M., Deitel, P. J. (2003). C++ how to Program. Reino Unido: Prentice Hall.
// Prototipos de funciones.
void ingresarLista(Lista *l1);
void imprimirLista(Nodo *act);
Tipo obtenerValor(Nodo *nodo, int N);
void encontrarYAlmacenarCercanos(Lista *original, Lista *cercanos);
void procesarLista(Nodo *nodoActual, Lista *original, Lista *cercanos);
void encontrarCercano(Nodo *nodo, Tipo valorNesimo, Nodo *nodoActual, Tipo
&valorMasCercano, int &diferenciaMinima);
int main()
{
system("color 0B");
setlocale(LC_ALL,"");
Lista l1, l2;
ingresarLista(&l1);
encontrarYAlmacenarCercanos(&l1, &l2);
if (aux != FIN)
{
l1->insertarAlFinal(aux);
ingresarLista(l1);
}
}
if (diferenciaMinima != INT_MAX)
{
cercanos->insertarAlFinal(valorMasCercano);
}
else
{
cercanos->insertarAlFinal(nodoActual->getDato());
}
if (nodo != nodoActual)
{
int diferenciaActual = abs(nodo->getDato() - valorNesimo);
if (diferenciaActual < diferenciaMinima)
{
diferenciaMinima = diferenciaActual;
valorMasCercano = nodo->getDato();
}
}