(* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)
(*   Soubor: SEZNAMY.PAS                                                   *)
(*   Obsah: sablony procedur pro obsluhu obousmernych dynamickych seznamu  *)
(*   Posledni uprava: 17.8.2004                                            *)
(*   Autor: Mircosoft                                                      *)
(*   Upozorneni: tyto zdrojove kody pouzivate na vlastni nebezpeci         *)
(* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)

{predpokladam definice:

type
ukazatel = ^polozka;

polozka = record
          ...
          predchozi,dalsi:ukazatel;
          end;}

procedure pridejprvek(var prvni,posledni,kam:ukazatel);
var pom:ukazatel;
begin
new(pom{,init(...)});
if kam=nil then begin{seznam byl prazdny - predpokladam}
                pom^.predchozi:=nil; pom^.dalsi:=nil;
                prvni:=pom; posledni:=pom; kam:=pom;
                end
           else if kam=prvni then begin{da se pred prvni}
                                  pom^.predchozi:=nil;
                                  prvni^.predchozi:=kam;
                                  pom^.dalsi:=prvni;
                                  prvni:=pom;
                                  end
                             else if kam=posledni then begin{da se za posledni}
                                                       pom^.dalsi:=nil;
                                                       posledni^.dalsi:=pom;
                                                       pom^.predchozi:=posledni;
                                                       posledni:=pom;
                                                       end
                                                  else begin{vlozi se za Kam a Kam se presune na nej}
                                                       pom^.predchozi:=kam;
                                                       pom^.dalsi:=kam^.dalsi;
                                                       kam^.dalsi^.predchozi:=pom;
                                                       kam^.dalsi:=pom;
                                                       kam:=pom;
                                                       end;
end;{pridejprvek}

procedure zrusprvek(var prvni,posledni,ktery:ukazatel);
begin
if ktery=nil then exit;
if ktery=prvni then if ktery=posledni then begin{v seznamu byl jen jeden prvek}
                                           prvni:=nil; posledni:=nil;
                                           end
                                      else begin{rusime prvni prvek}
                                           prvni:=ktery^.dalsi;
                                           prvni^.predchozi:=nil;
                                           end
               else if ktery=posledni then begin{rusime posledni prvek}
                                           posledni:=ktery^.predchozi;
                                           posledni^.dalsi:=nil;
                                           end
                                      else begin{rusime prvek nekde uprostred}
                                           ktery^.predchozi^.dalsi:=ktery^.dalsi;
                                           ktery^.dalsi^.predchozi:=ktery^.predchozi;
                                           end;
dispose(ktery{,done(...)});
end;{zrusprvek}

procedure zrusseznam(var prvni,posledni:ukazatel);
var pom:ukazatel;
begin
while prvni<>nil do begin
                    pom:=prvni;
                    zrusprvek(pom);
                    end;
end;{zrusseznam}
