EXAMEN D’ESTRUCTURES DE DADES I ALGORISMES (ITIG – EPSA) Alcoi a 12 de Setembre de 2005 Tiempo estimado: 2 horas Ejercicio 1: (4 puntos) Sea la siguiente definición del TAD lista: lista * crearl(); lista * insertar(lista * l, int e, posicion p); lista * borrar(lista * l, posicion p); int recuperar(lista * l, posicion p); int vacial(lista * l); posicion fin(lista * l); posicion principio(lista * l); posicion siguiente(lista * l, posicion p); Sin conocer los detalles de su implementación, se pide desarrollar las siguientes funciones: a) Unión de dos listas (l1 ∪ l2) lista * union(lista * l1, lista * l2); b) Intersección de dos listas (l1 ∩ l2) lista * interseccion(lista * l1, lista * l2); c) Diferencia de dos listas (l1 – l2) lista * diferencia(lista * l1, lista * l2); d) Determinar si una lista l2 está incluida en l1 (l2 ⊆ l1), es decir, todos y cada uno de los elementos de l2 está en l1 int incluida(lista * l1, lista * l2); Ejercicio 2. (3 puntos) Cuestiones: a) Detallar en qué consisten los algoritmos Divide y Vencerás y cuándo obtienen soluciones eficientes. En el caso del Quicksort ¿Cuál es su mejor y peor caso y en qué circunstancias se dan? b) ¿Cuál es el coste de las operaciones de inserción y búsqueda de elementos en una tabla de dispersión, cuando en ésta se dan las condiciones óptimas? ¿Cuáles son esas condiciones? c) Detallar, en pseudocódigo, el algoritmo de Dijkstra y describir en qué se fundamenta. Ejercicio 3: (3 puntos) Sea la siguiente definición de árbol binario de búsqueda: typedef int tipo_baseT; typedef struct snodo { tipo_baseT clave; struct snodo *hizq, *hder; }abb; Desarrollar una función que imprima los valores comprendidos en el rango [r1, r2] donde r1 <= r2. void rango(abb * T, int r1, int r2);