| Lista dwukierunkowa |
|
program Lista_dwukierunkowa;
uses  Crt; type  TWskaznik = ^TElement;  TElement = record                Liczba : Byte;                Pop, Nast : TWskaznik;              end; var  ListaLewy, ListaPrawy : TWskaznik;  Liczba : Byte;  Znak : Char;  P : Pointer; procedure UstawZLewej (Liczba: Byte); {lewa strony listy} var  E : TWskaznik; begin  New (E);  E^.Liczba := Liczba;  E^.Pop := Nil;  if (ListaLewy = nil) then  begin    E^.Nast := Nil; ListaLewy := E; ListaPrawy := E;  end  else  begin    ListaLewy^.Pop := E; E^.Nast := ListaLewy; ListaLewy := E;  end; end; procedure UstawZPrawej (Liczba: Byte); {prawa strony listy} var  E : TWskaznik; begin  New (E);  E^.Liczba := Liczba;  E^.Nast := Nil;  if (ListaPrawy = nil) then  begin    E^.Pop := Nil; ListaPrawy := E; ListaLewy := E;  end  else  begin    ListaPrawy^.Nast := E; E^.Pop := ListaPrawy; ListaPrawy := E;  end; end; procedure Usun (Liczba : Byte); {usuwa klucz Liczba}                                         } var  E, Nast, Pop : TWskaznik; begin  if ListaLewy <> nil then  begin    E := ListaLewy;    while E<>nil do      if E^.Liczba = Liczba then      begin        if E^.Pop = Nil then { pierwszy z lewej }          if E^.Nast = Nil then { takze pierwszy z prawej }          begin            ListaLewy := Nil; ListaPrawy := Nil          end          else { Pierwszy, ale nie jedyny }          begin            Nast := E^.Nast; Nast^.Pop := E^.Pop; ListaLewy := Nast;          end        else { nie jest pierwszy z lewej }          if E^.Nast = Nil then { ale pierwszy z prawej }          begin            Pop := E^.Pop; Pop^.Nast := E^.Nast; ListaPrawy := Pop;          end          else          begin            Nast := E^.Nast; Pop := E^.Pop;            Pop^.Nast := E^.Nast; Nast^.Pop := E^.Pop;          end;        Pop := E;        E := E^.Nast;        Dispose (Pop);      end      else        E := E^.Nast  end; end; procedure WypiszListeZLewej; var  E : TWskaznik; begin  E := ListaLewy;  while E <> nil do  begin    write (E^.Liczba, ' ');    E := E^.Nast;  end; end; procedure WypiszListeZPrawej; var  E : TWskaznik; begin  E := ListaPrawy;  while E <> nil do  begin    write (E^.Liczba, ' ');    E := E^.Pop;  end; end; begin  ListaLewy := nil;  ListaPrawy := nil;  repeat    ClrScr;    write ('Lista: ');    WypiszListeZLewej; write (' - od tylu: '); WypiszListeZPrawej;    writeln;    writeln ('L - ustaw z lewej, P - ustaw z prawej, U - usun, K - koniec');    Znak := UpCase(ReadKey);    if znak in ['U', 'L', 'P'] then    begin      repeat        write ('Podaj liczbe z zakresu (1..255): ');        readln (Liczba);      until Liczba>0;      if Znak = 'L' then        UstawZLewej (Liczba)      else if Znak = 'P' then        UstawZPrawej (Liczba)      else        Usun (Liczba);    end;    if ((Znak='L') or (Znak='P')) then    begin      write ('Nowa kolejka: ');      WypiszListeZLewej; write (' - od tylu: '); WypiszListeZPrawej;      writeln; writeln ('Wcisnij Enter');      readln;    end;  until (Znak = 'K'); end. |
;



