13
Dinamikus adatszerkezetek - kétirányú rendezett láncolt
kétirányú rendezett láncolt lista
13.1. Kétirányú rendezett láncolt lista
Az
alábbi animáció szemlélteti a kétirányú (nem rendezett) láncolt listát. A
kétirányú láncolt listában nem csak mindegyik elem mutat a következő elemre (ahogy
az egyirányú láncolt listában volt), de mindegyik elem tartalmaz egy mutatót az
előtte levő elemre is. Így a mutatókkal nem csak a következő elemekre, de az
előző elemekre is tudunk ugrani az nélkül, hogy az elejétől végig kéne járnunk a
listát.
A következő
példában egy rendezett kétirányú
láncolt listát alakítunk ki. A lista
mindegyik eleme tartalmazza egy személy nevét,
születési évét, egy
mutatót a lista következő elemére és egy
mutatót a lista előző elemére. A listát úgy
alakítjuk ki, hogy az
mindig rendezett legyen a nevek szerint. Tehát az új
elemet mindig a
lista megfelelő helyére szúrjuk be.
Ebben a programban a beolvasás után kiírjuk
az elemeket, majd beolvasunk egy nevet a listából. A
beolvasott nevet megkeressük a listában és
kitöröljük onnan (ha létezik). A
törlés után újból kiírjuk a
lista összes elemét.
A program végén az előző programhoz
hasonlóan felszabadítjuk a lefoglalt
memóriát egy ciklus segítségével.
program
Pelda34; { ketiranyu lancolt lista }
uses crt;
type PTElem = ^TElem; { PTElem egy mutato, ami TElem tipusra mutat }
TElem = record { TElem tipus definialasa }
nev: String;
szev: Integer;
elo,kov: PTElem;
end;
var elso,akt,uj: PTElem;
i,x: integer;
s: string;
begin
clrscr;
write('Mennyi elemet akarsz megadni? ');
readln(x); { elemek megadasa }
for i:=1 to x do
begin
writeln;
new(uj);
write(i:2,'. Nev: ');
readln(uj^.nev);
write(' Szuletesi ev: ');
readln(uj^.szev);
uj^.elo := nil;
uj^.kov := nil;
if elso=nil then
elso := uj { elso elem }
else
begin { mar van elso }
akt := elso;
if uj^.nev<akt^.nev then
begin { elsonel kisebb }
uj^.kov := elso;
elso^.elo := uj;
elso := uj;
end
else
begin { ha elsonel nagyobb, megkeressuk a helyet }
while (akt^.kov<>nil) and
(akt^.kov^.nev<=uj^.nev) do
akt := akt^.kov; { majd a megfelelo helyre beszurjuk }
uj^.kov := akt^.kov;
uj^.elo := akt;
akt^.kov := uj;
uj^.kov^.elo := uj;
end;
end;
end; { elemek kiirasa }
writeln;
akt := elso;
while akt<>nil do
begin
writeln(akt^.nev:10,akt^.szev:5);
akt := akt^.kov;
end; { elem torlese }
writeln;
write('Melyik nevet szeretned torolni? ');
readln(s);
akt := elso;
while (akt<>nil) and (akt^.nev<>s) do
akt:=akt^.kov;
if akt=nil then
writeln('Nincs ilyen nev!')
else
begin
if akt^.elo<>nil then
akt^.elo^.kov := akt^.kov
else elso := akt^.kov;
if akt^.kov<>nil then
akt^.kov^.elo := akt^.elo;
dispose(akt);
end; { elemek kiirasa }
writeln;
akt := elso;
while akt<>nil do
begin
writeln(akt^.nev:10,akt^.szev:5);
akt := akt^.kov;
end; { memoria felszabaditasa }
akt := elso;
while akt<>nil do
begin
elso := akt^.kov;
dispose(akt);
akt := elso;
end;
readkey;
end.