Dynamické údajové štruktúry

19
Dynamické údajové štruktúry

description

Dynamické údajové štruktúry. Delenie dynamických údajových štruktúr. Lineárne zoznamy: (nazývané tiež spojové zoznamy) jednosmerné obojsmerné Stromy (rozvetvené zoznamy). 24. info. next. adr12. Jednosmerný lineárny zoznam (JLZ). skupina prvkov, prepojených ukazovateľmi v rade za sebou - PowerPoint PPT Presentation

Transcript of Dynamické údajové štruktúry

Page 1: Dynamické údajové štruktúry

Dynamické údajové štruktúry

Page 2: Dynamické údajové štruktúry

Delenie dynamických údajových štruktúr

• Lineárne zoznamy:(nazývané tiež spojové zoznamy)

– jednosmerné– obojsmerné

• Stromy(rozvetvené zoznamy)

Page 3: Dynamické údajové štruktúry

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

Page 4: Dynamické údajové štruktúry

• 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

Page 5: Dynamické údajové štruktúry

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;.....

Page 6: Dynamické údajové štruktúry

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

Page 7: Dynamické údajové štruktúry

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

Page 8: Dynamické údajové štruktúry

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

Page 9: Dynamické údajové štruktúry

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

Page 10: Dynamické údajové štruktúry

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.

Page 11: Dynamické údajové štruktúry

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

Page 12: Dynamické údajové štruktúry

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ň

Page 13: Dynamické údajové štruktúry

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:

Page 14: Dynamické údajové štruktúry

Vloženie prvku pred prvok2.variant - jednoduchší

• prvok sa pridá za hľadaný prvok

• informačné obsahy sa vymenia

Page 15: Dynamické údajové štruktúry

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;

Page 16: Dynamické údajové štruktúry

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

Page 17: Dynamické údajové štruktúry

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;

Page 18: Dynamické údajové štruktúry

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;

Page 19: Dynamické údajové štruktúry

Zrušenie zoznamu

procedure ZrusZoznam;var Prvok : Ukaz;begin while not (Zaciatok = nil) do begin Prvok := Zaciatok; Zaciatok := Zaciatok^.Next; Dispose (Prvok) endend;