Lista dwukierunkowa z elementem aktualnym jest listą dwukierunkową z trzema wyróżnionymi elementami: wskaźnik do początku, wskaźnik do końca i wskaźnik do tzw. rekordu aktualnego. Napisać program zawierający następujące procedury/funkcje: inicjalizacja, wstawienie elementu pod wskaźnikiem aktualnym, usuwanie rekordu pod wskaźnikiem aktualnym, przesuwanie wskaźnika aktualnego w lewo lub w prawo. Program powinien demonstrować takie operacje w trybie interakcyjnym (tzn. za pomocą menu).
program zad2;
uses crt;
type lista=^element;
element=record
liczba:integer;
next,prev:lista;
end;
var head,aktualny:lista;
key,znak:char;
i,n:integer;
function nowy:lista;
var v:lista;
begin
new(v);
v^.next:=Nil;
v^.prev:=Nil;
read(v^.liczba);
nowy:=v;
end;
procedure dodaj(v:lista);
begin
if head<>Nil then head^.prev:=v;
v^.next:=head;
head:=v;
v^.prev:=Nil;
end;
procedure dodajpodaktualny(v:lista);
begin
if aktualny=head then begin
aktualny^.prev:=v;
v^.next:=aktualny;
aktualny:=v;
head:=aktualny;
end else begin
v^.next:=aktualny;
v^.prev:=aktualny^.prev;
aktualny^.prev:=v;
v^.prev^.next:=v;
aktualny:=v;
end;
end;
procedure usunpodaktualnym(v:lista);
begin
if v^.prev<>Nil then v^.prev^.next:=v^.next
else begin
head:=v^.next;
if head<>Nil then head^.prev:=Nil;
end;
if v^.next<>Nil then v^.next^.prev:=v^.prev;
if v^.prev<>Nil then aktualny:=v^.prev
else if v^.next<>Nil then aktualny:=v^.next
else writeln('`-lista jest pusta');
end;
procedure przesunaktualny(x:char);
begin
if ((x='l') and (aktualny^.prev<>Nil)) then aktualny:=aktualny^.prev
else if (x='l') then write('`-operacja niedozwolona - wyjscie poza liste')
else if ((x='p') and (aktualny^.next<>Nil)) then aktualny:=aktualny^.next
else if (x='p') then write('`-operacja niedozwolona - wyjscie poza liste')
end;
procedure drukuj;
var v:lista;
begin
v:=head;
while v<>Nil do begin
write(v^.liczba,' ');
v:=v^.next;
end;
writeln;
write('`-nacisnij enter aby wybrac inna pozycje z menu');
readln;
end;
begin
head:=Nil;
n:=0;
repeat
clrscr;
writeln('Wybierz pozycje z menu:');
writeln('----------------------------------------------');
writeln('(1) - inicjalizacja listy');
writeln('(2) - dodaj element pod aktualnym wskaznikiem');
writeln('(3) - usun element pod aktualnym wskaznikiem');
writeln('(4) - przesun aktualny wskaznik');
writeln('(5) - wyswietl liste');
writeln('(6) - wyjscie z programu');
writeln('----------------------------------------------');
key:=readkey;
case key of
'1':begin
write('`-podaj dlugosc listy: ');
readln(n);
write('`-podaj ',n,' elementow (liczby oddzielone spacja): ');
for i:=1 to n do dodaj(nowy);
readln;
write('`-lista skladajaca sie z ',n,' elementow: ');
drukuj;
aktualny:=head;
end;
'2':begin
if (n<=0) then begin
writeln('`-zainicjalizuj liste');
readln;
end else begin
write('`-podaj element jaki chcesz dodac pod aktualny wskaznik: ');
dodajpodaktualny(nowy);
n:=n+1;
readln;
write('`-lista skladajaca sie z ',n,' elementow: ');
drukuj;
end;
end;
'3':begin
if (n<=0) then begin
writeln('`-lista jest pusta');
readln;
end else begin
write('`-czy chcesz usunac element pod aktualnym wskaznikiem? t/n: ');
readln(znak);
if znak='t' then begin
usunpodaktualnym(aktualny);
n:=n-1;
if n<>0 then writeln('`-od teraz pod aktualnym wskaznikiem jest liczba: ',aktualny^.liczba);
if n<>0 then write('`-lista skladajaca sie z ',n,' elementow: ');
drukuj;
end else begin
write('`-lista skladajaca sie z ',n,' elementow nie ulegla zmianie: ');
drukuj;
end;
end;
end;
'4':begin
if (n<=0) then begin
writeln('`-lista jest pusta');
readln;
end else begin
writeln('`-na poczatku wskaznik aktualny jest ustawiony na ostatnio dodanym elemencie');
write('`-wpisz l aby przesunac wskaznik w lewo albo p gdy w prawo: ');
readln(znak);
przesunaktualny(znak);
if ((znak='l') and (aktualny^.prev<>Nil)) then write('`-wskaznik przesunieto w lewo - pod aktualnym wskaznikiem jest liczba: ',aktualny^.liczba)
else if ((znak='p') and (aktualny^.next<>Nil)) then write('`-wskaznik przesunieto w prawo - pod aktualnym wskaznikiem jest liczba: ',aktualny^.liczba);
readln;
end;
end;
'5':begin
if (n<=0) then begin
writeln('`-lista jest pusta');
readln;
end else begin
write('`-lista skladajaca sie z ',n,' elementow: ');
drukuj;
end;
end;
end;
until key='6';
end.Wynik z konsoli:
maniek@maniek:~$ ./zad2
Wybierz pozycje z menu:
----------------------------------------------
(1) - inicjalizacja listy
(2) - dodaj element pod aktualnym wskaznikiem
(3) - usun element pod aktualnym wskaznikiem
(4) - przesun aktualny wskaznik
(5) - wyswietl liste
(6) - wyjscie z programu
----------------------------------------------
`-podaj dlugosc listy: 5
`-podaj 5 elementow (liczby oddzielone spacja): 1 10 11 4 5
`-lista skladajaca sie z 5 elementow: 5 4 11 10 1
`-nacisnij enter aby wybrac inna pozycje z menuHTML w komentarzach jest wyłączony, możesz jednak skorzystać z Textile Lite.