W liście jest chyba jakiś błąd, albo nie potrafię wytłumaczyć, dlaczego jeżeli pocz = nil, to nie wykonuje pierwszego warunku.
unit _lista;
interface
uses SysUtils, _wpis, _powiadamiacz;
type
plista = ^lista_powiadamiaczy;
lista_powiadamiaczy = record
pow : Powiadamiacz;
nast : plista;
end;
procedure dodaj(pocz : plista; nowy_wpis : Powiadamiacz);
procedure usun(pocz : plista; ktory : plista);
procedure czysc(pocz : plista);
function poprzedni(pocz : plista; wsk : plista) : plista;
implementation
procedure dodaj(pocz : plista; nowy_wpis : Powiadamiacz);
var nowy, curr, prev : plista;
begin
New(nowy);
nowy^.pow := nowy_wpis;
nowy^.nast := nil;
if(pocz = nil) then // wrzucenie na początek(lista jest pusta)
pocz := nowy
else
begin
// szukamy mu miejsca
curr := pocz;
prev := nil;
while (porownaj(curr^.pow.pobierz_wpis(), nowy^.pow.pobierz_wpis()) = true) do
begin
prev := curr;
curr := curr^.nast;
if (curr = nil) then
begin // wstawienie na koniec
curr^.nast := nowy;
exit;
end;
end;
if (prev = nil) then // wstawienie na początek
begin
nowy^.nast := curr;
curr := nowy;
end
else // wstawineie w środek
begin
nowy^.nast := curr;
prev^.nast := nowy;
end;
end;
end;
procedure usun(pocz : plista; ktory : plista);
var temp : plista;
begin
if (ktory = pocz) then // usuń z początku
begin
pocz := ktory^.nast;
end
else if(ktory^.nast = nil) then // usuń z końca
begin
temp := poprzedni(pocz, ktory); // szukaj poprzednika
temp^.nast := nil;
end
else // usuń ze środka
begin
temp := poprzedni(pocz, ktory);
temp^.nast := ktory^.nast;
end;
Dispose(ktory);
end;
procedure czysc(pocz : plista);
var temp : plista;
begin
while pocz <> nil do
begin
temp := pocz;
pocz := pocz^.nast;
temp^.pow.Free;
Dispose(temp);
end;
pocz := nil;
end;
function poprzedni(pocz : plista; wsk : plista) : plista;
var temp : plista;
begin
temp := pocz; // poszukiwanie poprzednika
while (temp^.nast <> wsk) do
begin
temp := temp^.nast;
end;
if (temp = pocz) then temp := nil; // początek nie ma poprzednika
result := temp;
end;
end.