|
Lab 3 |
Listas encadenadas |
|
El objetivo de este problema es ejercitar el manejo de punteros en C. Para ello, se debe programar una primera función en la que se recorre una lista encadenada y se realiza un procesado de sus elementos. Una de las anomalías más comunes en las lista encadenadas es la presencia de bucles, es decir, un elemento que está encadenado a otro ya procesado. Se debe implementar una segunda función capaz de detectar esta situación en una lista encadenada de longitud arbitraria. |
|||
|
1. Estructuras de datos. La estructura de datos a utilizar está incluida en el ficherolista.h
cuyo contenido se
muestra en la figura 1:
En este fichero se define en primer lugar mediante una macro la constante
Cada elemento de la lista se representa por un dato de tipo
La figura 2 ilustra un ejemplo de
lista definida con el tipo de datos
Obsérvese que es preciso disponer de un apuntador al comienzo de la
lista. A través de él se accede a cualquier elemento de la misma por
medio del campo 2. Bucles en listas encadenadas.
Uno de los problemas más comunes de las listas encadenadas es la
presencia de bucles no deseados.
Es decir, que en un
punto de la lista se encadene un elemento anteriormente
encontrado. Generalmente, cuando se manipula una lista encadenada, las
operaciones para iterar sobre su contenido asumen que la lista termina
con el valor NULL en el campo ¿Qué sucede en el código de la figura 3 si el último elemento, por error, apunta a otro elemento de la lista? La figura 4 ilustra esta situación. La presencia de este bucle hace que la iteración entre en un bucle infinito. Nótese que no siempre la presencia de bucles en una lista es sinónimo de un error en el código. Todo depende del contexto en el que se utilice la estructura de datos. Si las funciones que procesan la lista asumen que ésta termina en un puntero a NULL (como en el caso del bucle anterior), entonces la presencia de un ciclo sí es un error. Sin embargo, existen aplicaciones cuya estructura de datos es una lista circular. 3. Ejercicios.
Todo el código a implementar se debe incluir en el fichero
4. Pruebas de programa.
Para validar la implementación de estas funciones, se facilita el fichero
de pruebas gcc -I ../LibAO -Wall -o listloop listloop.c sumList.c ../LibAO/libao.a
El programa realiza múltiples llamadas a Execution with no errors Una de las pruebas procesa una lista con un número elevado de elementos (no se extrañe que el programa tarde algunos minutos en ejecutar la prueba 5). El programa imprime en pantalla el tiempo empleado en las pruebas más relevantes. Se debe realizar la implementación más eficiente posible con respecto al uso de memoria y al tiempo de CPU. La aplicación debe desarrollarse en Linux.
|
|
Solo debe subirse un fichero, sumList.c Deadline: 19/10/2012 17:00
Los nombres de los autores y sus NIAS deben indicarse en el comentario que aparece en sumList.c de la siguiente forma: /* AUTHORS: NIA1;Name1;NIA2;Name2 */ Las prácticas no deben ser entregadas por las dos personas de una misma pareja de prácticas. Basta con que la entregue uno de ellos en Aula Global 2 |
|||