Strukture podataka (dinamicke)

Embed Size (px)

Citation preview

  • 8/19/2019 Strukture podataka (dinamicke)

    1/25

    SVEU!ILIŠTE U ZAGREBU

    FAKULTET ORGANIZACIJE I INFORMATIKEVARAŽDIN

    Seminarski rad iz kolegija Programiranje II

    Implementacija dinami!kih strukturaImplementacija dinami!kih strukturaImplementacija dinami!kih strukturaImplementacija dinami!kih struktura

    podatakapodatakapodatakapodataka

    Autor rada: Darko GolnerBr. indeksa: xxxxxxx

    U Varaždinu, sije!anj 200".

  • 8/19/2019 Strukture podataka (dinamicke)

    2/25

      " 

    Sadržaj:

    ". Uvod2. Definicija dinami!kih struktura podataka3. Lista (jednostruko i dvostruko vezana)4. Stog5. Red6. Binarno stablo7. Implementacija dinami!kih struktura podataka u Pascalu i C++-u

    6.". Implementacija jednostruko vezane liste

    6.2. Implementacija dvostruko vezane liste6.3. Implementacija stoga6.4. Implementacija reda6.5. Implementacija binarnog stabla

    8. Zaklju!ak vezan uz temu seminarskog rada9. Literatura

  • 8/19/2019 Strukture podataka (dinamicke)

    3/25

      2

    1. Uvod

    Mnogi programski jezici koriste apstraktne tipove podataka. Njih definira programer kako

     bi unaprijedio postoje#e tipove podataka. Takvi tipovi podataka se sastoje od vrijednosti i

    skupa operacija koji su nad njima definirani. To nam omogu#uje pisanje složenih programa

     pomo#u relativno jednostavnih struktura. Njihovo razumijevanje je potrebno svakom

     profesionalnije orijentiranom programeru, a kada se usvoje, predstavljaju prili!no jako oru$e

    za rješavanje kompleksnih problema. Kako bi se dinami!ke strukture podataka približile

    svima, napisan je ovaj seminarski rad koji osim teorijskog dijela sadrži i prakti!ni dio. U

    ovom seminarskom radu pobliže su opisane strukture liste, reda, stoga i stabla. Uz opis svake

    strukture, priložen je i prakti!ni dio. On se sastoji od objašnjenja implementacije doti!ne

    strukture kao i od priloženog koda programa koji sadrži operacije nad tom strukturom.Iako je glavnina priloženog koda napisana u jeziku Pascal, to nije nimalo slu!ajno. Naime,

     jezik Pascal ima vrlo mnogo sli!nosti s pseudojezikom. To dodatno doprinosi razumljivosti.

    Osim toga, uz kod u Pascalu je priložen i kod u jeziku C++ koji predstavlja korak naprijed

    naprednom i profesionalnijem programiranju.

    2. Definicija dinami!kih struktura podataka

    Ako se struktura podataka za vrijeme izvo$enja programa ne mijenja u memoriji, tada se

    naziva stati!kom strukturom. Kao primjer možemo navesti nizove, slogove, skupove i druge.

    Stati!ke varijable se deklariraju i pozivaju po imenu. Za vrijeme izvo$enja programa stati!koj

    varijabli se dodjeljuje odre$ena lokacija u memoriji i ta lokacija ostaje rezervirana za sve

    vrijeme izvo$enja programa. Dinami!ke varijable se ne deklariraju i ne pozivaju po imenu. Za

    dinami!ke varijable je karakteristi!no da se mogu kreirati i uklanjati za vrijeme izvo$enja programa. Pristupanje dinami!koj varijabli vrši se pomo#u odgovaraju#eg pokaziva!a koji je

    nastao usporedno s kreiranjem dinami!ke varijable. Dinami!ka varijabla vezana s

    odgovaraju#im pokaziva!em naziva se pokaziva!ka varijabla. Takve se varijable koriste za

    opis složenih dinami!kih struktura podataka kao što su liste i stabla. Na stranicama što slijede

    opisat #u strukture liste, stog, red i binarno stablo.

  • 8/19/2019 Strukture podataka (dinamicke)

    4/25

      3

    3. Liste

    Obrada podataka !esto uklju!uje pohranu i obradu podataka organiziranih u linearne liste.

    Jedan od na!ina pohrane takvih podataka je pomo#u polja. Linearna ovisnost podataka u polju

    odraz je njihove pozicije u memoriji a ne neke informacije sadržane u samim elementima

     polja. Zbog toga se može jednostavno izra!unati adresa elementa polja. Me$utim, upotreba

     polja za pohranu liste ima i nedostatke : umetanje i brisanje elementa je vremenski zahtjevno.

    Drugi nedostatk upotrebe polja je taj što unaprijed trebamo znati veli!inu polja te se ta

    veli!ina ne može mijenjati tokom izvo$enja programa.

    Drugi na!in pohrane liste je upotrebom dinami!ke strukture podataka. Svaki element

    liste sastoji se od sadržaja elementa i pokaziva!a koji sadrži adresu slijede!eg elementa liste.

    Kod tog na!ina zapisa liste, susjedni elementi liste ne trebaju biti smješeni na susjednimmemorijskim adresama. Takav zapis liste omogu#ava jednostavnije brisanje i umetanje

    elemenata u listu.

    3.1. JEDNOSTRUKO VEZANE LISTE

    Jednostruko vezana lista je linearni skup podataka, koji se zovu !vorovi, poredanih

     pomo#u pokaziva!a. Svaki !vor podijeljen je u dva dijela : prvi dio sadržava informacije

    elementa, a drugi dio sadržava adresu slijede!eg !vora u listi. Pokaziva!  zadnjeg !vora

    sadržava null pokaziva!. Lista sadrži i pokaziva! liste, koji se obi!no zove glava, koji sadrži

    adresu prvog !lana liste. Posebni slu!aj liste je lista bez !vorova. Takva lista se zove null lista

    ili prazna lista. Jednostruko vezana lista se grafi!ki može prikazati ovako:

    glava

     pokaziva! na slijede#ielement

    informacijski dio !vora

  • 8/19/2019 Strukture podataka (dinamicke)

    5/25

      4

    %vor jednostruko vezane liste se najprirodnije realizira kao slog. Jedno polje sloga je

     pokaziva! koji pokazuje na slijede#i !vor vezane liste. Ostala polja odre$uju sadržaj liste.

    Umetanje u linearnu listu

     Neka je LISTA linearna lista sa susjednim !vorovima A i B, kao što je prikazano na

    slici:

    Da bismo ubacili !vor N u listu izme$u !vorova A i B, trebamo:

    a) pokaziva! !vora A postaviti na adresu !vora N

     b) pokaziva! !vora N postaviti na adresu !vora B

    Slika ilustrira umetanje !vora N u listu.

    Brisanje iz linearne liste

     Neka je LISTA linearna lista sa !vorom N izme$u !vorova A i B, kao što je prikazano

    na slici:

    Da bismo izbacili !vor N iz liste, trebamo pokaziva! !vora A postaviti na adresu !vora B.

    vor

    vor

    vor

    vor

    vor

    !vor A!vor B

    !vor N

  • 8/19/2019 Strukture podataka (dinamicke)

    6/25

      5

     Na slici je prikazana lista nakon brisanja !vora N.

    3.2. DVOSTRUKO VEZANE LISTE

    Jedna dinami!ka varijabla može imati dva ili više pokaziva

    !a. To svojstvo omogu

    #uje

    kreiranje složenih struktura podataka. Jedna od njih je dvostruko vezana lista. U dvostruko

    vezanoj listi prvi pokaziva! pokaziva!ke varijable pokazuje na prethodni !vor liste, a drugi

     pokaziva!  pokazuje na slijede#i !vor liste. Prvi pokaziva!  prvog !lana obi!no pokazuje na

     poslijednji !vor liste. Zbog takve kružne vezanosti, dvostruko vezana lista se kra#e naziva

     prsten. Dvostruko vezana lista se grafi!ki može prikazati ovako:

    Umetanje u dvostruko vezanu l istu

     Neka je LISTA dvostruko vezana lista sa susjednim !vorovima A i B. Da bismo

    ubacili !vor N u listu izme$u !vorova A i B, trebamo:

    a) Prvi pokaziva! !vora A postaviti na adresu !vora N.

     b) Prvi pokaziva! !vora N postaviti na adresu !vora B.

    c) Drugi pokaziva! !vora N postaviti na adresu !vora A.

    d) Drugi pokaziva! !vora B postaviti na adresu !vora N.

    vor

    vor

    vor

    glava rep

  • 8/19/2019 Strukture podataka (dinamicke)

    7/25

      6

    Brisanje iz dvostruko vezane liste

     Neka je LISTA dvostruko vezana lista sa !vorom N izme$u !vorova A i B. Da bismo

    izbacili !vor N iz liste, trebamo:

    a) prvi pokaziva! !vora A postaviti na adresu !vora B b) drugi pokaziva! !vora B postaviti na adresu !vora A

    4. Stog

    Stog (engl. stack) je dinami!ka struktura podataka koja se realizira pomo#u vezane liste.

    %vorovi stoga su istog tipa, a njihov je broj varijabilan. Rad sa stogom se zasniva naupravljanju !vorovima koji se nalaze na vrhu stoga. Podatak se može upisati na stog ili

    ispisati iz stoga. Stog se koristi na slijede#i na!in: poslijednji podatak unesen u stog uzima se

     prvi iz njega. To se naziva LIFO princip (od engl. Last In First Out). Rad sa stogom sastoji se

    od:

    a) definiranju stoga

     b) upisu !vorova u stog

    c) ispisu !vorova iz stogaDefiniranje stoga sastoji se u definiranju pokaziva!a stoga i sadržaja stoga. Ako je

    vrijednost pokaziva!a stoga NULL (u Pascalu NIL), tada je stog prazan. Ako stog nije prazan,

    tada pokaziva!  pokazuje na !vor stoga koji se nalazi na vrhu stoga. %vorovi stoga su

     pokaziva!ke varijable predstavljene slogovima !ije jedno polje pokazuje na slijede#i !vor

    stoga, a drugo polje sadrži vrijednost !vora.

    5. Red

    Red je struktura podataka sli!na stogu. Za razliku od stoga, podatak koji je prvi upisan u

    red prvi se ispisuje iz reda. Takav na!in upisa i ispisa poznat je kao FIFO princip (od engl.

    First In First Out). Naziv red za ovakvu strukturu podataka upotrebljen je zbog analogije s

    redovima iz svakodnevnog života.

    Za razliku od stoga, red odre$

    uju dva pokaziva!a. Prvi pokazuje na prvi

    !vor reda, a drugi

    na poslijednji !vor reda. Red se grafi!ki može prikazati kao na slici:

  • 8/19/2019 Strukture podataka (dinamicke)

    8/25

      7

     p

    q

    6. Binarno stablo

    Za razliku od nizova, polja, lista, stoga i reda koji predstavljaju linearne strukture

     podataka, stablo je nelinearna struktura podataka. Binarno stablo  T definira se kao kona!ni

    skup elemenata, zvanih ! vorovi, za koje vrijedi :

    (") T je prazno ( prazno stablo ili null stablo)

    (2) T sadržava posebni !vor R, koji se zove korijen stabla T, i preoste !vorove koji

    oblikuju ure$eni par odvojenih binarnih stabala T" i T2.

    T" i T2 nazivamo lijevo i desno podstablo, a !vorove T" i T2 lijevi i desni naslijednik (dijete)

    !vora T. Binarno stablo obi!no se prikazuje pomo#u dijagrama. Dijagram na slici prikazuje

     binarno stablo koje : (") se sastoji od "" !vorova, prikazanih slovima od A do L. (2) korijen

    stabla T je !vor A na vrhu dijagrama. (3) lijeva prema dolje usmjerena linija !vora N pokazujena lijevog naslijednika od N, a desna na desnog naslijednika. Npr.

    (a) B je lijevi a C desni naslijednik !vora A.

    (b) lijevo podstablo !vora A sastoji se od !vorova B,D,E i F, a desno podstablo od

    !vorova C,G,H,J,K i L.

    Svaki !vor N u binarnom stablu T ima 0," ili 2 naslijednika. %vorovi A, B, C i H imaju dva

    naslijednika, !vorovi E i J samo jednog, a !vorovi D, F, G i L nemaju naslijednika. %vorovi

     bez naslijednika zovu se krajnji ! vorovi  (listovi). Gornja definicija binarnog stabla jerekurzivna budu#i da je T definirano pomo#u podstabla T" i T2.

  • 8/19/2019 Strukture podataka (dinamicke)

    9/25

      8

    PRIKAZ BINARNIH STABLA U MEMORIJI

     Neka je T binarno stablo. Postoje dva na!ina za zapis binarnog stabla u memoriji

    ra!unala. Prvi na!in zove se vezni prikaz (eng. link representation) i on je analogan na!inu

     prikaza linearnih lista. Drugi na!in, upotrebom samo jednog polja, zove se sekvencijalni

     prikaz. Glavni zahtjev kod bilo kojeg prikaza stabla T je da on omogu#uje direktan pristup

    korijenu R i da za bilo koji !vor N omogu!uje direktan pristup djeci od N.

    Vezni prikaz binarnih stabala

    Vezni prikaz koristi tri paralelna polja, INFO, LIJEVI i DESNI i pokaziva!ku

    varijablu KORIJEN na slijede#i na!in :

    (") INFO[K] sadrži podatak !vora N

    (2) LIJEVI[K] sadrži adresu lijevog djeteta !vora N

    (3) DESNI[K] sadrži adresu desnog djeteta !vora N

    KORIJEN sadrži adresu korijena stabla. Ako je bilo koje podstablo prazno, tada

    odgovaraju#i pokaziva! sadrži null vrijednost. Ako je stablo T prazno, KORIJEN sadrži null

    vrijednost.

    A

    BC

    D E

    F

    G H

    J K

    L

  • 8/19/2019 Strukture podataka (dinamicke)

    10/25

      9

    Dijagram prikaza binarnog stabla

     Na slici je prikazan shematski dijagram veznog prikaza liste. Svaki !vor sastoji se od

    tri polja a prazno podstablo ozna!eno je sa x. Slika prikazuje kako bi ta lista bila pohranjena u

    memoriji ra!unala.

    Opaska ". U danom primjeru svaki !vor saržava samo jedan informacijski element (slovo).

    U praksi to može biti i !itavi zapis.

    Opaska 2. Budu#i da se !vorovi mogu ubacivati u listu i brisati iz liste, pretpostavljamo da

    su prazne lokacije u polju INFO, LIJEVO i DESNO povezane u linearnu listu !ija je glava

    DOST. Polje LIJEVO sadrži pokaziva! na slijede#i prazni !vor.

    Opaska 3. Bilo koja nevaže#a adresa može se koristiti kao NULL pokaziva!. U praksi se

    koristi 0 ili negativni broj.

    C

    D

    F J

    L

    x x

    x x

    x x x

    x

    x x

    x x

    KORIJEN

  • 8/19/2019 Strukture podataka (dinamicke)

    11/25

      "0

    7. Implementacija dinami!kih struktura podataka u Pascalu i

    C++-u

    7.1. Implementacija jednostruko vezane liste

     Neka je !vor vezane liste realiziran kao slog od dva polja. Prvo polje sadrži cijeli broj, a

    drugo sadrži pokaziva! na slijede#i !vor. Tip !vorova liste i pokaziva!a liste definira se na

    slijede#i na!in:

     pokazivac=^cvor;element=RECORD

    sadrzaj:integer;veznik:pokazivac;

    END;

    Ovdje je pokaziva! definiran preko !vora, a !vor preko pokaziva!a. Tako nam se može

    !initi da se radi o okretanju u krug, ali navedene kružne definicije su dozvoljene. Kreiranje

     jedne jednostruko vezane liste pokazat #e slijede#i primjer.

     Neka su deklarirane slijede#e cjelobrojne varijable i pokaziva!i tipa pokazivac.

    VAR a,b,c,u:integer; p,q:integer;

    Ako želimo kreirati vezanu listu s tri !vora (elementa), tada #emo raditi po slijede#em

     postupku:

    - Najprije se pokaziva!u p dodjeljuje vrijednost NIL.

     p:=NIL;

    - Kreira se pokaziva!ka varijabla q pomo#u procedure new.

    new(q);

    - Zatim se dodjeljuju vrijednosti poljima pokaziva!ke varijable q.q^.sadrzaj:=a;q^.veznik:=p;

    - Ako ponovimo postupak dobit #emo listu s dva elementa.

    new(q);q^.sadrzaj:=b;q^.veznik:=p;

     p:=q;

    - Nastavimo li taj postupak, dobit #emo listu s tri elementa.

    new(q);q^.sadrzaj:=c;

  • 8/19/2019 Strukture podataka (dinamicke)

    12/25

      "" 

    q^.veznik:=p; p:=q;

     Nakon kreiranja vezane liste, oba pokaziva!a pokazuju poslijednji element. Nakon što smo

    kreirali listu, postavlja se pitanje kako pristupiti pojedinim elementima, odnosno !vorovima.

    Ako pokaziva! p pokazuje na prvi !vor liste, tada to zna!i da pokazuje na poslijednji uneseni

    element. Naredbom dodjeljivanja:

    u:=p^.sadrzaj;

    varijabli se dodjeljuje sadržaj prvog !vora. Sadržaj drugog !vora se dobiva na slijede#i na!in:

    u:=p^.veznik^.sadrzaj;

    Ako je lista duga!ka, tada ovakvo pristupanje nema smisla. Potrebno je pretraživati listu.

     Neka se npr. traži !vor liste !ija je vrijednost d. Uvodi se logi!ka varijabla indikator kojoj

     je po!etna vrijednost true. Ako se u listi na$e !vor s istim sadržajem kao varijabla d, tada seindikatoru dodjeljuje vrijednost false. Testiranjem indikatora, provjerava se da li postoji

    tražena vrijednost. Odgovaraju#i dio programa izgledao bi tada ovako:

    q:=p;indikator:=true;WHILE (qNIL) AND indikator DO

    IF q^.sadrzaj=d THEN indikator:=false;ELSE q:=q^.veznik;

    Vezana lista ima svojstvo lakog ubacivanja novih elemenata u listu kao i njihovog brisanja.

     Novi element se ubacuje iza r-tog elementa na slijede#i na!in:

    new(q);q^.sadrzaj:=u;q^.veznik:=r^.veznik;r^.veznik:=q;

    Postupak izbacivanja r-tog elementa je još jednostavniji, samo je potrebno napisati:r^.veznik:=r^.veznik^.veznik;

     Nakon što smo opisali principe koji vrijede za jednostruko vezanu listu, potrebno je i napisati

     primjer programa koji to provodi u djelo. Navodim primjer takvog koda:

    PROGRAM jednostruko_vezana_lista;{kreira sre"enu listu brojeva}TYPE pokazivac=^element;

    element=RECORDveza:pokazivac;

    broj:integerEND;

    VAR glava:pokazivac;izbor:char;

    PROCEDURE pripremi(VAR iza,ispred:pokazivac; x:integer);BEGIN {na"i odgovaraju#e mjesto u listi}

  • 8/19/2019 Strukture podataka (dinamicke)

    13/25

      "2

    iza:=glava; {iza pokazuje na prvi element liste}WHILE (x>iza^.broj) AND (izaNIL) DO

    BEGIN (* putuj kroz listu *)ispred:=iza;iza:=iza^.veza;END;

    END;

    PROCEDURE ubaci;VAR novaveza,iza,ispred:pokazivac;

    x:integer;BEGIN {dodaj novi element u listu}write('novi broj --> ');readln(x);pripremi(iza,ispred,x);new(novaveza); {novi pokaziva$}novaveza^.broj:=x;novaveza^.veza:=iza; {poveži novi sa sljede#im}IF iza=glava THEN glava:=novaveza {ubaci na po$etak liste}

    ELSE ispred^.veza:=novaveza; {poveži prethodni sa novim}END;

    PROCEDURE brisi;VAR iza,ispred:pokazivac;

    x:integer;BEGIN {briši element iz liste}write('brisem broj --> ');readln(x);pripremi(iza,ispred,x);IF x=iza^.broj THEN IF iza=glava THEN glava := iza^.veza {izbaci prvi element liste}

    ELSE ispred^.veza := ispred^.veza .̂vezaELSE writeln(' Nisam nasao broj ',x)

    END;

    PROCEDURE nadji;VAR kazaljka:pokazivac;

    x,n:integer;BEGIN {traži zadani broj u listi}write('trazim broj --> ');readln(x);n:=%;kazaljka:=glava; {kazaljka na po$etak liste}WHILE (kazaljkaNIL) AND (x>kazaljka^.broj) DO

    BEGINkazaljka:=kazaljka^.veza; {putuj kroz listu}

    n:=n+%;END;

    IF x = kazaljka^.broj THEN {ako si našao}writeln(n:3,'.--> ',kazaljka^.broj)

    ELSE writeln('Nisam nasao broj ',x)END;

    PROCEDURE pisi_listu;VAR kazaljka:pokazivac;

    i:integer;BEGIN {ispiši sve elemente liste}i:=0;writeln;

    writeln('Izlazna lista ');kazaljka:=glava; {kazaljka na po$etak liste}

  • 8/19/2019 Strukture podataka (dinamicke)

    14/25

      "3

    WHILE kazaljkaNIL DOBEGIN {ispiši element liste}i:=i+%;writeln(i:3,'. --> ',kazaljka^.broj);kazaljka:=kazaljka^.veza;END;

    END;

    BEGIN {glavni}glava:=NIL; {prvi pokaziva$}REPEATwriteln;REPEATwrite(' Zelite : B(risati, D(odati,');write(' I(spisati, N(aci, Z(avrsiti ? ');readln(izbor)UNTIL izbor IN ['B','b','D','d','I','i','N','n','Z','z'];CASE izbor OF

    'B','b' : IF glava = NIL THEN writeln('Lista je prazna')

    ELSE brisi;'D','d' : ubaci;'I', 'i','Z','z' : pisi_listu;'N','n' : nadji;

    END;UNTIL izbor IN ['Z','z'];END.

    7.2. Implementacija dvostruko vezane lis te

    Tip pokaziva!ke varijable u slu!aju dvostruko vezane liste definira se kao:

     pokazivac=^element;element=RECORD

    sadrzaj:tipsadrzaja; prethodni,slijedeci:pokazivac;END;

    Pokaziva!  s imenom prethodni pokazuje na prethodni !vor liste. Analogno tome,

     pokaziva!  slijedeci pokazuje na slijede#i !vor. Ako se !vor na koji pokazuje pokaziva!  p

    upisuje ispred !vora na koji pokazuje pokaziva! q, procedura je slijede#a:

    PROCEDURE upisi_ispred_p(p,q:pokazivac);BEGIN p^.prethodni:=q; p^.slijedeci:=q^.slijedeci;q^.slijedeci.prethodni^:=p;q^.slijedeci:=p;END;

    Ako se element na koji pokazuje pokaziva!  p upisuje iza elementa na koji pokazuje

     pokaziva! q, tada je procedura slijede#a:

    PROCEDURA upisi_iza_q(p,q:pokazivac);BEGIN

     p^.prethodni:=q^.prethodni;

  • 8/19/2019 Strukture podataka (dinamicke)

    15/25

      "4

     p^.slijedeci:=q;q^.prethodni.slijedeci^:=q;q^.prethodni:=p;END;

    Kao primjer programa koji koristi dvostruko vezanu listu, navodim ovaj:

    PROGRAM dvostruko_vezana_lista;TYPE pokazivac=^element;

    element=RECORDispred,iza:pokazivac;

    znak:char;END;

    VAR prvi,zadnji:pokazivac;

    PROCEDURE slozilistu;VAR novi,p:pokazivac;

    noviznak:char;

    BEGINwriteln('Upisite recenicu: ');new(novi);prvi:=novi; {prvi element}p:=NIL;REPEATread(noviznak);novi^.znak:=noviznak;novi^.ispred:=p;IF pNIL THEN p^.iza:=novi;p:=novi;new(novi);UNTIL noviznak='.';

    p^.iza:=NIL;zadnji:=p^.ispred; {zadnji element}END;

    PROCEDURE pisinormalno;VAR p:pokazivac;BEGINwriteln;writeln('Upisana je recenica: ');p:=prvi; {pokaziva$ na prvi element liste}WHILE pNIL DO BEGIN

    write(p^.znak);p:=p^.iza; {slijede#i element}

    END;writeln;END;

    PROCEDURE pisiobrnuto;VAR p:pokazivac;BEGINwriteln;writeln('Recenica obrnutim redoslijedom :');p:=zadnji; {pokaziva$ na zadnji element liste}WHILE pNIL DO BEGIN

    write(p^.znak);p:=p^.ispred {prethodni element}

    END;writeln;END;

  • 8/19/2019 Strukture podataka (dinamicke)

    16/25

      "5

    BEGIN {glavni}slozilistu;pisinormalno;pisiobrnuto;readln;

    readln;END.

    Primjer programa napisanog u C++-u:

    //dvostruko vezana lista#include

    struct element{element *ispred,*iza;char znak;

    };element *prvi,*zadnji;

    void slozi_listu(){element *novi,*p;char noviznak;cout noviznak;

    novi->znak=noviznak;novi->ispred=p;if (p!=NULL) p->iza=novi;p=novi;novi=new element();

    } while (noviznak!='.');p->iza=NULL;zadnji=p->ispred; //zadnji element

    };

    void pisi_normalno(){element *p;cout

  • 8/19/2019 Strukture podataka (dinamicke)

    17/25

      "6

    };

    //glavni programvoid main(){

    slozi_listu();pisi_normalno();

    pisi_obrnuto();cout

  • 8/19/2019 Strukture podataka (dinamicke)

    18/25

      "7

    p^.podatak:=x;p^.veza:=vrh;vrh:=p;END;

    FUNCTION pop:integer;

    {uzmi podatak s vrha stoga}BEGINpop:=vrh^.podatak;vrh:=vrh^.veza;END;

    BEGIN {glavni}vrh:=NIL;writeln('Last In First Out');REPEATwriteln;write('D(odaj, U(zmi, K(raj --> ');readln(izbor);

    CASE izbor OF'd','D' : BEGINwrite(' Podatak : ');readln(x);push(x);END;

    'u','U' : IF NOT prazan THEN writeln('Uzimam : ',pop)ELSE writeln('Nema podataka!!!');

    END;UNTIL izbor IN ['k','K'];END.

    Primjer programa napisanog u C++-u:

    //primjer stoga#include

    struct element{int podatak;element *veza;

    };

    element *vrh;char izbor;int x;

    //provjeri da li ima podataka na stoguint prazan(){

    if (vrh==NULL) return(%);else return(0);

    };

    //dodaj podatak na vrh stogavoid push(int x){

    element *p;p=new element();p->podatak=x;p->veza=vrh;

    vrh=p;};

  • 8/19/2019 Strukture podataka (dinamicke)

    19/25

      "8

    //uzmi podatak s vrha stogaint pop(){

    element *tmp;tmp=new element();tmp->podatak=vrh->podatak;vrh=vrh->veza;

    return (tmp->podatak);};

    //glavni programvoid main(){

    vrh=NULL;cout

  • 8/19/2019 Strukture podataka (dinamicke)

    20/25

      "9

    IF prvi=NIL THEN prvi:=p; {prvi podatak}zadnji^.veza:=p;zadnji:=p;END;

    FUNCTION uzmi:integer;

    {uzmi podatak s pocetka reda}BEGINuzmi:=prvi^.podatak;prvi:=prvi^.veza;END;

    BEGIN {glavni}prvi:=NIL;zadnji:=NIL;writeln('First In First Out');REPEATwriteln;write('D(odaj, U(zmi, K(raj --> ');

    readln(izbor);CASE izbor OF'd','D' : BEGIN

    write(' Podatak : ');readln(x);dodaj(x);END;

    'u','U' : IF NOT prazan THEN writeln('Uzimam: ',uzmi)ELSE writeln('Nema podataka!!!');

    END;UNTIL izbor IN ['k','K'];END.

    Primjer programa napisanog u C++-u:

    //primjer reda#include

    struct element{int podatak;element *veza;

    };

    element *prvi,*zadnji;char izbor;

    int x;int prazan(){

    if (prazan==NULL) return(%);else return(0);

    };

    //dodaj podatak na kraj redavoid dodaj(int x){

    element *p;p=new element();p->podatak=x;p->veza=NULL;

    if (prvi==NULL) prvi=p; //prvi podatakzadnji->veza=p;zadnji=p;

  • 8/19/2019 Strukture podataka (dinamicke)

    21/25

      20

    };

    //uzmi podatak s po$etka redaint uzmi(){

    element *tmp;tmp=new element();

    tmp->podatak=prvi->podatak;prvi=prvi->veza;return(tmp->podatak);

    };

    //glavni programvoid main(){

    prvi=zadnji=NULL;cout

  • 8/19/2019 Strukture podataka (dinamicke)

    22/25

      2" 

    WITH cvor^ DO BEGINbroj:=n;

    desno:=NIL;lijevo:=NILEND;

    END;

    PROCEDURE gradistablo (VAR p:veza);{dodaj novi podatak na slobodno mjesto}BEGINIF p=NIL THEN novicvor(p,n)

    ELSE WITH p^ DOIF n

  • 8/19/2019 Strukture podataka (dinamicke)

    23/25

      22

    element *desno,*lijevo;};

    element *korijen,*p;char izbor;int n;

    //stvori novi $vor - podatakvoid novi_cvor(element *cvor, int n){

    cvor=new element();cvor->broj=n;cvor->desno=NULL;cvor->lijevo=NULL;

    };

    //dodaj novi podatak na slobodno mjestovoid gradi_stablo(element *p){

    if (p==NULL) novi_cvor(p,n);else if (nbroj) gradi_stablo(p->lijevo);

    else gradi_stablo(p->desno);};

    //ispiši elemente binarnog stablavoid izlaz(element *p){

    if (p!=NULL) {izlaz(p->lijevo);cout

  • 8/19/2019 Strukture podataka (dinamicke)

    24/25

      23

    8. Zaklju!ak vezan uz temu seminarskog rada

    Pišu#i ovaj seminar, imao sam namjeru pobliže objasniti dinami!ke strukture podataka kao

    važan dio znanja o programiranju. Kao što sam u uvodu rekao, dinami!ke su strukture važne

    za rješavanje složenih zadataka. Njihovom upotrebom ne samo da možemo smanjiti koli!inu

    koda u programu, nego možemo pove#ati brzinu rada, odnosno smanjiti vrijeme izvršavanja.

    Iako se ovdje opisane strukture nazivaju apstraktnima, pokušao sam ih objasniti na manje

    apstraktan na!in, tj. kroz primjere. Tako se pridonosi njihovoj razumljivosti, a kada se jednom

    savladaju, predstavljaju veliku pomo# u programiranju.

    Premda nisam opisao baš sve dinami!ke strukture podataka, nastojao sam raš!laniti one

    najvažnije, a nadam se da mi je u tome uspjelo.

  • 8/19/2019 Strukture podataka (dinamicke)

    25/25

    9. Literatura

    ". B. Motik, J. Šribar: Demistificirani C++, Element, Zagreb, 2000.

    2. M. %ubrilo, N. Crnko: Visual Basic Vizualni pristup programiranju,

    DRIP, Zagreb, "994.

    3. Z. Vlaši#: Pascal, Tehni!ka knjiga, Zagreb, "99".

    4. Bilješke s predavanja iz kolegija Programiranje II, Strukture podataka i

    Operacijski sustavi

    5. Primjeri s Interneta