Dynamické údajové štruktúry
description
Transcript of Dynamické údajové štruktúry
Dynamické údajové štruktúry
Delenie dynamických údajových štruktúr
• Lineárne zoznamy:(nazývané tiež spojové zoznamy)
– jednosmerné– obojsmerné
• Stromy(rozvetvené zoznamy)
Jednosmerný lineárny zoznam (JLZ)
• skupina prvkov, prepojených ukazovateľmi v rade za sebou
• každý prvok má dve časti:– informačnú, ktorá má v sebe hodnotu
premennej– smerovaciu, ktorá ukazuje na ďalšiu (next)
položku v zozname
info
next
24
adr12
• JLZ sa tiež nazýva zásobník (Stack)
• LIFO – Last In, First OutLast in First out
(Vyzerá to ako kôš na bielizeň )položka1
položka2
položka3
Reprezentácia JLZ v TPascale
• Používa sa deklarácia– typu ukazovateľ na dyn. premennú– typu záznam pre prvok zoznamu– statickej premennej typu ukazovateľ na dyn. premennú
type PUkaz = ^ TUkaz;
TUkaz = record Info : Integer;
Next : PUkaz end;
var Zoznam : PUkaz;.....
Statická premenná zoznam má v sebe adresu na prvý prvok lineárneho zoznamu a každý prvok ukazuje vždy na ďalší prvok v zozname. Posledný prvok neukazuje nikam, v časti Next má uloženú hodnotu nil.
info
nextinfo
next
info
next
zoznam
Základné operácie s JLZ
• vloženie prvku na začiatok
• vloženie za niektorý prvok zoznamu
• vloženie pred niektorý prvok zoznamu
• hľadanie prvku v zozname
• vymazanie prvku zo zoznamu
procedure VlozNaZaciatok (Novy: PUkaz;var Zoznam: PUkaz);
begin Novy ^ . Next := Zoznam; {adresa zo stat. premennej sa uloží do položky Next dyn.
premennej Novy^}
Zoznam := Novy; {adresa zo stat. premennej Novy sa uloží do stat. premennej Zoznam, teraz obe premenné ukazujú na začiatok JLZ}
end;
Vloženie prvku na začiatok JLZ
zoznam
info
nextinfo
next
info
next
novy
pred
po
Vloženie prvku na začiatok JLZ
• Takéto pridávanie platí aj pre prázdny lineárny zoznam
pred: po:
zoznam zoznam
info
next
V programe to vyzerá nasledovne:• bez použitia procedúry:
Program NovyPrvok;type
PUkaz = ^ TUkaz; TUkaz = record Info : Integer;
Next : PUkaz end;
var Zoznam, Novy : PUkaz;begin Zoznam := nil; Novy := nil; New (Novy);
Novy ^ . Next := Zoznam; Zoznam := Novy; ..... Dispose (Novy)
end.
• s použitím procedúry:
Program NovyPrvok2;type PUkaz = ^ TUkaz;
TUkaz = record Info : Integer;
Next : PUkaz end;
var Zoznam, Novy : PUkaz;
procedure VlozNaZaciatok (Nov: PUkaz;var Zoz: PUkaz); begin Nov ^ . Next := Zoz;
Zoz := Nov; end;
begin Zoznam := nil;
Novy := nil; New (Novy); VlozNaZaciatok (Novy: PUkaz;var Zoznam:
PUkaz); Dispose(Novy)
end.
Vloženie prvku za prvok
procedure VlozZa(Nov: PUkaz;var Zoz: PUkaz);
begin
Nov^.Next := Zoz^.Next;
Zoz^.Next := Nov;
end;
info
next info
next adr3
info
next
nov
pred
po
info
next
zoz
za tento prvok
Vloženie prvku pred prvok
Je ťažké, lebo:
• zoznam je jednosmerný
• ukazovateľ na predchodcu nevieme
Rieši sa to takto:
• vstúpiť znovu na začiatok JLZ
• nájsť predchodcu
• vložiť nový prvok zaň
Vloženie prvku pred prvok1.variant
procedure VlozPred(Nov, PredZoz: PUkaz;var Zoz: PUkaz);
var ZaZoz:PUkaz;
begin
if PredZoz = Zoz then
VlozNaZaciatok (Nov,Zoz)
else
begin
ZaZoz:= Zoz;
while ZaZoz ^.Next <> PredZoz do
ZaZoz := ZozZoz^.Next;
VlozZa(Nov, ZaZoz)
end
end;
Cestovanie po položkách, až kým nenájdeme hľadaný prvok, je časovo
náročné a zložité, preto sa používa finta „fň“ , čiže 2. variant:
Vloženie prvku pred prvok2.variant - jednoduchší
• prvok sa pridá za hľadaný prvok
• informačné obsahy sa vymenia
Vloženie prvku pred prvok2.variant - jednoduchší
procedure VlozPred2 (Nov, PredZoz:);
var Pom : InfoTyp;
begin
{ finta : zaradíme zaň }
Nov ^ . Next := PredZoz ^ . Next;
PredZoz ^ . Next := Nov;
{ a vymeníme obsahy }
Pom := Nov ^ . Info;
Nov ^ . Info := PredZoz ^ . Info;
PredZoz ^ . Info := Pom
end;
Prechod JL zoznamom
• Najviac sa používa sa pri výpise JLZ
• Prechádzame postupne každým prvkom a zároveň prvky vypisujeme na obrazovku
Prechod JL zoznamom
procedure VypisZoznam;var Prvok : PUkaz; begin Prvok := Zaciatok; while Prvok <> nil do begin Write (Prvok^.Info:3); Prvok :=Prvok^.Next end end;
Hľadanie prvku v jednosmernom lineárnom zozname
function Najdi (Prvok :PUkaz; Hladany:integer):PUkaz;
begin while (Prvok <> nil) and (hladany <> Prvok^.Info) do begin Prvok := Prvok^.Next; end; Najdi:= Prvok;end;procedure Najdi(var Zoz: PUkaz);var Prv:Integer;begin writeln('Zadaj prvok'); readln(Prv); Adr:=Najdi(Prvok,prv); if Adr<> nil then writeln('Nasiel som') else writeln('Nenasiel som')end;
Zrušenie zoznamu
procedure ZrusZoznam;var Prvok : Ukaz;begin while not (Zaciatok = nil) do begin Prvok := Zaciatok; Zaciatok := Zaciatok^.Next; Dispose (Prvok) endend;