Pascal I.      Pascal II.      Delphi       Linkek     
Pascal II.
01. Eljárások, függv...
01. Gyakorló feladatok
02. Felsorolt típus, ...
02. Gyakorló feladatok
03. Állományok kezelése
03. Gyakorló feladatok
04. Unitok, CRT unit
04. Gyakorló feladatok
05. DOS unit, rendezé...
05. Gyakorló feladatok
06. Rekurzió, quicksort
06. Gyakorló feladatok
07. Backtracking
07. Gyakorló feladatok
08. GRAPH unit
08. Gyakorló feladatok
09. Kép mozgatása
09. Gyakorló feladatok
10. Winmouse unit
10. Gyakorló feladatok
11. Dinamikus adatsze...
11. Gyakorló feladatok
12. Dinamikus adatsze...
12. Gyakorló feladatok
13. Dinamikus adatsze...
13. Gyakorló feladatok
Programozás 2 (Pascal)


     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.

     

(C) 2004-2013, PaedDr. Végh Ladislav, Komárno, Szlovákia