Instituto de Computación. Facultad de Ingeniería. Universidad de la República Parcial de Programación 2 23 de Mayo de 2006 Generalidades: • • • • • • • La prueba es individual y sin material. La durac ió n es 3 h o ras. S ó lo se c o ntestan dudas ac erc a de la letra de lo s ej erc ic io s. E sc riba las h o j as de un só lo lado y c o n letra c lara. C o mienc e la so luc ió n de c ada ej erc ic io en una nueva h o j a. N umere c ada h o j a, indic ando en la primera el to tal. C o lo q ue su nú mero de c é dula y no mbre en c ada h o j a. E j ercicio 1 ( 1 6 puntos: 8 parte ( a) y 8 parte ( b) ) Considere la siguiente declaración, en Módula-2 , del tip o de las listas de nú m eros enteros LInt: TYPE LInt = POINTER TO RECORD info : INTEGER; sig : LInt END; D onde cada lista será rep resentada sin usar una celda dum m y ( cab ecera) . Se pide, sin usar funciones o procedimientos auxiliares y accediendo directamente a la representación, implementar los sig uientes dos procedimientos iterativ os: a) InsLuego: D ados dos enteros e1 y e2, y dada una lista L de enteros de tip o Lint, inserta a e2 en la p osición inm ediatam ente p osterior a la de la p rim era ocurrencia del elem ento e1 en L , si e1 p ertenece a L . S i e1 no p ertenece a L , la op eración no tendrá ef ecto. E j em p los: E ntradas R esultado de InsLuego e 1= 1 , e 2= 9 , L = [ 3 , 1 ] L = [ 3 , 1 , 9] e 1= 1 , e 2= 9 , L = [ 3 , 1 , 5 ] L = [ 3 , 1 , 9, 5 ] e 1= 3 , e 2= 9 , L = [ 3 , 5 , 3 , 9 ] L = [ 3 , 9, 5 , 3 , 9 ] e 1= 2 , e 2= 9 , L = [ ] L = [] e 1= 2 , e 2= 9 , L = [ 3 , 1 , 5 ] L = [3 ,1 ,5 ] S O L U C IO N PROCEDURE InsLuego(e1, e2 : INTEGER; VAR L : LInt); VAR nuevo, iterador : LInt; BEGIN iterador := L; WHILE (iterador <> NIL) AND (iterador^.info <> e1) DO iterador := iterador^.sig; END; IF (iterador <> NIL) THEN NEW(nuevo); nuevo^.info := e2; nuevo^.sig := iterador^.sig; iterador^.sig := nuevo; END; END InsLuego; (* Notar que la lista parámetro podría pasarse por copia, ya que nunca se inserta al comienzo, evitando entonces usar el puntero auxiliar iterador para recorrerla *) b ) B or r a r M a y or es: D ados un entero x y una lista L de enteros de tip o Lint ordenada de m enor a m ay or, elim ina todos los elem entos de L m ay ores a x . E l p rocedim iento deb erá lib erar la m em oria de las celdas cuy os elem entos son elim inados. E j em p los: E ntrada R esultado de B or r a r M a y or es x = 6 , L = [ 2 ,3 ,6 ,9 ,1 3 ] L = [2 ,3 ,6 ] x = 1 3 , L = [2 ,3 ,6 ,9 ,1 3 ] L = [2 ,3 ,6 ,9 ,1 3 ] x = 1 , L = [ 2 ,3 ,6 ,9 ,1 3 ] L = [] x = 1 , L = [] L = [] x = 8 , L = [ 2 ,3 ,6 ,9 ,1 3 ] L = [2 ,3 ,6 ] S O L U C IO N PROCEDURE BorrarMayores (VAR l :LInt; x:INTEGER); VAR iterador, aBorrar : LNat; BEGIN IF l <> NIL THEN iterador := l; IF iterador^.info > x THEN aBorrar := iterador; l := NIL; ELSE WHILE (iterador^.sig <>NIL and iterador^.sig^.info <= x) DO iterador := iterador^.sig END; aBorrar := iterador^.sig; iterador^.sig : = NIL; END WHILE (aBorrar <> NIL) DO iterador := aBorrar; aBorrar := aBorrar^.sig; DISPOSE(iterador); END; END; END BorrarMayores; Al t e r n at i v a: PROCEDURE BorrarMayores (VAR l :LInt; x:INTEGER); VAR iterador, aBorrar : LNat; BEGIN IF (l <> NIL) THEN iterador := l; WHILE (iterador^.sig <> NIL) DO IF (iterador^.sig^.info <= x) THEN iterador := iterador^.sig ELSE borrar := iterador^.sig; iterador^.sig := iterador^.sig^.sig; DISPOSE(aBorrar); END; END; IF (iterador^.info > x) THEN l := l^.sig; DISPOSE(iterador); END; END; END BorrarMayores; E j ercicio 2 ( 1 4 puntos) Considere la siguiente declaración, en Módula-2 , del tip o de los á rb oles b inarios de b ú sq ueda de enteros: ABB = POINTER TO ABNode; ABNode = RECORD raiz : INTEGER; izq : ABB; der : ABB; END; Se pide: implemen t e un procedimiento B or r a r S ub A r b q ue dados un á rb ol b inario de b ú sq ueda de enteros A de tipo ABB ( sin elementos repetidos) y un entero x, elimine el sub á rb ol de A q ue tiene a x como su raí z . Si x no pertenece a A , el procedimiento no tendrá efecto. E j em p lo, 2 8 4 5 7 9 y x = 7 B o r r a r Su b A r b 2 4 8 9 6 S i x f uera igual a 8 en el ej em p lo p rev io, el á rb ol q uedarí a v ací o. N O T AS : • • • S e sugiere usar un p rocedim iento aux iliar, q ue deb erá ser im p lem entado. I m p lem entar el/ los p rocedim iento/ s accediendo directam ente a la rep resentación. D eb erá lib erarse la m em oria de las celdas cuy os elem entos sean elim inados. S O L U C IO N PROCEDURE BorrarSubArb(x : INTEGER; VAR A : ABB); BEGIN IF (A <> NIL) THEN IF (A^.raiz = x) THEN BorrarArb(A); A := NIL; ELSIF (t^.raiz > x) THEN BorrarSubArb(x, A^.izq); ELSE BorrarSubArb(x, A^.der); END; END; END BorrarSubArb; PROCEDURE BorrarArb(VAR A : ABB); BEGIN IF (A <> NIL) THEN BorrarArb(A^.izq); BorrarArb(A^.der); DISPOSE(A); END; END BorrarArb; (* Notar que BorrarArb libera toda la memoria usada por el árbol parámetro, dejando a éste como un puntero indefinido *) E je r c ic io 3 ( 1 0 p u n to s ) Considere las siguientes op eraciones sob re L istas de N aturales ( C ardinales) : • • • • • PROCEDURE Nula() : LN; ( * Crea la lista de naturales v ací a. * ) PROCEDURE Agregar (x : CARDINAL; l : LN) : LN; ( * I nserta un elem ento al p rincip io de la lista de naturales. * ) PROCEDURE EsNula (l : LN) : BOOLEAN; ( * V erif ica si la lista de naturales está v ací a. * ) PROCEDURE Primero (l : LN) : CARDINAL; ( * R etorna el p rim er elem ento de la lista de naturales. P recondición: la lista no es v ací a. * ) PROCEDURE Cola (l : LN) : LN; ( * R etorna la lista de naturales sin su p rim er elem ento. P recondición: la lista no es v ací a. * ) Considere tam b ié n las siguientes op eraciones sob re A rb oles B inarios de N aturales: • • • • • • PROCEDURE Vacio () : AB; ( * R etorna un á rb ol b inario v ací o. * ) PROCEDURE CreoAB (r : CARDINAL; i, d : AB) : AB; ( * R etorna un nuev o á rb ol con raí z r y sub á rb oles i y d. * ) PROCEDURE EsVacio (ab : AB) : BOOLEAN ( * R etorna T R U E si ab es v ací o. * ) PROCEDURE Raiz (ab : AB) : CARDINAL; ( * R etorna la raí z de ab . P recondición: ab es no v ací o. * ) PROCEDURE SubArbIzq (ab : AB) : AB; ( * R etorna el sub á rb ol iz q uierdo de ab . P recondición: ab es no v ací o. * ) PROCEDURE SubArbDer (ab : AB) : AB; ( * R etorna el sub á rb ol derech o de ab . P recondición: ab es no v ací o. * ) U n camino de un á rb ol b inario es una secuencia ( lista) de nodos desde la raí z a una h oj a del á rb ol. U na secuencia S 1 es prefij o de una secuencia S si, y sólo si, ex iste una secuencia S 2 tal q ue: concatenar( S 1,S 2) = S . O b serv ar q ue la secuencia v ací a es p ref ij o de cualq uier secuencia y q ue toda secuencia es p ref ij o de si m ism a. Se pide: implemen t a r u n a f u n c ió n r ec u r s iv a EsCamino q u e da do u n á r b o l b in a r io de n a t u r a les A y da da u n a lis t a de n a t u r a les L , r et o r n e T R U E s i y s ó lo s i L es un prefij o de alg ú n camino de A . L a f unción esC amino deb e im p lem entarse a p artir de las op eraciones p resentadas arrib a y no de def iniciones de tip o p ara LN o AB. N o p ueden utiliz arse f unciones o p rocedim ientos aux iliares p ara resolv er este p rob lem a. P or ej em p lo, las siguientes listas son algunos de los p ref ij os de los cam inos del á rb ol b inario ilustrado en el ej ercicio 2 : [ ] , [ 8 ] , [ 8 ,4 ] , [ 8 ,4 ,2 ] , [ 8 ,4 ,7 ,5 ] . S O L U C IO N PROCEDURE EsCamino(A :AB; l: LN):BOOLEAN; BEGIN IF EsNula(l) THEN RETURN TRUE; ELSIF EsVacio(A) THEN RETURN FALSE; ELSE RETURN (Primero(l) = Raiz(A)) AND (EsCamino(SubArbolIzq(A),Cola(l)) OR EsCamino(SubArbolDer(A),Cola(l))); END EsCamino;