Estructuras de datos y algoritmos Solución del examen del 5 de
Transcripción
Estructuras de datos y algoritmos Solución del examen del 5 de
Estructuras de datos y algoritmos Ingeniería en Informática Solución del examen del 5 de septiembre de 2008 Centro Politécnico Superior, Universidad de Zaragoza Ejercicio 1: espec árbolinferior usa árbolesbinarios, booleanos, elementos operaciones esinferior: arbin arbin -> bool ecuaciones A,Aizq,Ader,Bizq,Bder:arbin; e1,e2:elem esinferior(vacío,A) = verdad esinferior(A,vacío) = verdad esinferior(plantar(e1,Aizq,Ader),plantar(e2,Bizq,Bder)) = = (e1<e2) esinferior(Aizq,Bizq) esinferior(Ader,Bder) fespec función esinferior(a,b:arbin) devuelve bool principio si a = nil entonces devuelve verdad sino_si b = nil entonces devuelve verdad sino dev. (a.dato<b.dato) andthen esinferior(a.izq,b.izq) andthen esinferior(a.der,b.der) fsi fin Ejercicio 2: tipos ptnodo = puntero a nodo; nodo = registro v:vector[1..10] de entero; sig:ptnodo freg; lev = registro PR,UL:ptnodo freg Parte 2.1: algoritmo eliminarrepetidos(e/s l:lev; sal r:entero) variables aux: ptnodo; índice,índ2,número:entero principio aux:=l.PR; r:=0; mq auxnil hacer para índice:=1 hasta 9 hacer número:=aux.v[índice]; si número0 entonces para índ2:=índice+1 hasta 10 hacer si número=aux.v[índ2] entonces aux.v[índ2]:=0; r:=r+1 fsi fpara fsi fpara; aux:=aux.sig fmq fin Parte 2.2: algoritmo distintos(ent l:lev; sal m:conjEnteros) variables aux:ptnodo; índice:entero principio aux:=l.PR; crear(m); mq auxnil hacer para índice:=1 hasta 10 hacer si aux.v[índice]0 entonces poner(m,aux.v[índice]) fsi fpara; aux:=aux.sig fmq fin Parte 2.3: algoritmo eliminar(e/s l:lev; ent n:entero) variables aux:ptnodo; índice:entero; buscandoprimero:booleano principio aux:=l.PR; buscandoprimero:=verdad; mq auxnil hacer si buscandoprimero entonces índice:=1; mq aux.v[índice]n and índice<10 hacer índice:=índice+1 fmq; si aux.v[índice]=n entonces buscandoprimero:=falso fsi; sino para índice:=1 hasta 10 hacer si aux.v[índice]=n entonces aux.v[índice]:=0 fsi fpara fsi; aux:=aux.sig fmq fin Ejercicio 3: tipos ptrnodo = puntero a nodo; nodo = registro dato:tarea; sig:ptrnodo freg; cola = registro pri,ult:ptrnodo freg; colatareas = vector[1..5] de cola algoritmo crearcolatareas(sal ct:colatareas) {Inicializa la estructura de datos, sin tareas} algoritmo añadirtarea(e/s ct:colatareas; ent t:tarea; ent p:1..5) {Añade la tarea t con prioridad p en la cola ct} algoritmo próximatarea(e/s ct:colatareas; sal proxtarea:tarea; sal error:booleano) {Selecciona la tarea a ejecutar y la elimina de la cola; error devuelve verdad si no hay tareas pendientes} variables auxptrnodo:ptrnodo; índicecola:entero algoritmo siguientetarea(e/s c:cola; sal t:tarea; sal error:booleano) {devuelve en t la 1ª tarea de una cola FIFO c y la borra de la cola; si la cola es vacía error:=verdad} variables aux:ptrnodo principio si c.pri=nil entonces error:=verdad sino error:=falso; aux:=c.pri; t:=aux.dato; c.pri:=c.pri.sig; disponer(aux); si c.pri=nil entonces c.ult:=nil fsi fsi fin Cinco colas FIFO, una por cada prioridad. ... ... ... ... ... principio error:=verdad; índicecola:=1; mq error and índicecola<=5 hacer siguientetarea(ct[índicecola],proxtarea,error) índicecola:=índicecola+1 fmq fin El coste en tiempo de la operación próximatarea es de orden constante (es decir, independiente del número de tareas en la cola).