Solución Examen de Programación 2

Anuncio
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
Descargar