TRABAJO PRÁCTICO Nº 4 ESTRUCTURAS DE DATOS Y ALGORITMOS Licenciatura en Ciencias de la Computación - Primer cuatrimestre de 2008 Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Listas Ejercicio 1: " a) Defina el TDA lista, es decir, indique el modelo matemático sobre el cual está basado, y un conjunto de operaciones, con sus respectivas descripciones, para manejar datos de este tipo. Ejercicio 2: " a) Defina los conceptos de posición en una lista enlazada. L b) Suponga que la lista anterior no tiene celda de encabezamiento y que la posición de un elemento es el enlace que apunta a la celda que contiene el elemento. Indique la celda que contiene al primer elemento, al tercero y al último. Señale además la posición del primer elemento, la del tercero y la del último. c) Suponga ahora que la lista anterior tiene celda de encabezamiento y que la posición de un elemento es el enlace que apunta a la celda que contiene el enlace que apunta a la celda que contiene el elemento. Indique la celda que contiene al primer elemento, al tercero y al último. Señale además la posición del primer elemento, la del tercero y la del último. d) Indique para ambos casos el concepto de "fin de lista". Ejercicio 3: a) ¿Qué estructuras de datos podrían usarse para implementar el TDA lista? Analice las ventajas y desventajas de cada una de ellas. b) Implemente el TDA lista con punteros y con celda de encabezamiento. Indique cómo se definiría en esta implementación el concepto de posición. Analice los tiempos de ejecución de las operaciones. c) Implemente el TDA lista con cursores, de la manera que crea más conveniente. Analice los tiempos de ejecución de las operaciones. d) Escriba un programa de prueba, para verificar el correcto funcionamiento de los TDA implementados. Nota: La implementación debe realizarse de manera que el oscurecimiento de la estructura sea total. Ejercicio 4: Dadas dos listas ordenadas L1 y L2, se desea obtener una tercera lista ordenada U (la unión de L1 y L2) que contenga los elementos de L1 y L2, (sin los elementos repetidos). L1 y L2 son listas simplemente enlazadas e implementadas con punteros. La lista U, en cambio, debe estar implementada con cursores. En las tres listas el orden es creciente, y la implementación es sin celda de encabezamiento. a) Escriba un programa, sin usar el TDA lista, que tenga como entrada L1 y L2 y muestre la lista resultante. Las listas L1 y L2 deben ser eliminadas durante el proceso de unión. b) Analice además el tiempo de ejecución del programa, en términos de las longitudes de las listas. 1 TRABAJO PRÁCTICO Nº 4 ESTRUCTURAS DE DATOS Y ALGORITMOS Licenciatura en Ciencias de la Computación - Primer cuatrimestre de 2008 Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Ejercicio 5: Escriba un procedimiento recursivo y otro no recursivo para liberar todas las celdas de una lista L implementada con punteros y con celda de encabezamiento. La lista debe recorrerse una sola vez. Muestre que los procedimientos implementados son correctos. Ejercicio 6: El siguiente procedimiento se hizo con el propósito de eliminar todas las apariciones de un elemento x de una lista L. Explique por qué no siempre funciona y sugiérase una manera de arreglarlo para que realice la tarea propuesta: a) Versión [1]: PROCEDURE Elimina_apariciones (x: TipoElemento; VAR L: Lista); VAR P : Posición; BEGIN P := Primera(L); WHILE P <> FIN(L) DO IF Recupera(P,L) = x THEN Elimina(P,L) END; P := Siguiente(P,L) END END Elimina_apariciones; a) Versión [2]: PROCEDURE Elimina_apariciones ( x: TipoElemento; VAR L: Lista); VAR P : Posición; BEGIN P := Primera(L); WHILE P <> FIN(L) DO IF Recupera(P,L) = x THEN A := P; P := Siguiente(P,L); Elimina(A, L) END A := P P := Siguiente(P,L) END END Elimina_apariciones; Ejercicio 7: a) Escriba en Modula-2 un procedimiento no recursivo Invertir(L), que dada un lista L devuelve a L con sus elementos en el orden inverso al que estaban. Para realizar esta operación deberá utilizar ÚNICAMENTE las operaciones del TDA lista visto en clase. Puede utilizar si fuera necesario una o varias listas auxiliares. Deberá asegurarse que una vez que termina el procedimiento, no queden en la memoria celdas ocupadas e inaccesibles (basura). Invertir(L) debe ser a lo sumo de O(n) donde n es la cantidad de elementos de L. b) Escriba en Modula-2 un procedimiento recursivo Invertir-Rec(L) para realizar la misma tarea que el del inciso anterior, utilizando ÚNICAMENTE las operaciones del TDA lista. La diferencia es que ahora NO puede utilizar ninguna estructura auxiliar. Al igual que antes, deberá asegurarse que no queden en la memoria celdas ocupadas e inaccesibles (basura). Determine el orden del tiempo de ejecución de su solución. Además, 2 TRABAJO PRÁCTICO Nº 4 ESTRUCTURAS DE DATOS Y ALGORITMOS Licenciatura en Ciencias de la Computación - Primer cuatrimestre de 2008 Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur determine si puede hallar una solución de orden lineal en la cantidad de elementos de la lista de tal manera que su correcto funcionamiento sea independiente de la implementación subyacente del TDA lista. Ejercicio 8: Escriba en Modula-2 la estructura de datos para implementar con cursores una lista con los nombres de alumnos, y para cada uno de ellos una lista con los números de código de las materias que ha cursado, y otra lista con los códigos de las materias que ha aprobado. Ejercicio 9: El siguiente procedimiento intenta insertar un elemento x en la posición P de una lista L. PROCEDURE Inserta_en_Pos (VAR L: Lista; x: TipoElemento; P: Posición); VAR Salir : BOOLEAN; Enlace: Posición; BEGIN Salir := FALSE; Enlace := L; WHILE Enlace <> NIL AND NOT Salir DO IF Enlace = P THEN SigEnlace := Enlace^.Sig; ALLOCATE(Enlace, SIZE(Enlace^)); Enlace^.Elemento := x; Enlace^.Sig := SigEnlace; Salir := TRUE ELSE Enlace := Enlace^.Sig END; END; END Inserta_en_Pos; Explique si logra el objetivo propuesto, en caso de no hacerlo cuál es el motivo. Ejercicio 10: a) Compare la implementación de listas con un arreglo y listas enlazadas con punteros. Analizando el tiempo de ejecución de las operaciones y el uso de memoria. suponiendo que el tipo elemento ocupa E bytes, y un puntero ocupa P bytes. Indique las ventajas y desventajas de cada implementación. b) Suponga que tiene que utilizar una lista de N elementos. Compare el uso de memoria de utilizar arreglos, cursores, y punteros c) Suponga que tiene que utilizar 10 listas de N elementos d) Suponga que tiene que utilizar 10 listas de distinto tipo elemento Ejercicio 11: Lista circular El campo "de enlace" de la última celda de una lista simplemente enlazada, siempre contiene el valor NIL. En algunos casos conviene hacer un uso más provechoso de este campo. Por ejemplo hacer que apunte a la primera celda de la lista. Con esta modificación, la estructura resultante se llama Lista circular (o lista circularmente enlazada) y su representación gráfica, para una lista sin celda de encabezamiento es la siguiente: 3 TRABAJO PRÁCTICO Nº 4 ESTRUCTURAS DE DATOS Y ALGORITMOS Licenciatura en Ciencias de la Computación - Primer cuatrimestre de 2008 Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur ... L a) Si la anterior se tratara de una lista con celda de encabezamiento, ¿dónde debería apuntar dicho campo? b) Implemente el TDA lista circular con punteros y con celda de encabezamiento. Ejercicio 12: Lista doblemente enlazada a) ¿Qué concepto de posición conviene usar en una lista doblemente enlazada? ¿Por qué? b) Implemente el TDA lista doblemente enlazada. Utilice punteros y el concepto de posición más conveniente. c) "Analice el orden de los tiempos de ejecución de las operaciones de este TDA. Compare con los obtenidos para el TDA lista simplemente enlazada implementado con punteros. d) Indique las ventajas y desventajas del doble enlace. Ejercicio 13: Una cadena de caracteres es una sucesión de caracteres. Por lo tanto una estructura de datos adecuada para el TDA cadena del práctico 1 sería una lista. a) " Escriba la estructura de datos para dicho TDA usando arreglos, y usando una lista implementada con punteros. b) ¿Cuánto espacio ocupa en memoria una cadena de N caracteres en el caso que la estructura de datos sea un arreglo de longitud L ? ¿ y en el caso que la estructura sea una lista ? Recuerde que los caracteres ocupan 1 byte y que los punteros ocupan lugar en la memoria (en general 4 bytes). c) Para una cadena cualquiera de longitud N, la mejor situación sería que ocupe solo N bytes de memoria. ¿Puede definirse una estructura de datos con estas características? d) " Escriba una estructura que minimice el espacio de memoria para una cadena de caracteres. (Ayuda: la estructura puede ser combinada). Ejercicio 14: Realice un programa que mantenga una lista de nombres de alumnos, y para cada uno de ellos una lista con las números de código de las materias que ha cursado, y otra lista con los códigos de las materias que ha aprobado. El programa deberá permitir la carga de nuevas materias cursadas y aprobadas, verificando que no estén ya cargadas en la lista. En el caso de las materias aprobadas deberá verificar además que éstas hayan sido cursadas. Ejercicio 15: Se desea implementar en Modula-2 una lista doblemente enlazada con punteros, con celda de encabezamiento, con exportación opaca. Escribir en Modula-2 la estructura de datos para implementar una lista con estas características, especificando claramente que incluiría en los módulos de definición y de implementación. Asuma que dispone de un módulo TIPOELE que 4 TRABAJO PRÁCTICO Nº 4 ESTRUCTURAS DE DATOS Y ALGORITMOS Licenciatura en Ciencias de la Computación - Primer cuatrimestre de 2008 Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur implementa al tipo elemento en forma opaca, con las operaciones necesarias para manejar el tipo elemento. a) Escriba la operación crear_Lista_Vacia para la estructura del inciso (a). b) Sin utilizar las operaciones del TDA lista, y con total acceso a la estructura, escriba un procedimiento que reciba dos listas A y B implementadas con la estructura del inciso (a). El procedimiento deberá eliminar la primer ocurrencia de la lista B en A. Ejemplo: si B contiene los elementos [x,y,z] y A contiene [a,x,b,x,y,z,c,d,x,y,z], entonces luego de ejecutar el procedimiento debe quedar A con [a,x,b,c,d,x,y,z] . Asegúrese de no dejar locaciones de memoria inaccesibles. c) Indique el orden del tiempo de ejecución del procedimiento anterior. Justifique su respuesta. Ejercicio 16: Se desea escribir un procedimiento generar_Lista_Resumen(L1, L2, R) que reciba dos listas L1 y L2 (del mismo tipo elemento), y genere la lista R cuyos elementos serán ternas de la forma: (elemento E, cantidad de apariciones de E en L1, cantidad de apariciones de E en L2) Ejemplo: Sean L1 = <a, b, a, c, d, b> y L2 = <c, a, b, f, c> el procedimiento deberá generar la lista: R = <(a, 2, 1), (b, 2, 1), (c, 1, 2), (d, 1, 0), (f, 0, 1)> Las listas L1, L2 y R serán listas simplemente enlazadas con cursores, con celda de encabezamiento y la posición de un elemento E será el cursor a la celda que contiene un cursor a la celda que contiene a E. Los elementos de las listas L1 y L2 serán de tipo caracter. a) Escriba en Modula-2 las estructuras de datos necesarias para implementar dichas listas con exportación transparente. b) Implemente en Modula-2 la operación Generar_Lista_Resumen sin utilizar las operaciones de ningún TDA y con total acceso a las estructuras. Las listas L1 y L2 NO están ordenadas. Implemente toda operación que utilice. c) Indique el orden del tiempo de ejecución del procedimiento anterior. ¿Sería el mismo si las listas L1 y L2 estuvieran ordenadas?. Justifique su respuesta. Ejercicio 17: Escriba utilizando únicamente las operaciones provistas por los TDA Lista y TDA TipoElemento un procedimiento en Modula-2 que teniendo como entrada dos listas L1 y L2, devuelva verdadero si L1 está compuesta por los elementos de L2 en el mismo orden, seguidos de los elementos de L2 en orden inverso. El procedimiento escrito debe ser a lo sumo de O(n) donde n es la cantidad de elementos de L1. Asegúrese que una vez ejecutado el procedimiento no se pierden L1 y L2. Ejemplo: Si L1 = <1,2,3,4,4,3,2,1> y L2 = <1, 2, 3, 4> entonces el proc. deberá devolver verdadero. Si L1 = <1,2,3,4,4,3,2,1,5> y L2 = <1, 2, 3, 4> entonces el procedimiento deberá devolver falso 5 TRABAJO PRÁCTICO Nº 4 ESTRUCTURAS DE DATOS Y ALGORITMOS Licenciatura en Ciencias de la Computación - Primer cuatrimestre de 2008 Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Ejercicio 18: a) Este procedimiento fue diseñado para imprimir los elementos pares de una lista de números enteros a medida que los va eliminando. Determine por qué el procedimiento es incorrecto y proponga cambios para solucionarlo. b) Al finalizar la ejecución del procedimiento, determine en qué condiciones queda la lista con la que se lo invocó. PROCEDURE ImprimePares( L : Lista ); VAR P : Posicion; X : TElemento; BEGIN P := Primera(L); IF P <> Fin(L) THEN TElemento.AsignarElemento(X, Recupera(P,L)); IF TElemento.EsPar(X) THEN TElemento.ImprimirElemento(X); END; TElemento.EliminarElemento(X); ImprimePares(L); END; END ImprimePares; Ejercicio 19: Dada la siguiente porción de código, determine la función del mismo y si existe algún error, proponga modificaciones: PROCEDURE OrdenarLista( L : Lista ); VAR P, M : Posición; BEGIN P := Primera( L ); WHILE P <> Fin(L) DO M := BuscarMinimo( P, L ); Intercambiar( M, P, L ); P := Siguiente(P,L); END; END OrdenarLista; PROCEDURE Intercambiar( M, P : Posición; L : Lista ); BEGIN (* Intercambia los elementos de las posiciones M y P en la lista L *) END Intercambiar; PROCEDURE BuscarMinimo( P : Posición; L : Lista ) : Posicion; VAR Min : Posición; X : TElemento; BEGIN CrearElemento(X); Min := P; WHILE P <> Fin(L) DO AsignarElemento(X, RecuperarElemento(P,L)); IF MenorElemento(X, Recuperar(Min,L)) THEN Min := P; END; P := Siguiente(P,L); END; RETURN Min; BorrarElemento(X); END OrdenarLista; 6 TRABAJO PRÁCTICO Nº 4 ESTRUCTURAS DE DATOS Y ALGORITMOS Licenciatura en Ciencias de la Computación - Primer cuatrimestre de 2008 Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Ejercicio 20: Este procedimiento fue diseñado para eliminar un elemento de una posición determinada de una lista simplemente enlazada, utilizando direccionamiento directo y con total acceso a la estructura de datos. Determine si realiza lo indicado; en caso contrario, indique cuál es el error y proponga modificaciones para solucionarlo. PROCEDURE Eliminar_en_pos(P : Posición; VAR L : Lista ); VAR Q : Posición; BEGIN Q := Anterior( P, L ); Q := Siguiente(P,L); DEALLOCATE( P, SIZE(P^) ); END Eliminar_en_pos; Ejercicio 21: El siguiente procedimiento fue pensado para imprimir los elementos de una pila de enteros en forma invertida. Determine los errores que contiene y proponga una versión alternativa. PROCEDURE ImprimirPilaEnReverso( VAR P : Pila ); VAR E : Elemento; BEGIN CrearElemento(E); AsignarElemento( E, Tope(P) ); Desapilar( P ); ImprimirPilaEnReverso(P); ImprimirElemento( E ); Apilar( E, P ); END ImprimirPila Ejercicio 22: El siguiente procedimiento fue pensado para copiar una pila de enteros implementada con punteros. PROCEDURE CopiarPila( VAR Destino : Pila; Origen : Pila ); VAR E : Elemento; BEGIN IF NOT ( PilaVacia( Origen ) ) THEN CrearElemento( E ); AsignarElemento( E, Tope( Origen ) ); Desapilar( Origen ); CopiarPila( Destino, Origen ); Apilar( Destino ); END; END CopiarPila; a) ¿Se mantiene la pila de origen? En caso negativo, proponga modificaciones al código dado. b) Analice el efecto de la elección del tipo de pasaje de parámetro en la solución planteada en el punto (a) c) Considere las preguntas anteriores bajo una implementación basada en una estructura de datos estática. 7 TRABAJO PRÁCTICO Nº 4 ESTRUCTURAS DE DATOS Y ALGORITMOS Licenciatura en Ciencias de la Computación - Primer cuatrimestre de 2008 Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Ejercicios opcionales Ø I: 0 El cifrado de datos una de las formas de proteger la información almacenada en una computadora. Al cifrar la información, se cambia cada uno de los caracteres almacenados, por otro carácter. (Ejemplo: reemplazar las apariciones de una letra, por la que le sigue en el abecedario). De esta forma, el texto queda ilegible y no se puede utilizar la información (salvo que se conozca la forma en que de descifrarlo). La información cifrada debe poder ser recuperada nuevamente por su propietario. Una forma elemental de cifrar el contenido de una lista de caracteres, sería la siguiente: • Reemplazar cada consonante por la letra que está antes que ella en el abecedario (Ej. la j por la i) • Reemplazar la a por un 1, la e por un 2, la i por un 3, la o por un 4 y la u por un 5. • Los demás caracteres dejarlos igual. Pero deberá elegir una política con los números del 1 al 5. a) Realice un programa que cifre una lista de caracteres con la estrategia anterior. Use el TDA lista implementado con punteros. b) Ídem al inciso anterior pero utilizando el TDA lista implementado con cursores. c) Ídem al inciso anterior pero sin utilizar el TDA lista. d) Analice los tiempos de ejecución en los tres casos. II: Agregue al ejercicio 11 una tabla que contenga la lista de correlativas fuertes y débiles de cada una de las materias. Implemente una opción del programa que permita verificar si un alumno está en condiciones de anotarse para cursar una materia. III: Modifique la estructura de datos del programa del ejercicio 11 para que tenga la calificación obtenida en las materias aprobadas. Implemente una nueva opción del programa para mostrar el certificado analítico (lista de materias aprobadas con su calificación, y las materias cursadas y sin rendir) de un alumno dado. IV: Defina e implemente un TDA Lista Ordenada. Compare el orden del tiempo de ejecución de las operaciones con las del TDA lista dadas en clase. ¿Qué concepto de posición utiliza? V: Realice un programa para ordenar los elementos de una lista doblemente enlazada, usando el método quick-sort. 8