lunes, 21 de enero de 2008

Eliminar El Primer Nodo de la Lista en lenguaje ADA

Implemente un procedimiento llamado Eliminar, con dos parámetros, el primero de de tipo P_Nodo_Simple que representa las dirección de comienzo de una lista simplemente encadena y el segundo de tipo Integer. La función debe eliminar el primer nodo de la lista cuyo campo Info coincida con el valor del segundo parámetro.

-- Fichero listas

with Unchecked_Deallocation;

package Listas is
-- Tipos para construir una lista simplemente encadenada

type Nodo_Simple;
type P_Nodo_Simple is access Nodo_Simple;
type Nodo_Simple is record
Info : Integer;
Siguiente : P_Nodo_Simple;
end record;

-- Procedimiento para liberar un Nodo_Simple

procedure Liberar is new Unchecked_Deallocation (
Nodo_Simple,
P_Nodo_Simple);

end Listas;

with Listas; use Listas;

procedure Eliminar (Lista : in out P_Nodo_Simple; V : Integer) is
Iterador : P_Nodo_Simple := Lista;
Eliminado : P_Nodo_Simple := null;
begin
-- Mientras haya lista
if Iterador /= null then
-- en caso de que el valor sea el del primer nodo
if Iterador.Info = V then
-- avanzamos lista
Lista := Lista.Siguiente;
-- y liberamos iterador
Liberar (Iterador);
else
-- mientras no llegemos al final y no sea el valor
while Iterador.Siguiente /= null and then Iterador.Siguiente.Info /= V
loop
-- avanzamos iterador
Iterador := Iterador.Siguiente;
end loop;
-- preguntamos por la condicion critica, si es esta, es que se ha
-- encontrado el valor
if Iterador.Siguiente /= null then
-- Guardamos la direccion que queremos eliminar
Eliminado := Iterador.Siguiente;
-- avanzamos iterador al siguiente nodo
Iterador.Siguiente := Eliminado.Siguiente;
-- y liberamos
Liberar (Eliminado);
end if;
end if;
end if;
end Eliminar;