PACKAGE Sznury IS
TYPE Elem IS PRIVATE;
TYPE Sznur IS PRIVATE;
PROCEDURE Wypisz (S : IN OUT Sznur);
PROCEDURE Wpisz (S : IN OUT Sznur;X : IN Integer);
PROCEDURE Usuncodrugi (S : IN OUT Sznur;N : Integer);
PRIVATE
TYPE Wsk IS ACCESS Elem;
TYPE Elem IS RECORD
Dane : Integer;
Nast : Wsk;
END RECORD;
TYPE Sznur IS RECORD
Pocz : Wsk := NULL;
Kon : Wsk := NULL;
END RECORD;
END Sznury;
PROCEDURE Free IS
NEW Ada.Unchecked_Deallocation(Elem,Wsk);
PROCEDURE Wypisz (S : IN OUT Sznur) IS
Pom : Wsk := S.Pocz;
BEGIN
Put("Poczatek");
WHILE Pom/=NULL LOOP
Put(" -> ");
Put(Pom.Dane,0);
Pom:=Pom.Nast;
END LOOP;
Put(" -> Koniec");
New_Line;
END Wypisz;
PROCEDURE Wpisz (S : IN OUT Sznur;X : IN Integer) IS
BEGIN
IF S.Pocz=NULL THEN
S.Pocz:=NEW Elem'(X,NULL);
S.Kon:=S.Pocz;
ELSE
S.Kon.Nast:=NEW Elem'(X,NULL);
S.Kon:=S.Kon.Nast;
END IF;
END Wpisz;
PROCEDURE Usuncodrugi (S : IN OUT Sznur;N : Integer) IS
Pom,Killer : Wsk;
I : Integer := 1;
BEGIN
IF S.Pocz/=NULL THEN
Pom:=S.Pocz;
IF N=1 THEN
Killer:=S.Pocz;
S.Pocz:=S.Pocz.Nast;
Free(Killer);
Pom:=S.Pocz;
ELSE
WHILE Pom/=NULL AND I<N-1 LOOP
I:=I+1;
Pom:=Pom.Nast;
END LOOP;
END IF;
WHILE Pom/=NULL AND THEN Pom.Nast/=NULL LOOP
Killer:=Pom.Nast;
Pom.Nast:=Pom.Nast.Nast;
Free(Killer);
Pom:=Pom.Nast;
END LOOP;
END IF;
END Usuncodrugi;
PROCEDURE Usun (L : IN OUT Lista; V : Integer) IS
Pred : Node_Pointer := NULL;
Succ : Node_Pointer := L.Head;
P : Node_Pointer;
BEGIN
WHILE Succ /= NULL AND THEN V /= Succ.Value LOOP
Pred := Succ;
Succ := Succ.Next;
END LOOP;
WHILE Succ /= NULL AND THEN Succ.Value = V LOOP
P := Succ;
Succ := Succ.Next;
IF Pred = NULL THEN
L.Head := Succ;
ELSE
Pred.Next := Succ;
END IF;
Free(P);
END LOOP;
END Usun;