strukture podataka (dinamicke)
TRANSCRIPT
-
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