PACKAGE Kol11_01pak IS
TYPE Rzecz IS PRIVATE;
TYPE Spis IS LIMITED PRIVATE;
PROCEDURE Get(R: OUT Rzecz);
PROCEDURE Put(R: IN Rzecz);
PROCEDURE Wypisz (K: IN Spis);
PROCEDURE Dodaj (K: IN OUT Spis; Ind: Integer);
PROCEDURE UsunSasiedniePowtorzone (K: IN OUT Spis);
PROCEDURE UsunPowtorzone (K: IN OUT Spis);
PRIVATE
TYPE Rzecz IS RECORD
ID: Natural;
Licznik: Natural;
END RECORD;
TYPE Elem;
TYPE Wsk_Elem IS ACCESS Elem;
TYPE Elem IS RECORD
Dane: Rzecz;
Nast: Wsk_elem;
END RECORD;
TYPE Spis IS LIMITED RECORD
Pocz: Wsk_Elem:=NULL;
END RECORD;
END Kol11_01pak;
PROCEDURE Get (R: OUT Rzecz) IS
BEGIN
Put("Podaj ID rzeczy "); Get(R.ID);
Put("Podaj licznik "); Get(R.Licznik); New_line;
END Get;
PROCEDURE Put(R: IN Rzecz) IS
BEGIN
Put("("); Put(R.ID,1); Put(","); Put(R.Licznik,1);
Put(") ");
END Put;
-- procedura zwalniajaca pamiec
PROCEDURE delete IS
New Ada.Unchecked_Deallocation(Elem, wsk_elem);
PROCEDURE Wypisz(K: IN Spis) IS
pom: wsk_elem;
BEGIN
Pom:=K.Pocz; Put("Pocz->");
WHILE Pom/=NULL LOOP
Put(Pom.Dane); Put(",");
pom:=pom.nast;
END LOOP;
Put("NULL");
END Wypisz;
PROCEDURE Dodaj (K: IN OUT Spis; Ind: Integer) IS
Pom, Nowy, Wsteczny, ostatni: Wsk_Elem;
Czy_Sa:Boolean;
R: rzecz;
BEGIN
Pom:=K.Pocz;
czy_sa:=false;
WHILE Pom/=NULL Loop
IF Pom.Dane.ID=Ind THEN
Czy_Sa:=True;
exit;
END IF;
Wsteczny:=Pom;
Pom:=Pom.Nast;
END LOOP;
IF Czy_Sa=True THEN
Ostatni:=Pom;
IF Pom.Nast/=NULL THEN
WHILE Ostatni/=NULL LOOP
IF Ostatni.Nast=NULL THEN
IF Wsteczny=NULL THEN
K.Pocz:=Pom.Nast;
ELSE
Wsteczny.Nast:=Pom.Nast;
END IF;
Ostatni.Nast:=Pom;
Pom.Nast:=NULL;
EXIT;
END IF;
Ostatni:=Ostatni.Nast;
END LOOP;
END IF;
Pom.Dane.Licznik:=Pom.Dane.Licznik+1;
ELSE
R.ID:=Ind;
R.Licznik:=1;
Nowy:= NEW Elem'(R,NULL);
Pom:=K.Pocz;
IF Pom=NULL THEN
K.Pocz:=Nowy;
ELSE
WHILE Pom/=NULL LOOP
IF Pom.Nast=NULL THEN
Pom.Nast:=Nowy;
exit;
END IF;
Pom:=Pom.Nast;
END LOOP;
END IF;
END IF;
END Dodaj;
PROCEDURE Wstaw (S: IN out sznur;p: in integer) IS
Pom1, pom2:Wsk_Box;
BEGIN
IF S.Pocz=NULL THEN
S.Pocz:= NEW Box'(p, NULL);
ELSE
Pom1:=NULL;Pom2:=S.Pocz;
WHILE pom2/=null and then Pom2.Liczba<=P LOOP
Pom1:=Pom2;
Pom2:=Pom2.Nast;
END LOOP;
if pom1=null then
S.Pocz:= NEW Box'(p, pom2);
else
pom1.nast:=NEW Box'(p, pom2);
end if;
END IF;
end wstaw;
PROCEDURE Usun (S: IN OUT Sznur;P: IN Integer) IS
Pom1, Pom2:Wsk_Box;
BEGIN
IF S.Pocz=NULL THEN RETURN;END IF;
Pom1:=NULL; Pom2:=S.Pocz;
WHILE Pom2/=NULL AND THEN Pom2.Liczba<=P LOOP
IF Pom1=NULL THEN
S.Pocz:=Pom2.Nast;
Zwolnij (Pom2);
Pom2:=S.Pocz;
ELSE
Pom1.Nast:=Pom2.Nast;
Zwolnij(Pom2);
Pom2:=Pom1.Nast;
END IF;
end loop;
END Usun;