34

Click here to load reader

Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

  • Upload
    trantu

  • View
    284

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

Strukture podataka i algoritmi

II dopunjeno izdanje

prof. dr. Dragica Radosav Nina Bijedić

Ljiljana Đuretanović

Page 2: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

Sadržaj 1. Uvod

0.0. Definisanje struktura podataka – tipova podataka 1 0.1. Pojam strukture podataka 2 0.2. Klasifikacija struktura podataka 2 0.3. Osnovne operacije nad strukturama podataka 4 0.4. Operativne strukture podataka 4

0.4.1. Statičke strukture 4 0.4.2. Polustatičke strukture 5 0.4.3. Dinamičke strukture 7

0.5. Strukture podataka smeštenih na masovnu memoriju 9 0.5.1. Osnovni pojmovi 9 0.5.2. Operacije nad datotekama 9 0.5.3. Operacije u datoteci (nad zapisima) 10 0.5.4. Razmena zapisa između programa korisnika i datoteke (baferovanje) 10 0.5.5. Metode organizacije datoteka 11

1. Povezane reprezentacije podataka – pokazivači

1.1. Uvod 14 1.2. Šta su pokazivači? 16

1.2.1. Primer: Čuvanje podataka 16 1.2.2. Definicija pokazivača 18

1.3. Pokazivači u C-u 18 1.4. Neke finese – alijasi, recikliranje, ‘dangling’ pokazivači 19

1.4.1. Alijasi 19 1.4.2. Recikliranje korištenog memorijskog prostora 20 1.4.3. “Viseći” pokazivači (dangling pointers) 21 1.4.4. Vek trajanja dinamičkog memorisanja 21 1.4.5. Dereferenciranje 21

1.5. Predstavljanje pokazivača u dijagramima 22 1.6. Linearna povezana lista 23

1.6.1. Deklaracija tipova podataka za povezane liste 24 1.6.2. Umetanje novog drugog čvora u listu 25 1.6.3. Pretraga liste 26 1.6.4. Brisanje poslednjeg čvora u listi 26 1.6.5. Umetanje novog poslednjeg čvora u listu 27 1.6.6. Štampanje liste 28 1.6.7. Jedan celovit program 28

1.7. Ostale povezane strukture podataka 29 1.8. Primer primene – povezana lista i upravljanje virtualnom memorijom 31 1.9. Saveti na kraju poglavlja 32

Page 3: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

1

0 Uvod

0. Definisanje struktura podataka-tipovi podataka

Osim tzv. logičke strukture podataka postoji još jedan pojam vezan za organizovanje podataka u programu: tip podataka. Kada govorimo o sintaksi programskih jezika, termin »struktura podataka« sreće se znatno ređe od termina »tip podataka«. Odnos ova dva termina nije do kraja definisan. Neki autori u logičku strukturu podataka ne ubrajaju operacije, a s druge strane skup operacija je integralni deo definicije svakog tipa podataka. Ukoliko se prihvati činjenica da je skup operacija neodvojivi deo strukture podataka dolazi se do zaključka da su strukture i tipovi podataka, dva modela ili pogleda istog entiteta: organizacije podataka. Tipovi podataka, kao model, koriste se u programskim jezicima, dok se strukture podataka upotrebljavaju u fazi projektovanja softvera. Kao što prema nivou apstrakcije razlikujemo logičke i fizičke strukture podataka, tako kod tipova razlikujemo apstraktne i konkretne tipove podataka. Apstraktni tip podataka obuhvata definiciju skupova koji u njemu učestvuju, kao i sintaksu i semantiku operacija nad tim skupovima. Kada se ovom tipu doda konkretna, programska realizacija, dobija se konkretni tip podataka. Komponente opisa tipa podataka su: Naziv tipa Spisak primitivnih tipova Sintaksa operacija obuhvaćenih tipom Semantika operacija

Sintaksni deo koji obuhvata tačke 1,2,3 nosi naziv signura tipa. Kada se signaturi tipa doda opis semantike dobija se specifikacija tipa, odnosno apstraktni tip. Tipovi koji imaju druge tipove za parametre zovu se generički ili parametrizovani tipovi.

Page 4: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

2

01. Pojam strukture podataka

Pod strukturom podataka podrazumeva se skup elemenata podataka između kojih su definisane određene relacije. Element podataka može biti ili atom (tj. sa tačke gledišta programa skalar određenog tipa – celobrojan, realan itd.) ili struktura podataka. Relacije između elemenata mogu biti različite, od najjednostavnije relacije poretka kakva se sreće kod vektora kada se kaže “i-ti element i i+1 element su u relaciji zato što i-ti element prethodi i+1 elementu”, preko relacija tipa “element student je u relaciji sa elementom fakultet s obzirom da student studira na datom fakultetu”, pa do mnogo složenijih relacija. Jedna od često korišćenih definicija struktura podataka glasi: Struktura podataka je uređena n+1 – torka (S, r1, r2, ... , rn), n>=1 gde je S skup elemenata (koji i sami mogu biti strukture), a ri, i=1,2,...,n su relacije definisane na skupu S.

02. Klasifikacija struktura podataka

Strukture podataka se klasifikuju na više načina, a ovde će se navesti samo neke klasifikacije. Prema nivou apstrakcije strukture podataka se dele na: Logičke strukture podataka i Fizičke strukture podataka.

Prema mestu memorisanja strukture se dele na: Operativne strukture ( strukture podataka u operativnoj memoriji ) i Strukture podataka na masovnoj memoriji.

Prema tipu relacija strukture podataka se dele na: Linearne strukture, Strukture tipa stabla i Mrežne strukture.

Page 5: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

3

U praksi se najčešće susreću slučajevi struktura podataka sa jednom jedinom relacijom, a i strukture sa više relacija mogu se posmatrati kao skup struktura sa istim elementima i jednom relacijom, te ćemo se zadržati na strukturi oblika ( S,r ). Posmatrana kao uređeni par struktura podataka ne vodi računa o načinu smeštanja u memoriju već samo o (tzv. logičkim) vezama između elemenata, te iz tog razloga nosi naziv logička struktura podataka. Fizička struktura podataka predstavlja konkretnu strukturu onako kako je ona smeštena u memoriju. Logička i fizička struktura po pravilu nisu istovetne. Podela struktura podataka po mestu nalaženja vrši se iz razloga što je problem obrade podataka, u slučaju kada su podaci u operativnoj memoriji potpuno različiti od problema obrade podataka kada se podaci nalaze u masovnoj memoriji. Količina podataka u operativnoj memoriji je mnogostruko manja od količine podataka u masovnoj memoriji. Takođe, način pristupa podacima u operativnoj memoriji je suštinski različit od načina pristupa podacima u masovnoj memoriji. U slučaju klasifikacije struktura podataka prema tipu relacija, kao model strukture podataka posmatra se diraf ( orentisani graf ): ( X , U ) gde je : X skup čvorova digrafa koji odgovara elementima strukture podataka, U skup grana koje predstavljaju navedenu binarnu relaciju u skupu X.

Linearnu strukturu podataka opisuje digraf ( X , U ) čiji se čvorovi mogu rasporediti u niz:

x1, x2, ... , xn

tako da skup grana U prestavljaju grane:

(xi, xi+1), i=1, 2, ... , (n-1). Ako se navedenom skupu grana priključi i grana (xn, x1) onda se dobija ciklička struktura podataka. Struktura tipa stablo ima tu osobinu da svaki čvor, osim jednog, ima tačno jednog predhodnika. Čvorovi koji nemaju sledbenika nazivaju se listovi. Stablo kod kojeg svaki čvor, osim listova, ima najviše dva sledbenika naziva se binarno stablo. Mrežna struktura podataka predstavlja se opštim digrafom u kojem svaki čvor ima proizvoljan broj sledbenika.

Page 6: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

4

0.3 Osnovne operacije nad strukturama podataka

Najvažnije osnovne operacije koje se izvode nad strukturama podataka su: Pristup, Dodavanje, Brisanje, Pretraživanje, Sortiranje, Kopiranje, Spajanje, Razdvajanje.

04. Operativne strukture podataka

Operativne strukture se klasifikuju prema načinu izmene sadržaja i dele na: Statičke strukture, kod kojih nije mogućno ni dodavati ni uklanjati elemente. Polustatičke strukture, kod kojih su izmene elemenata moguće, ali samo pod određenim

uslovima. Dinamičke strukture, kod kojih se izmene elemenata mogu vršiti bez ikakvih ograničenja.

0.4.1. Statičke strukture Najpoznatije statičke strukture su polja (jednodimenzionalna – vektori, dvodimenzionalna – matrice i višedimenzionalna). Osnovna karakteristika polja je da su svi elementi polja istog tipa i da se u programskoj deklaraciji polja po pravilu navodi kompletan opseg raspoloživih vrednosti za svaki indeks koji se ne može menjati. Najjednostavniji način da se realizuje fizička struktura tipa polje je da se za elemente polja rezervišu uzastopne memorijske lokacije. Fizička struktura se dopunjava deskriptorima koji u načelu sadrže opšte podatke o polju kao što su:

Page 7: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

5

Indikator koji ukazuje da li je u pitanju polje, a ne neka druga struktura, Naziv polja, Adresu prvog elementa polja, Najmanje i najveće vrednosti indeksa, Tip elementa polja, Broj lokacija po jednom elementu polja izražen u jedinicama adresiranja (bajt, reč).

04.2. Polustatičke strukture Opšta karakteristika polustatičkih struktura ogleda se u tome da je dodavanje i uklanjanje elemenata kao i pristup elementima moguć samo na tačno određenim mestima u strukturi. Najpoznatije polustatičke strukture su: Stek (magacin, LIFO red), Red (FIFO red), Dek.

Zajednička karakteristika ovih struktura je da su sve u osnovi linearne, a razlikuju se jedino po mestu pristupa elementima, odnosno po mestu gde je mogućno dodavati i uklanjati elemente. 04.2.1. Stek

Za element xn se kaže da je navrhu steka, a za element x1 da je na dnu steka.Pristup je dozvoljen samo elementu xn. Logička operacija pristupa ostvaruje se funkcijom koja ima opšte prihvaćeni naziv TOP (vrh). Dodavanje elemenata u stek vrši se isključivo na vrh, odnosno ispred elementa xn. Procedura za dodavanje nosi standardan naziv PUSH (u prevodu sa engl. gurati). Uklanjanje elemenata iz steka se takođe vrši na vrhu steka. Treba imati u vidu da se u slučaju praznog steka ne može vršiti operacija uklanjanja. Dakle, kod steka se može ukloniti samo onaj element koji je hronološki poslednji dodat u stek. Zato se stek naziva i LIFO red (Last In First Out). Fizički se stek može realizovati na različite načine, ali su najpoznatiji: Sekvencijalna organizacija steka i Spregnuta organizacija steka

Sekvencijalna realizacija steka podrazumeva predstavljanje steka pomoću fizičkog vektora (odnosno niza memorijskih lokacija) dopunjenog deskriptorom.

Page 8: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

6

Kod spregnute realizacije steka memorijski prostor dodeljen svakom elementu steka dopunjuje se ukazivačem (adresom) sledećeg po redu elemenata steka. 04.2.2. Red Ova struktura je slična steku, isto je linearna, a razlikuje se od steka po mestu dodavanja tj. uklanjanja elemenata. Kod reda se elementi dodaju na jednom kraju linearne strukture, a pristupa se ili uklanja na suprotnom kraju, tj. najpre se pristupa onom elementu koji je prvi ušao u red. Otuda i potiče naziv FIFO (First In First Out). Kao i kod steka najpoznatije fizičke realizacije reda su sekvencijalna i spregnuta. Operacije nad redom su praktično identične kao operacije nad stekom s tim što se dodavanje elemenata vrši iza poslednjeg elementa, a uklanja se prvi element. 04.2.3. Dek Naziv dek (engl. deque) je akronim od double ended queue (>>red sa dva kraja<<) i po svojim osobina predstavlja sintezu steka i reda s obzirom da je i pristup, dodavanje i uklanjanje elemenata dozvoljeno na oba kraja. Osnovne operacije na deku su: FRONT (prvi) REAR (poslednji) POPF (uklanjanje prvog) POPR (uklanjanje poslednjeg) PUSHF (dodavanje prvog) PUSHR (dodavanje poslednjeg)

i potpuno su analogne operacijama kod steka i reda.

Page 9: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

7

04.3 Dinamičke strukture podataka Osnovna karakteristika ovih struktura jeste mogućnost pristupa svakom elementu (čvoru) u strukturi bez menjanja strukture, kao i mogućnost dodavanja ili uklanjanja čvorova bez ikakvih ograničenja. Broj čvorova je teorijski neograničen, a u fizičkoj strukturi se logički susedni čvorovi (čvorovi x i y ili y i x su logički ako su u relaciji) u načelu ne nalaze na fizički susednim memorijskim lokacijama. Osnovne dinamičke strukture su liste i stabla. 04.3.1 Liste Liste su najjednostavnije dinamičke strukture i dele se na: Jednostruko spregnute liste (ili linearne liste), Dvostruko spregnute liste i Višestruke liste.

04.3.1.1 Jednostruko spregnute liste Jednostruko spregnute liste se karakterišu sledećim osobinama: Struktura je linearna (svaki čvor osim jednog ima svog prethodnika i svaki čvor osim

jednog ima svog sledbenika; čvor bez prethodnika zove se indeks početka i označava se sa IP).

Moguć je pristup svakom elementu bez izmene strukture. Dozvoljeno je dodavanje elementa iza svakog elementa i ispred svakog elementa osim

ispred indeksa početka. Dozvoljeno je uklanjanje svakog elementa osim indeksa početka.

Najvažnija primitivna funkcija je funkcija sledeći koja za dati element, kao rezultat daje njegovog neposrednog sledbenika. Za jednostruko spregnute liste su od značaja i sledeće operacije: Određivanje broja elemenata u listi (ne računajući indeks početka), Formiranje kopije liste, Spajanje dve ili više lista u jednu, Razdvajanje listi na dve ili više listi, Sortiranje liste (izmena postojeće relacije u drugu, istog tipa, ali različitog sadržaja, a na

bazi informacionog sadržaja elementa). Fizička realizacija jednostruko spregnutih lista je identična sa spregnutim realizacijama polustatičkih struktura, s tim što se u deskriptorskom polju obično nalaze sledeće informacije:

Page 10: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

8

Kod strukture podataka, Naziv liste, Indeks početka, Opis elementa, Broj elemenata u listi.

04.3.1.2 Dvostruko spregnute liste Dvostruko spregnute liste predstavljaju uopštenje jednostruko spregnutih lista kod kojih se svakom uređenom paru (a,b) iz relacije r u jednostrukoj spregnutoj listi pridružuje uređeni par (b,a). Dakle, susedni elementi su povezani u oba smera. Dvostruko spregnuta lista može biti i cirkularna, ako su prvi i poslednji element spregnuti u oba smera. 04.3.1.3 Višestruko spregnute liste Višestruko spregnute liste predstavljaju uopštenje jednostruko i dvostruko spregnutih lista tako što je jedan elemenat spregnut sa više elemenata. 04.3.2 Stablo Stablo (ili drvo) je najčešće korišćena dinamička struktura sa sledećim osobinama: Svaki element (čvor) ima najviše jednog neposrednog prethodnika, Postoji tačno jedan element bez neposrednog prethodnika, koji se naziva koren stabla. Elementi koji nemaju sledbenike nazivaju se listovi.

Pod redom stabla podrazumeva se najveći broj sledbenika nekog elementa. Broj elemenata najdužeg puta naziva se visina stabla. Svaki element stabla sa svim svojim sledbenicima sve do listova čini podstablo datog stabla. Pristup elementu stabla vrši se isključivo na osnovu njegovog informacionog sadržaja. Da bi se obezbedilo da se pristup datom elementu ostvaruje putem koji vodi ka tom elementu, neophodno je skup sledbenika urediti po određenim pravilima. Zato postoje funkcije sledeći, funkcija izaberi (koja za skup sledbenika omogućava izbor jedinstvenog sledećeg elementa na osnovu nekog kriterijuma), funkcija koren (koja ima za zadatak da odredi koren stabla), funkcija pristupi.

Page 11: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

9

05. STRUKTURA PODATAKA SMEŠTENIH NA MASOVNU MEMORIJU

05.1 Osnovni pojmovi Struktura podataka smeštene na masovnu memoriju tradicionalno se nazivaju organizacija podataka. Podaci na masovnim memorijama se organizuju u datotekama. Datoteka predstavlja uređeni skup srodnih slogova. Slog - predstavlja uredjeni skup polja koji se mogu tretirati kao jedinica koju obrađuje

neki program.

Polje - jeste osobina entiteta relevantna za posmatrani informacioni sistem i predstavlja elementarni podatak.

05.2 Operacije nad datotekama Operacije nad datotekama su sledeće: Kreiranje datoteke (CREATE ILI MAKE), Proširenje datoteke (EXTEND), Otvaranje datoteke (OPEN), Zatvaranje datoteke (CLOSE), Brisanje datoteke (DELETE).

Pre nego što se podaci mogu upisati u datoteku, neophodno je uraditi proces kreiranja: Identifikovati perifernu jedinicu gde će se datoteka smestiti nakon kreiranja, Dati datoteci naziv, kako bi se mogla identifikovati među ostalim datotekama na

računarskom sistemu, Definisati veličinu datoteku, kako bi se na medijumu nosača podataka rezervisao prostor

za smeštanje podataka u datoteku, Definisati nacin organizacije datoteke, Definisati veličinu bloka, Definisati veličinu sloga.

Page 12: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

10

Ove informacije koje karakterišu datoteku nazivaju se atributi, osim informacije o identifikaciji periferne jedinice koja se upisuje u zaglavlje (deskriptor) datoteke. Ove operacije se mogu izvršiti samo ako je datoteka otvorena. Operacija brisanja datoteke omogućava da se data datoteka ukloni iz sistema i dodeli drugoj datoteci, a ova operacija se može izvršiti samo ako je zatvorena.

05.3 Operacije u datoteci (na zapisima) Na zapisima se mogu vrsiti sledece operacije: Pristup sloga (POSITION) - omogućava korisniku da se pozicionira na odabrani zapis u

datoteci. Korisnik ovom operacijom želi samo da proveri da li dati zapis postoji ili ne. Čitanje sloga (READ), čitanje narednog sloga (READ NEXT) - mogućuje da se odabrani

zapis prebaci iz datoteke u radnu oblast korisnika u operativnoj memoriji. Za izvršenje ove operacije potrebno je da korisnik saopšti jedinstveni idenntifikator datoteke.

Pisanje sloga (WRITE) - omogućuje da u datoteku upiše nov zapis. Modifikacija sloga (UPDATE) - omogućuje promenu sadržaja postojećeg zapisa u

datoteci. Da bi se to ostvarilo, korisnik obezbeđuje jedinstveni identifikator datoteke, adresu u radnoj oblast programa korisnika koja sadrži modifikovani sadržaj zapisa i veličinu zapisa.

Uklanjanje sloga (DELETE) – omogućuje ukidanje zapisa korisniku da se iz datoteke logički izbriše zapi. Za obavljanje ove operacije korisniku je dovoljan identifikator datoteke.

05.4 Razmena zapisa između programa korisnika i datoteke (baferovanje)

Kada je odgovarajući blok koji sadrži željeni slog pronađen i ako se želi izvršiti operacija čitanja, blok se sa medijima nosača podataka na perifernoj jedinici prebacuje u ulazno/izlazni bafer. Ovaj bafer mora biti dovoljno velik da prihvati blok podataka. Tek iz ovog bafera podaci se prenose u radnu oblast programa korisnika. U slučaju operacije pisanja situacija je obrnuta.

Page 13: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

11

05.5 Metode organizacije datoteka Već je napred napomenuto da je jedna od osnovnih operacija nad strukturom podataka pristup. Kod struktura na masovnim memorijama ima se u vidu pristup slogu u datoteci, a na raspolaganju su dve osnovne tehnike pristupa: Sekvencijalna (redosledna), gde se slogovima pristupa sekvencijalno onim redosledom kako su smešteni u datoteci, Slučajna (direktna), gde se slogovima ne pristupa ni prema kakvom unapred ustanovljenom redosledu, već na slučajan način. S obzirom na osnovne metode pristupa slogovima u datotekama, realizuju se sledeće osnovne metode organizacije datoteka: Sekvencijalne datoteke, Relativne datoteke, Direktne i Indeks-sekvencijalne datoteke.

Razvijen je i čitav niz datoteka koje eliminišu nedostatke navedenih, kao na primer: Indeksne ili indeks nesekvencijalne datoteke, VSAM (Virtual Sequential Access Method), Inverzne datoteke.

05.5.1 Sekvencijalne datoteke

Kod ovog tipa datoteke slogovi se memorišu neposredno jedan iza drugog i ovde se ne uspostavlja odnos između mesta sloga u datoteci i sadržaja sloga. Zato su ove datoteke nezavisne od memorijskih jedinica na kojima se realizuju, tj. mogu se smeštati na raznim perifernim jedinicama. Slogovi se smeštaju u datoteku logičkim ili hronološkim redosledom, što znači da se novi slog može dodati samo na logičkom kraju datoteke. Dakle, svaki slog osim prvog i poslednjeg ima svog prethodnika i sledbenika. Slogovi se u cilju racionalnog korišćenja prostora na medijumu nosača podataka, udružuju u blokove. Sekvencijalne datoteke mogu da budu hronološki uređene (kada se nazivaju sekvencijalne nesortirane ili serijske datoteke) ili da budu uređene prema logičkom redosledu (kada se nazivaju sekvencijalne sortirane datoteke).

Page 14: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

12

Struktura sekvencijalne datoteke je sledeća: Blok zaglavlja datoteke, (sadrži potrebne informacije koje koriste programi za

upravljanje datotekom (file system) koji ulaze u sastav operativnih sistema), Blokovi podataka, Oznaka logičkog kraja datoteke, (neophodna je da bi se imala informacija o zauzeću

memorijskog prostora koji je dodeljen datoteci), Oznaka fizičkog kraja datoteke, (da bi se imala informacija posle kojeg bloka više nema

mogućnosti za dodavanje blokova (slogova) u datoteku). 05.5.2 Relativne datoteke Relativne datoteke se realizuju na masovnim memorijama sa slučajnim pristupom. Relativne datoteke se sastoje od blokova fiksne dužine. Svaka ćelija može da sadrži samo jedan slog bez obzira na njegovu dužinu. Zbog toga se veličina ćelije definiše na osnovu veličine najvećeg sloga. Svaka ćelija ne mora da sadrži slog. Kod relativnih datoteka slog se smešta u bilo koju ćeliju koja mu se pridruži. Zato svaki slog kod relativnih datoteka podataka sadrži i ključ koji služi da se slogovi smeštaju u datoteku, kao i da bi se slogovi „zahvatali“ iz datoteke. Prvi blok kod relativne datoteke sadrži zaglavlje datoteke. Identifikator koji nosi naziv relativna adresa i koji služi za adresiranje slogova predstavlja redni broj sloga u datoteci. Slogovi u relativnoj datoteci se numerišu od 1 do n. Blok koji predstavlja zaglavlje numeriše se sa „0“. Ako je u datoteci popunjen mali broj ćelija, kaže se da je datoteka retka, a ako je većina ćelija popunjena, kaže se da je gusto popunjena datoteka. Da bi se pristupilo datom slogu potrebno je da se broj sloga konvertuje u broj bloka i broj ćelije u bloku. Neka je m-broj ćelija u bloku i k-broj željenog sloga. BrojBloka = [ 𝑘𝑘−1+𝑚𝑚

𝑚𝑚 ]

BrojCelijeUBloku=1+mod((k-1+m)/m) 05.5.3 Direktne datoteke Direktna organizacija datoteka (rasute ili hash datoteke) su slične relativnim datotekama, ali su eliminisani neki osnovni nedostaci relativnih datoteka. Kod datoteka sa direktnom organizacijom slogovi mogu biti različite dužine i u okviru bloka slede neposredno jedan iza drugog.

Page 15: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

13

Najveći nedostatak relativne datoteke je što se zapisu ne pristupa na osnovu vrednost ključa, već prema vrednosti rednog broja sloga u datoteci, koji nije sastavni deo sloga. Direktne datoteke predstavljaju način za uspostavljanje veze između ključa koji je sastavni deo sloga i relativne adrese koja omogućava direktan pristup traženom slogu. U opštem slučaju postupak za određivanje adrese sloga na osnovu vrednosti njegovog ključa sastoji se od sledećih koraka: Pretvaranje alfanumeričke vrednosti ključa u numeričku (ako ključ već nije numerički), Generisanje pseudoslučajnog broja na bazi numeričke vrednosti ključa, Pretvaranje pseudoslučajnog broja u relativnu adresu, Pretvaranje relativne adrese u fizičku (efektivnu) adresu.

Zbog nepostojanja metoda koja vrednost ključa jednoznačno preslikava u relativnu adresu, dva različita ključa se mogu preslikati u istu relativnu adresu Slogovi čiji se ključevi preslikavaju u istu adresu nazivaju se slogovi sinonimi. Pojava slogova sinonima se zove kolizija. Postoji više metoda za razrešavanje problema slogova sinonima. Najčešće korišćena metoda koristi dve oblasti u adresnom polju datoteke. Prilikom upisivanja sloga u datoteku, najpre se vrši pokušaj upisivanja u slog u odgovarajući blok (baket), koji pripada tzv. primarnoj (matičnoj) oblasti. Ukoliko je primarni (matični) blok popunjen, formira se lanac sinonima organizovan kao jednostruke spregnute strukture i slog se upisuje u taj lanac. Oblast koja sadrži sve lance sinonima naziva se oblast prekoračenja (overflow area). Izloženi postupak usložnjava (i poskupljuje) postupak dodavanja sloga u datoteku. Iz tih razloga, a da bi se poboljšala ekonomičnost u korišćenju memorijskog prostora na medijumu nosača podataka kod direktnih datoteka se ne dozvoljava sekvencijalno čitanje sloga iz datoteke. Dakle, kod direktnih datoteka ne postoji relacija prethodni i naredni slog. Iz napred navedenog se može zaključiti da kod direktnih datoteka ne postoji jedinstveno mesto u datoteci na koje se dati slog upisuje, a kao posledica se javlja poboljšanje ekonomičnosti korišćenja memorijskog prostora, ali se usporava proces pristupa datom slogu. 05.5.4 Indeks-sekvencijalne datoteke Kod indeks-sekvencijalnih (ISAM) datoteka slogovi se fizički ređaju po logičkom redosledu (sekvencijalno sa porastom ključa), ali se na početku datoteke formira tzv. indeksna struktura koja omogućava slučajan pristup. Indeksna struktura je hijerarhijski uređena i predstavlja strukturu stabla. Na najvišem hijerarhijskom nivou nalazi se osnovni indeks (master index) poznat i pod nazivom koren indeksa (root of the index).

Page 16: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

14

Slog u okviru indeksa sadrži najveću vrednost ključa i ukazivač na niži nivo indeksa. Prvi niži nivo indeksa poznat je pod nazivom indeks cilindra, a sledeći niži nivo se zove indeks traga (ili staze). Slučajan pristup se ostvaruje prolaženjem kroz indeksnu strukturu, a sekvencijalni pristup prolaženjem kroz sortiranu sekvencijalnu datoteku. Slogovi podataka u datoteci sadrže slogove podataka korisnika. Skup podataka na koje ukazuju ukazivači iz indeksa tragova predstavljaju primarnu oblast prekoračenja. Blokovi koji ne ulaze u primarnu oblast podataka, a sadrže slogove podataka korisnika obrazuju oblast prekoračenja. Kod ISAM datoteke oblast prekoračenja sastoji se od oblasti prekoračenja cilindra i oblasti prekoračenja datoteke. Oblast prekoračenja cilindra se sastoji od jednog ili više tragova na datom cilindru namenjenim za prihvatanje slogova koji ne mogu da budu smešteni u primarno oblasti podataka u datom cilindru. Slogovi u oblasti prekoračenja cilindra povezani su jedan sa drugim preko rastuće vrednosti ključa, dok je poslednji slog na tragu cilindra u primarnoj oblasti cilindra povezan sa prvim slogom u oblasti prekoračenja cilindra. U slučaju da ni u oblasti prekoračenja cilindra nema dovoljno memorijskog prostora za smeštanje slogova pridruženih datom cilindru, formira se oblast prekoračenja datoteke. Oblast prekoračenja datoteka prihvata prekoračenja iz oblasti prekoračenja svih cilindara. Popunjavanjem oblasti prekoračenja datoteke, datoteka je u potpunosti popunjena i dalje dodavanje sloga u datoteku nije moguće bez kompletne reorganizacije datoteke.

1 Povezane reprezentacije podataka - pokazivači

1.1 Uvod

Predstavljanje povezanih podataka I algoritmi koji se za to koriste, spadaju u bitne teme u informatici. Ponekad povezane reprezentacije podržavaju efikasne algoritme. Predstavljanje povezanih podataka je naročito korisno za aplikacije kod kojih je teško predvideti oblik i veličinu structure potrebnih podataka. Na primer, povezane reprezentacijje se mogu koristiti za prevazilaženje problema kod predviđanja koliko prostora treba alocirati za nizove kod tabela i listi pre pokretanja programa.

Page 17: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

15

Veličina koju tabela ili lista mogu dostići prilikom rada programa može zavisiti od ulaza u program. Broj ili veličinu tih ulaza tih ulaza nije uvek jednostavno predvideti. Ipak ponekad smo prinuđeni da alociramo niz određene veličine pre izvršavanja programa. Ukoliko napravimo pogrešne pretpostavke može se desiti da nam ponestane prostora za neku tabelu ili listu, dok u nekoj drugoj tabeli postoji neiskorišten prostor. Možemo koristiti povezane reprezentacije za prevazilaženje ovih problema. Za kreiranje povezane reprezentacije koristimo pokazivače da povežemo različite memorijske blokove. Pokazivač je varijabla (promenljiva) koja sadrži adresu druge varijable. Uobičajeno je da se u dijagramima povezanih struktura podataka pokazivači prikazuju strelicama. Ako dati blok sadrži pokazivač na sledeći blok, mi onda možemo pratiti taj pokazivač da pristupimo sledećem bloku. Praćenjem niza pokazivača koji upućuju jedni na drugi možemo proputovati pristupnu putanju (access path) u povezanoj reprezentaciji podataka. Štaviše, kada nam je data povezana struktura, možemo da dodamo ili izbrišemo određeni blok podataka dodavanjem ili brisanjem podataka pokazivača koji pokazuje na taj blok. To znači da povezana reprezentacija može da se uvećava ili smanjuje deo po deo omogućavajući programeru / korisniku da menja strukturu u malim koracima koristeći samo po nekoliko pokazivačkih operacija za svaki deo. Ova mogućnost otvara veoma zanimljivu klasu osobina rasta I kombinovanja za povezanu reprezentaciju koja je trenutno predmet intezivnih studija računarstva. Pokazivači se često koriste iz jos dva razloga: (i) ponekad je to način istraživanja određene operacije i (ii) najčešće se izražavaju u određenom programskom jeziku kompaknijim I efikasnijim kodom nego što se može uraditi na drugi način. Klasa povezanih reprezentacija podataka koju je omogućio razvoj ovakvih tehnika može imati značajne prednosti u odnosu na druge reprezentacije, kakva je sekvencijalna. U ovom poglavlju ćemo pokazati da se određene više strukture podataka, kao što su liste, stekovi, skupovi, stabla ili redovi za čekanje , mogu na više načina predstaviti nižim reprezentacijama podataka. Dve široke klase takvih nižih reprezentacija su sekvencijalna reprezentacija I povezana reprezentacija. Na ovaj način se postepeno dolazi do ideje o nivoima apstrakcije podataka. Ta ideja predstavlja jedan od osnovnih koncepta savremene informatike. Objekti i operacije na višim nivoima apstrakcije podataka se predstavljaju organizacijom objekata i operacija na nižim nivoima. Na primer, na najvišem nivou apstrakcije su takozvani apstrakni tipovi podataka (ATP)- strukture kao što su liste, stekovi, skupovi, stable I redovi za čekanje. Svaki se od ATP moze predstaviti na mnoštvo različitih načina pomoću nižih reprezentacija, uključujući I one dve široke klase – sekvencijalna reprezentacija I povezana reprezentacija slika 1.1.

Page 18: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

16

Na još nižim nivoima se povezana se povezana reprezentacija može predstaviti na više načina, na primer pomoću nizova slogova, ugrađenih C pokazivačkih tipova podataka ili paralelnih nizova.

Slika1.1

1.2 Šta su pokazivači?

Povezanu reprezentaciju podataka može da podrži bilo koji adresibilni memorijski medijum (RAM, disketa, CD ROM). Sledeći primer pokazuje mogućnost primene pokazivača.

1.2.1 Primer: Čuvanje podataka

Svaka memorija je niz numerisanih ili adresiranih memoriskih jedinica redom, kojima se može manipulisati ili upravljati pojedinačno ili u grupama. Jedan pokazivač je grupa memorijskih jedinica (najčešće dve ili četiri) koja sadrži jednu adresu. Na primer: ukoliko je c jedan karakter (char), a p je pokazivač koji pokazuje na c imamo sledeću situaciju:

Page 19: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

17

Razmotrimo sada čuvanje podataka na flopiju prikazanom na slici 2.1. Na velikom broju kompijutera je fajl definisan kao konačan niz bajtova. Takav se niz moze podeliti na uzastopne 512- bajtne blokove, koji se dalje mogu upisivati u prazne sektore diskete. Uzastopne blokove podataka povezujemo tako što u svakom bloku čuvamo adresu sledećeg bloka podataka odnosno pokazivač. Uobičajeno je i da se u nekom od praznih sektora diska čuva direktorijum fajlova. Svaki slog u direktorijumu sadrži ime fajla (npr. Moj Program.c), neke osobine fajla (npr. dužinu fajla u bajtovima, datum kreiranja kod za prepoznavanje tipa fajla) i pokazivač nan a prvi 512-bajtni blok od niza povezanih blokova u kojima se fajl čuva. Ukoliko je za smeštanje takvog direktorijuma više od 512-bajtnog sektora na disku, mogu se alocirati dodatni sektori zbog priširenja povezati sa krajem direktorijuma. Takva situacija je prikazana na slici 1.3.

Page 20: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

18

1.2.2 Definicija pokazivača Kada sačuvamo adresu α promenljive A unutar memorijske jedinice B, kažemo da B pokazuje na A i kažemo da je B pokazivač.

1.3 Pokazivači u C-u

Za upravljanje pokazivačima koristimo unarne operatore ’&’ i ’*’. Unarni operator ’&’ nam pokazuje adresu objekta, npr. p=&c: tu kažemo da je memorijska adresa ’c’ dodeljena varijabli ’p’, odnosno kažemo da (p pokazuje na c). Ovaj operator se koristi sa varijablama koje se nalaze u memoriji, i ne može se koristiti sa izrazima, konstantama ili varijablama tipa registar. Drugi unarni operator je ’*’ , on se koristi sa pokazivačima i omogućuje pristup objektu na koji pokazuje pokazivač. Kada želimo da kreiramo pokazivač koji pokazuje na memorijski blok koji sadrži celobrojne vrenosti, u svim programskim jezicima prvo moramo da deklarišemo pokazivač. U programskom C jeziku, prvo možemo deklarisati pokazivački tip, pa zatim pokazivače kao promenljive tog tipa, a možemo izvršiti i direktnu deklaraciju: Int*A,*B što znači da su A i B pokazivači na memorijske jedinice koje sadrže celobrojne vrednosti. Da bi namestili pokazivače na neku praznu celobrojnu memorujsku jedinicu na koju ce ukazivati A i B, u programskom jeziku C koristimo funkcije malloc i calloc, koje se koriste za dinamičku alokaciju memorije (memory allocation). Njihove deklaracije se nalaze ustandardnoj biblioteci C-a <stdio.h> i one glase: void*malloc(size_t size) malloc vraća jedan pokazivač na prostor za jedan objekat veličine size, ili NULL ako potražnja za memorijom nije zadovoljena. Ovom prostoru nije potrebno dati početnu vrenost. void*calloc(size_t nobj,size_t size) calloc vraća jedan pkazivač na jedan prostor za jedan niz od nobj objekta, gde je svaki objekat veličine size ili ova funkcija vraća NULL u koliko potražnja za memorijskim prostorom nije zadovoljena. Ni ovom prostoru nisu potrebne početne vrednosti.

Page 21: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

19

Način kreiranja pokazivača na memorijsku celobrojnu jedinicu vrši se: B=(int*)malloc(sizeof(int)); Kada želimo dodeliti vrednost memorijskoj jedinici na koju ukazuje npr. A5 ,to vršimo naredbom dodele *A=5 pri čemu * da se vrednost 5 smesta na adresu smeštenu pokazivačem promenjive A. Analogno možemo dodeliti vrednosti memorijskoj jedinici na koju ukazuje B, npr. *B=17 Kada bi bila izvršena naredba A=B, desilo bi se da i A i B pokazuju na polje na kom je smeštena vrednost 17.

1.4 Neke finesse – alijasi, recikliranje, “dangling” pokazivači

1.4.1 Alijasi Kada dva pokazivača ukazuju na istu adresu u memoriji (kao A i B na slici 1.5), onda se oni zovu alijasi (ukoliko želimo da promenimo vrednos 17, svejedno je da li ćemo za pisanje željene naredbe koristiti pokazivač A ili b).

Page 22: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

20

Slika 1.5

1.4.2 Recikliranje korištenog memorijskog prostora Vratimo se ponovo na situaciju sa slike 1.5, na polje u kome je smeštena 5 ne ukazuje nijedan pokazivač. Kada se desi takva situacija, kažemo da blok podataka postaje nedostupan. Za vraćanje nedostupnog bloka podataka u nelociranu memorijju koja se može koristiti, koristimo ugrađenu C funkciju free(X), gde je X pokazivač na memorijski blok koji želimo da recikliramo. Dakle da smo pisali: Free(A); A=B; Imali bi situaciju kao na a slici 1.6

Slika 1.6

Page 23: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

21

Funkcija free(X) je implementirana u standardnoj biblioteci <stdlib.h> i deklarišemo je i definišemo na sledeći način: void free(void *p) funkcija free oslobađa prostor na koji pokazuje p. U koliko je p NULL, ne radi ništa. P mora biti jedan pokazivač na jedan prostor, koji je pre alocirao calloc ili malloc. 1.4.3 “Viseći” pokazivači (dangling pointers) Osim alijasa, koji ukazuju na isti memorijski blok, postoji još jedna opasnost vezana za pokazivače. Da vidimo šta će se dogoditi ako krenemo od situacije sa slike 1.6, izvršimo naredbu free B a zatim pokušamo da izračunamo izraz *A+2. Prvom naredbom će se polje koje sadrži vrednost 17 “vratiti” u dinamičku memoriju. (Kada se to desi moguće je da će ili vrednost 17 biti izbrisana, ili će se polje koje je sadrži priključiti nekom većem memorijskom bloku). Sada A sadrži takozvani “viseći” pokazivač koji pokazuje na istu memorijsku jedinicu na koju je B pokazivao pre recikliranja. Može se dogoditi da referenca ovakvog pokazivača uopšte više nema smisla u C-u. Ovakve greške su posebno opasne jer ih ne otkrivaju ni kopmajler, a često ni ostali ugrađeni C sistemi. 1.4.4 Vek trajanja dinamičkog memorisanja Memorijski blokovi na koje ukazuju pokazivači se kreiraju dinamički tokom izvršavanja programa i možemo ih smatrati anonimnim promenljivima. Takve promenljive nemaju eksplicitno ime u program, ali je njihov životni vek duži od veka lokalnih promenljivih u programu. Može se reći da dinamički prostor alociran za anonimne promenljive C-naredbom malloc postoji od trenutka alokacije do trenutka kada se reciklira naredbom free(X) ili do prekida rada programa. 1.4.5 Derefereniciranje Kada zvezdica (*) prethodi imenu promenljive, kao kod *A, kažemo da je pokazivačka vrednost A dereferenciran. Kada zvezdica (*) prethodi novom indentifikatoru imena tipa T u definiciji tipa, ona definira pokazivački tip. Na primer, Typedef T *TPointer; Znači da je TPointer skup pokazivača na memorijske jedinice koje sadrže vrednosti tipa T. Tako zvezdica prethodi pokazivačkim promenljivima kada su one dereferencirane i prethodi indentifikatorima imena tipa kada se oni definišu. Kada se dereferencirana promenljiva *V, pojavi na levoj strani naredbe dodele, *V=X, onda ona označava da se kopija vrednosti iz X upisuje na lokaciju na koju pokazuje vrednost pokazivača V.

Page 24: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

22

1.5 Predstavljanje pokazivača u dijagramima

Pokazivači se u dijagramima prikazuju prema jednostavnim konvencijama. Na slici 1.7 je jedna povezana lista prikazana na tri ekvivalenta načina. Kućice predstavljaju čvorove liste (na engleskom node - čvor). Kada se adrese prikazuju eksplicitno, predstavljaju se slovima grčkog alfabeta (prvi red na slici 1.7) tada se prikaz elemenata liste sastoji iz dva polja, prvo (info) sadrži vrednost x1, a drugo (link) sadrži pokazivač, dok grčko slovo ispred elemenata liste predstavlja memorijsku adresu tog čvora liste. Postoji i specijalna nulta (NULL je rezervisana c u C-u) adresa koja po konvenciji nije adresa nijednog polja. Koristi se za označavanje kraja liste ili za prikaz prazne structure. Nulti pokazivač se još može prikazati i pomoću tačke (drugi i treći red na slici 1.7). Implicitni prikaz (treći red slike 1.7) se obicno koristi kod komplikovanih dijagrama, inače se češće koristi eksplicitni prikaz (slika 1.7, drugi red).

Slika 1.7 Kada je vrednost promenljive ili pokazivača nepoznata, možemo predstaviti tu nepoznatu vredost znakom pitanja (?) za nepokazivačke vrednosti, ili pokazivačem na krug u kome je upitnik za nepoznatu vrednost pokazivača (slika 1.8).

Page 25: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

23

Slika 1.8

1.6 Linearna povezana lista

Linearna povezana lista (ili skraćeno povezana lista) je niz elemenata, čvorova (node) u kome svaki od elemenata liste, osim poslednjeg, ukazuje na sledeći. Svaki čvor liste se sastoji iz dva polja, u jedno se smesta podatak (na engleskom najčešće Item), a u drugo pokazivač (obično se to polje naziva Link). Pokazivačko polje poslednjeg čvora sadrži nultu pokazivačku vrednost, NULL, koja označava kaj liste. Kao primer povezane liste koristićemo plan leta aviona. Na slici 1.8 je primer jedne liste, gde su DUS, ORD i SAN imena aerodrome (Dizeldorf, O Hara – Čikago i San Dijego). Pokazivačka promenljiva L sadrzi pokazivač na prvi elemenat u listi. Uobičajeno je i da se cela lista posmatra kao jedan objekat i u tom smislu da se L naziva vrednošću liste (DUS, ORD, SAN).

Page 26: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

24

Slika 1.9

Da bi mogli da manipulišemo listama, prvo treba da deklarišemo tipove podataka koji se u njima koriste. 1.6.1 Deklaracija tipova podataka za povezane liste Prvo treba da odredimo neki način za prikaz troslovnih aerodromskih kodova. Jedan od načina da se to uradi u C-u je da se definira tip ŠifraAerodroma kao niz dužine 4 u koji može da se smesti C niska koja se sastoji od aerodromskog koda (dužine tri) i nultog simbola (0) koji označava kraj niske. TypedefcharSifraAerodroma[4]; Dalje, treba da definišemo system emenata i pokazivača pomoću kojih ćemo manipulisati listom. Zato ćemo definisati tip za čvorove liste ČvorTip na sledeći Način: Typedef struct Čvorovi { ŠifraAerodroma Aerodrom; Struct Čvorovi *Link; }ČvorTip; Ovim je definisan ČvorTip kao struktura (struct) sa dva člana (ili komponente, ili polja): Aerodrom polje koje sadrže troslovni ŠifraAerodroma i Link polje, pokazivač na ČvorTip. Da bi Link polje Strukture ČvorTip moglo da pokazuje na drugi ČvorTip uvodi se Čvorovi. U C-u nije dozvoljeno da se definiše struktura koja sadrži samu sebe, ali je dozvoljeno da struktura sadrži član koje je pokazivač na strukturu istog tipa, kao sto je upravo urađeno. Još treba da deklarišemo promenljive N i L da sadrže pokazivače na čvorove tipa ČvorTip. ČvorTip *N, *L; Bitna ideja je i da se specijalni nulti pokazivač, NULL, automatski smatra vrednošću svakog pokazivačkog tipa definisanog u C-u. Tako je dozvoljeno napisati naredbu dodele kao L→Link = NULL;(da bi smestili nulti pokazivač u Link polje čvorova na koji pokazuje pokazivač L), ili pitalicu if(L→Link == NULL)(da proverimo pokazuje li L na poslednji čvor).

Page 27: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

25

1.6.2 Umetanje novog drugog čvora u listu Pretpostavimo da želimo da dodamo još jedno presedanje listi (planu leta) sa slike 1.8, tako da let ide iz Dizeldorfa preko Brisla (BRU) pa dalje kao i ranije.

VoidUmetanjeNovogDrugogČvora(void) { (deklaristai pokazivač N na čvorove liste) (alocirati novi čvor koji pokazuje N) (kopirati nisku “BRU” u N→Aerodrom) (postaviti N→Link da pokazuje na drugi čvor) (postaviti L→Link da pokazuje na novi čvor) } Još je važno uočiti da je u ovoj funkciji promenljiva N lokalna promenljiva. N postoji samo tokom izvršavanja funkcije i samo tada i sadrži pokazivač na novolocirani čvor. Pokazivačka vrednost N se smešta u Link polje prvog čvora liste pre kraja funkcije tako da prvi čvor liste L pokazuje na novolocirani čvor. Po prestanku izvršavanja funkcije, promenljiva N i njen sadržaj nestaju, dinamički alocirana memorija za novi drugi čvor liste L tokom izvršavanja funkcije ostaje i kada funkcija prekine sa radom.

Page 28: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

26

1.6.3 Pretraga liste Pretpostavljamo da nam je zadatak da u listi aerodromskih kodova L pronađemo čvor N koji sadrži aerodromski kod ’A’. Prepostavimo da su nam svi tipovi i promenljive deklarisani na prethodno opisani način. Pretpostavimo da nam se u zahtevu traži da izlaz iz funkcije bude pokazivač na čvor liste L koji sadrži kod ‘A’, ako takav čvor postoji. Ako čvor ne postoji, izlaz treba da bude NULL. Da bi mogli pristupiti listi L, pretpostavićemo da je L promenljiva deklarisana kao ČvorTIp *L, koja sadrži pokazivač na prvi čvor povezane liste (ili vrednost NULL ukoliko je L prazna lista). Jedna strategija za rešavanje ovakvog problema pretrage se sastoji u tome da postavimo N kao pokazivač na ČvorTip i pustimo da pokazuje na svaki čvor liste L redom, proveravajući redom sadrži li neki čvor znakovnu nisku za aerodromski kod A. Čim se naiđe na čvor koji sadrži znakovnu nisku za aerodromski kod A pretraga se obustavlja. ČvorTip *PretragaListe (char *A,ČvorTip *L) { (deklarisati pokazivač N na čvorove liste) (inicijalno postaviti N da pokazuje na prvi čvor) While(N nije NULL) { If (aerodromski kod čvora na koji N pokazuje je jednak A){ (izlaz je vrednost pokazivača N) }else { (promeniti pokazivač N da pokazuje na sledeći čvor L) } } (izlaz je vrednost iz N) /*rezultat pretrage liste je NULL u N*/ } 1.6.4 Brisanje poslednjeg čvora liste Opet ćemo pretpostaviti da nam je sve deklarisano na već objašnjen način. Pošto je poslednji čvor liste određen time što je njegovo Link polje postavljeno na vrednost NULL, Naš je zadatak da nekako pronađemo pretpostavljeni čvor liste i postavimo u njgovo Link polje NULL. U ovom rešenju koristimo dve pokazivačke promenljive nazvane PrethodniČvor (P) i AktuelniČvor (A). Kako napredujemo pokazivačem na čvor koji je neposredno ispred onog na koji pokazuje AktuelniČvor. Tako ova dva pokazivača “putuju” listom kao pokazivački par. Kada AktuelniČvor stigne do poslednjeg čvora liste, PrethodniČvor će pokazivati na pretposlednji. Sada nam još samo preostaje da postavimo vrednost Link polja ovog, pretposlednjeg čvora na NULL i tako ga proglasimo poslednjim čvorom liste.

Page 29: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

27

Da bi ovako rešenje (sa parom pokazivača) moglo da radi, lista mora sadržati barem dva čvora i to je prvi ulsov koji proveravamo. Ako je lista prazna, ne moramo joj ništa raditi; ako se lista sastoji samo od jednog čvora, moramo je “isprazniti”. Strategija je sledeća: Void BrisanjePoslednjegČvora(&L) {(deklarisati pokazivače A i P na čvorove liste L) If (lista L je ne prazna){ If (lista L ima tačno jedan čvor){ (zameni L praznom listom i izaći iz procedure) }else{ /*inace lista ima bar dva čvora*/ (postaviti pokazivače A i P da pokazuju na drugi prvi čvor liste L redom) /*pomerase pokazivački par udesno dok se ne dođe do kraja liste L*/ While(A ne pokazuje na posljednji sledeći par čvorova liste L) } /*sada AktuelniČvor pokazuje na poslednji čvor,a PrethodniČvor na pretposlednji čvor liste L*/ (poslednji čvor reciklirati, a pretposlednji čvor postaviti kao poslednji) } } } 1.6.5 Umetanje novog poslednjeg čvora u listu Neka nam je dat aerodromski kod A i adresa &L promenljive L koja sadrži pokazivač na prvi čvor liste L. Treba da umetnemo novi čvor koji sadrži kod A na kraj liste. Void UmetanjeNovogPoslednjegČvoraListe(char *a,ČvorTip **L) { (deklarisati pokazivače N, koja pokazuje na novi čvor P koja pokazuje na čvorove liste L) (alocirati novi čvor na koji pokazuje N, Aerodrom i Link poljima dodeliti vrednost iz A i NULL) If(lista je prazna){ (postaviti da je N prvi čvor liste L) }else { (ako lista nije prazna) (inicijalno postaviti P da pokazuje na prvi čvor L) While(P ne pokazuje na poslednji čvor liste L){ (postaviti P da pokazuje na sledeći čvor L) } (povezati čvor na koji pokazuje N kao poslednji) /*kada smo stigli do kraja liste*/ } }

Page 30: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

28

1.6.6 Stampanje liste Osnova PrintList funkcije je, opet, while petlja, u kojoj se redom pristupa uzastopnim čvorovima liste (pomoću pokazivača N). Unutar while petlje aerodromski kodovi se štampaju naredbom printf(“%s”,N→Aerodrom);. Prelazak na sledeći čvor liste obezbeđuje naredba N=N→Link;. Da bi odštampali zareze između kodova, ali ne i iza poslednjeg, koristimo if(N!=NULL) printf(“,”);. Na početku i na kraju liste se štampaju leva i desna zagrada. { (deklarisati pokazivač N na čvorove liste L){ (odštampati levu zagradu) (inicijalno postaviti N da pokazuje na prvi čvor) While(N ne pokazuje poslednji čvor liste L){ (odštampati sadržaj N→Aerodrom) (postaviti N da pokazuje na sledeći čvor liste) If(N nije NULL)(odštampamo “,”) } (odštampati desnu zagradu) /*kada smo stigli do kraja liste*/ } 1.6.7 Jedan celoviti program Do sada smo razvili biblioteku blokova korisnih za pisanje programa za povezane liste. Na kraju možemo da povežemo sve ove procedure u jedan smisleni celoviti program. U narednoj strategiji je prikazan primer jednog takvog programa: /*Prvo bi definisali tipove za čvorove liste (tip AerodromskiKod i tip ČvorTIp)*/ /*Zatim ispisujemo funkcije(UmetanjeNovogDrugogČvora,*/ /*BrisanjePoslednjegČvoraListe, UmetanjeNovoPoslednjegČvora i ŠtampanjeListe*/ Int JedanCelovitProgram(void) { (deklarisati pokazivač L na čvorove tipa ČvorTipa) /*Koristimo listu L==(DUS,ORD,SAN) i odštampamo je na sledeći način*/ (postaviti da je L prazna lista) (umetnuti novi poslednji element aerodromskim kodom DUS) (umetnuti novi poslednji element aerodromskim kodom ORD) (umetnuti novi poslednji element aerodromskim kodom SAN) (odštampati listu) /*pre nego što je izmerimo */ (umetnuti novi poslednji element aerodromskim kodom BRU) (odštampati listu) /*izmenjenu*/ (obrisati poslednji elemnt liste) (odštampati listu) /*izmenjenu*/}

Page 31: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

29

Ovakav program bi odštampao tri reda: (DUS, ORD, SAN) (DUS, BRU, ORD, SAN) (DUS, BRU, ORD)

1.7 Ostale povezane strukture podataka

Linearne povezane liste koje smo upravo predstavili nisu jedine povezane strukture podataka. Ako krenemo od elemenata koji sadrže SifraAerodroma i dva pokazivačka polja LeftLink i RightLink, možemo da konstruišemo povezanu strukturu koristeći veći broj organizacionih principa. Ovde ćemo ilustrovati samo tri od mnoštvo principa. Prvo treba da deklarišemo neke tipove podataka: typedef structCvor{ SifraAerodroma Aerodrom; structCvor *LeviLink; structCvor *DesniLink;

}CvorTip; Pretpostavimo da je tip SifraAerodroma isti kao i u prethodnim primerima. Uočimo još da čvor tipa CvorTip sadrži dva pokazivačka polja koja pokazuju na druge čvorovne liste.

Slika 1.10

Page 32: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

30

Slika 1.11 Na slikama 1.10 i 1.11 su respektivno prikazane dve strukture sačinjene od ovakvih elemenata – dvosmerna povezana lista (koristi se i naziv simetrično povezana lista) i dvosmerni povezani prsten. Treca struktura, prikazana je na slici 1.12, je povezano binarno stablo. Sastavljeno je od elemenata koji su istog tipa kao i čvorovi prethodne dve strukture.

Slika 1.12

Page 33: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

31

1.8 Primer primene – povezana lista i upravljanje virtualnom memorijom

Princip virtualne memorije se bazira na ideji da se koristi sekundarna memorija umesto RAM-a. Većina stranica se čuva na sekundarnoj jedinici. Kopije stranica se unose u RAM u trenutku kada to određeni proces zahteva i kasnije brišu, da bi obzbedio prostor za druge. Operativni sistem mora da vodi računa o slobodnom fižičkom RAM-u da bi mogao da alocira prostor za stranice koje se unose sa sekundarne jedinice. Ova informacija se čuva u kernel strukturi podataka koja se naziva Page Frame Database (PFD). Tu se održava i FIFO lista unešenih stranica (na taj način se odlučuje o odbacivanju). Pre odbacivanja stranice, Windows NT mora da ispita da li je stranica preuzeta sa sekundarne jedinice, pa ako nije, mora je kopirati pre brisanja. Ako stranica nije deljena, PFD sadrži pokazivač na PTE (Page Table Entry), tako da ako se ta stranica odbacuje, PTE se označi kao invalid. Ukoliko je stranica deljena, PFD sadrži pokazivač na odgovarajući PROTOPTE ulaz, ali i brojač referencnih stranica. Stranica se može brisati samo ako je brojač jednak 0. Uopšteno govoreći PFD čuva informacije o statusu svake fizičke stranice. Fizička stranica može biti u nekoliko stanja, na primer, može biti in-use, free, free but dirty, i tako redom. PFD ulaz je povezan u dvostruko povezanu listu, u zavisnosti od stanja fižičke stranice koju predstavlja. Na slici 1.13 prikazane su ove liste povezane kroz PFD.

Slika 1.13: Razne liste povezane kroz PFD

Page 34: Strukture podataka i - TFZR - Index Locked.pdf ·  · 2016-05-16algoritmi. Strukture podataka i II dopunjeno izdanje prof. dr. Dragica Radosav Nina Bijedić Ljiljana Đuretanović

32

1.9 Saveti na kraju poglavlja

Pazite na “viseće” pokazivače, Reciklirajte memoriju kad god možete, Vodite računa da svaka struktura ima kraj (NULL u pokazivaču), Proveravajte da li ima prazne dinamičke memorije, Obradite specijalne slučajeve, Koristite dijagrame prilikom dizajniranja programa, Očuvajte pristup čvorovima koji će vam možda trebati kasnije.