with Ada.Unchecked_Deallocation; with Ada.Text_IO; -- nyomkövetéshez package body Vermek is procedure Felszabadít is new Ada.Unchecked_Deallocation(Csúcs, Mutató); procedure Push( V: in out Verem; E: in Elem ) is begin V.Veremtető := new Csúcs'(E,V.Veremtető); V.Méret := V.Méret + 1; end; procedure Pop( V: in out Verem; E: out Elem ) is Régi: Mutató := V.Veremtető; begin E := Top(V); V.Veremtető := V.Veremtető.Következő; V.Méret := V.Méret - 1; Felszabadít(Régi); end; function Top( V: Verem ) return Elem is begin return V.Veremtető.Adat; exception when Constraint_Error => raise Üres_A_Verem; end; function Is_Empty( V: Verem ) return Boolean is begin return V.Veremtető = null; end; function Is_Full( V: Verem ) return Boolean is begin return false; end; function Size( V: Verem ) return Natural is begin return V.Méret; end; procedure Finalize ( V: in out Verem ) is P: Mutató; begin Ada.Text_IO.Put_Line("Finalize"); -- nyomkövetés while V.Veremtető /= null loop P := V.Veremtető; V.Veremtető := V.Veremtető.Következő; Felszabadít(P); end loop; end Finalize; -- procedure Adjust( V: in out Verem ) is -- Eredeti: Mutató := V.Veremtető; -- Másolat: Mutató; -- begin -- if Eredeti /= null then -- Másolat := new Csúcs'(Eredeti.Adat, null); -- V.Veremtető := Másolat; -- while Eredeti.Következő /= null loop -- Eredeti := Eredeti.Következő; -- Másolat.Következő := new Csúcs'(Eredeti.Adat, null); -- Másolat := Másolat.Következő; -- end loop; -- end if; -- end Adjust; procedure Adjust( V: in out Verem ) is P: Mutató := V.Veremtető; begin Ada.Text_IO.Put_Line("Adjust"); -- nyomkövetés if P /= null then P := new Csúcs'(P.all); V.Veremtető := P; while P.Következő /= null loop P.Következő := new Csúcs'(P.Következő.all); P := P.Következő; end loop; end if; end Adjust; function "=" ( A, B: Verem ) return Boolean is P: Mutató := A.Veremtető; Q: Mutató := B.Veremtető; begin if A.Méret /= B.Méret then return false; end if; while P /= null loop -- akkor és csak akkor, ha Q sem null if P.Adat /= Q.Adat then return false; end if; P := P.Következő; Q := Q.Következő; end loop; return true; end "="; end Vermek;