1 / 19

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). 24. info. next. adr12. Jednosmerný lineárny zoznam (JLZ). skupina prvkov, prepojených ukazovateľmi v rade za sebou

byron-gay
Download Presentation

Dynamické údajové štruktúry

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Dynamické údajové štruktúry

  2. Delenie dynamických údajových štruktúr • Lineárne zoznamy:(nazývané tiež spojové zoznamy) • jednosmerné • obojsmerné • Stromy(rozvetvené zoznamy)

  3. 24 info next adr12 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

  4. JLZ sa tiež nazýva zásobník (Stack) • LIFO – Last In, First Out Last in First out položka3 položka2 položka1 (Vyzerá to ako kôš na bielizeň )

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

  6. info info next next 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. zoznam info next

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

  8. novy info next info info pred po next next Vloženie prvku na začiatok JLZ 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; zoznam

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

  10. 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; typePUkaz = ^ 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. V programe to vyzerá nasledovne:

  11. Vloženie prvku za prvok procedure VlozZa(Nov: PUkaz;var Zoz: PUkaz); begin Nov^.Next := Zoz^.Next; Zoz^.Next := Nov; end; nov zoz info next info info info next next adr3 next pred za tento prvok po

  12. 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ň

  13. 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:

  14. Vloženie prvku pred prvok2.variant - jednoduchší • prvok sa pridá za hľadaný prvok • informačné obsahy sa vymenia

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

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

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

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

  19. Zrušenie zoznamu procedure ZrusZoznam; var Prvok : Ukaz; begin while not (Zaciatok = nil) do begin Prvok := Zaciatok; Zaciatok := Zaciatok^.Next; Dispose (Prvok) end end;

More Related