Instituto de Computación. Facultad de Ingeniería. Universidad de la República Solución Examen de Programación 2 Diciembre de 2007 Ejercicio 1.a) PROCEDURE AgregarElementos(lista : ListaEnt; VAR listacp : ListaCompEnt); VAR nuevocp, reccp: ListaCompEnt; valor, cont: INTEGER; BEGIN NEW(nuevocp); nuevocp^.sig := listacp; /* Creo celda dummy para simplificar el caso de borde */ listacp := nuevocp; reccp := nuevocp; WHILE (lista <> NIL) DO valor := lista^.info; cont := 1; WHILE ((lista^.sig <>NIL) AND (lista^.sig^.info = valor)) DO cont := cont + 1 lista := lista^.sig; END WHILE ((reccp^.sig <> NIL) AND (reccp^.sig^.info < valor)) DO reccp := reccp^.sig; END IF ((reccp^.sig = NIL) OR (reccp^.sig^.info > valor)) THEN NEW(nuevocp); nuevocp^.info := valor; nuevocp^.cant := cont; nuevocp^.sig := reccp^.sig; reccp^.sig := nuevocp; reccp := nuevocp; ELSE reccp^.sig^.cant := reccp^.sig^.cant + cont; reccp := reccp^.sig; END END reccp := listacp; listacp := listacp^.sig; DISPOSE(reccp); END AgregarElementos Página 1 de 4 Ejercicio 1.b) PROCEDURE EliminarOcurrencia(valor: INTEGER; VAR listacp : ListaCompEnt); VAR antcp, auxcp: ListaCompEnt; BEGIN antcp := NIL; auxcp := listacp; WHILE (( auxcp <> NIL) AND (auxcp^.info < valor)) DO antcp := auxcp; auxcp := auxcp^.sig; END IF ((auxcp <> NIL) AND (auxcp^.info == valor)) THEN IF (auxcp = listacp) THEN IF (auxcp^.cant = 1) THEN listacp := listacp^.sig; DISPOSE(auxcp); ELSE auxcp^.cant := auxcp^.cant -1; END ELSE IF (auxcp^.cant = 1) THEN antcp^.sig := auxcp^.sig; DISPOSE(auxcp); ELSE auxcp^.cant := auxcp^.cant -1; END END END END EliminarOcurrencia Ejercicio 2 Representación: TYPE ArbGen = POINTER TO ArbNodo; ArbNodo = RECORD data : T; hermano : ArbGen; hijo : ArbGen; END; Página 2 de 4 PROCEDURE ArbolHoja(elem : T) : ArbGen; VAR arbol: ArbGen; BEGIN NEW (arbol); arbol^.data := elem; arbol^.hermano := NIL; arbol^.hijo := NIL; RETURN arbol; END ArbolHoja; PROCEDURE EsArbolHoja(a : ArbGen) : Boolean; BEGIN RETURN (a^.hijo = NIL) AND (a^.hermano = NIL); END EsArbolHoja; PROCEDURE Pertenece(a : ArbGen; elem : T) : Boolean; BEGIN IF (a = NIL) THEN RETURN FALSE; ELSIF (a^.data = v) THEN RETURN TRUE; ELSE RETURN (Pertenece(a^.hijo,v) OR Pertenece(a^.hermano,v)); END; END Pertenece; (* Proc. auxiliar que realiza la búsqueda de un nodo del árbol. *) (* Retorna un puntero al nodo del árbol con dato v, si v pertenece al arbol a, o NIL en cualquier otro caso *) PROCEDURE Buscar(a : ArbGen; v : T) : ArbGen; VAR aBuscar: ArbGen; BEGIN IF (a = NIL) THEN RETURN NIL; ELSIF (a^.data = v) THEN RETURN a; ELSE aBuscar := Buscar(a^.hijo,v); IF (aBuscar = NIL) THEN aBuscar := Buscar(a^.hermano, v); END; RETURN aBuscar; END; END Buscar; Página 3 de 4 PROCEDURE Insertar(VAR a : ArbGen; v, w : T); VAR padre, nuevo: ArbGen; BEGIN IF (NOT Pertenece(a, v)) THEN padre := Buscar(a, w); IF (padre <> NIL) THEN nuevo := ArbolHoja(v); nuevo^.hermano := padre^.hijo; padre^.hijo := nuevo; END; END; END Insertar; (* Elimina todo el arbol. *) PROCEDURE BorrarTodo(VAR a : ArbGen); BEGIN IF (a <> NIL) THEN BorrarTodo(a^.hijo); BorrarTodo(a^.hermano); DISPOSE(a); a := NIL; END; END BorrarTodo; PROCEDURE Borrar(VAR a : ArbGen; elem : T); PROCEDURE Borrar_aux(VAR a : ArbGen; elem : T); VAR aux: ArbGen; BEGIN IF (a <> NIL) THEN IF (a^.data <> elem) THEN Borrar_aux(a^.hermano, elem); Borrar_aux(a^.hijo, elem); ELSE aBorrar := a; a := a^.hermano; aBorrar^.hermano := NIL; BorrarTodo(aBorrar); END; END; END Borrar_aux; BEGIN IF (a^.data <> elem) THEN Borrar_aux(a, elem); END END Borrar; In.Co. - Instituto de Computación Página 4 de 4