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.