190 likes | 296 Views
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
E N D
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 • 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
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ň )
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; .....
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
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
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
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
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:
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
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) end end;