Professional Documents
Culture Documents
Ulancane Liste - Seminarski
Ulancane Liste - Seminarski
BLACE
SEMINARSKI RAD
Student:
Aleksandar Ristić 30/08 - III
Ulančane liste
Profesor:
dr Branislav Jevtović
Blace, 2009.
3
Ulančane liste
1. Sadržaj:
2
Ulančane liste
Ulančana implementacija linearne liste se naziva ulančanom listom (linked list). Dok su u
sekvencijalnoj reprezentaciji uzastopni elementi linearne liste susedni u memoriji, a početne adrese
su na fiksnom rastojanju određenom veličinom elementa, u ulančanoj reprezentaciji oni mogu biti
bilo gde u memoriji. Kako se logički poredak elemenata ne može izvesti iz fizičkog poretka, mora
da postoji drugi način za održavanje ovog poretka. Ovo se postiže tako što element liste sadrži
eksplicitnu adresu narednog elementa - pokazivač na njega. Zato svaki element liste (uobičajeni
naziv - čvor) pored informacionog sadržaja elementa (oznaka info) sadrži i pokazivač (oznaka next)
na sledbenika - čvor koji je sledeći u logičkom poretku (slika 1). Informacioni sadržaj može biti bilo
kojeg skalarnog ili strukturiranog tipa, ali je najčešće zapis. Listi se pristupa preko jednog
spoljašnjeg pokazivača koji pokazuje na prvi čvor, a koji nije deo liste (oznaka list). Prvi čvor se
obično naziva glavom (head) liste. Ukoliko je lista prazna, onda pokazivač list ne ukazuje nikuda i
ima vrednost praznog pokazivača (list = nil). Poslednji čvor se obično naziva repom (tail) liste. On
nema svoga sledbenika, pa sadrži prazan pokazivač, što je i oznaka kraja liste.
Postoji više vrsta lista u zavisnosti od načina povezivanja. Lista sa slike 1, kod koje svaki
čvor ukazuje samo na svog sledbenika, naziva se jednostruko ulančanom listom. Ukoliko se po
informacionom sadržaju liste info ili nekom njegovom delu može definisati funkcija poređenja i ako
su čvorovi uvezani po rastućim (ili opadajućim) vrednostima, kaže se da je lista uređena. U
suprotnom, kada poredak ne zavisi od vrednosti sadržaja, lista je neuređena. Ukoliko je lista
povezana tako da poslednji čvor ukazuje na prvi čvor, lista je kružna (slika 2). Lista u kojoj svaki
čvor, osim na sledbenika, ukazuje dodatnim pokazivačem (oznaka prev) i na prethodnika je
dvostruko ulančana lista (slika 3). Lista je najčešće homogena što znači da su čvorovi istog tipa.
3
Ulančane liste
Prilikom izlaganja o operacijama sa listama usvojena je sledeća notacija. Ako je p pokazivač na neki
čvor liste, onda info(p) predstavlja korisni sadržaj ovog čvora, next(p) je pokazivač na sledbenika, a
prev(p) je pokazivač na prethodnika.
3. Dinamička alokacija
Ulančana lista je dinamička struktura čiji broj čvorova varira saglasno operacijama umetanja
i brisanja. Za razliku od sekvencijalne alokacije, gde se unapred rezerviše prostor za sve elemente
strukture, kod ulančane liste prostor za neki čvor se alocira tek kad je to stvarno potrebno, prilikom
operacije umetanja tog čvora u listu. Za razliku od umetanja, prilikom operacije brisanja zauzeti
prostor treba da se oslobodi i učini raspoloživim za neku naknadnu primenu. Prema tome, kod
ulančane reprezentacije neophodno je postojanje nekog mehanizma koji vrši dinamičku alokaciju i
dealokaciju prostora.
Slika 4 – Korisnička lista na koju ukazuje pokazivač list i lista slobodnog prostora na koga ukazuje pokazivač avail
4
Ulančane liste
Pri formiranju novog čvora liste poziva se posebna funkcija GETNODE. Funkcija
GETNODE izvlači prvi slobodan čvor iz liste, postavlja polje pokazivača na nultu vrednost (nil),
vraća njegovu adresu i ažurira pokazivač avail.
GETNODE
if (avail = nil) then
ERROR(Nema slobodnog čvora)
end_if
q = avail
avail = next(avail)
next(q) = nil
return q
Kada bi broj slobodnih čvorova bio beskonačan, ne bi bilo potrebe za oslobađanjem prostora
koji zauzima čvor kada se on briše iz liste. Međutim, kako je slobodni prostor ograničen, ako ništa
drugo onda ograničenom memorijom, potrebno je da se zauzeti čvor, koji se izbacuje iz liste, vrati u
slobodan prostor i tako učini raspoloživim za ponovno korišćenje. Za tu svrhu predviđena je
procedura FREENODE(p) koja oslobađa čvor sa zadatom adresom p.
FREENODE(p)
next(p) = avail
avail = p
5
Ulančane liste
predstavljanje skupova i
predstavljanje polinoma.
6
Ulančane liste
0 0 4 0 0 0 0
0 0 0 5 0 11 0
X = 0 0 0 0 0 0 0
9 0 0 8 0 0 0
0 0 0 0 0 0 15
Kod ovakvog načina predstavljanja retkog niza umetanje novog elementa i brisanje
postojećeg elementa ne zahtevaju nikakvo pomeranje ostalih elemenata, već samo prosto
prevezivanje liste. Takva pogodnost je postignuta uz nešto veće zauzeće prostora zbog dodatnog
pokazivača. Ovo povećanje je relativno manje ukoliko je dimenzija niza veća (procentualno 100/(n
+ 1)). S druge strane, kod ulančane reprezentacije prostor se alocira samo za onoliko nenultih
elemenata koliko ih trenutno ima, dok vektorska implementacija najčešće zahteva statičko alociranje
prostora za maksimalni očekivani broj elemenata.
Polje val sadrži vrednost nenultog elementa, polje row indeks vrste, a polje col indeks
kolone. Prema tome, ako je X[i,j] 0 onda je za odgovarajući čvor val = X[i,j], row = i, a col = j.
7
Ulančane liste
Polje right je pokazivač na sledeći nenulti element u istoj vrsti, a polje down pokazivač na sledeći
nenulti element u istoj koloni. Tako je svaki čvor, koji nije zaglavlje, član dve kružne liste. Za svaku
vrstu i kolonu je predviđena po jedna lista. Zaglavlja lista su organizovana u dva niza R[i] i C[i].
Zaglavlje takve liste ima samo jedno značajno polje koje ukazuje na prvi nenulti element u vrsti
(ako je lista za vrstu) ili koloni (ako je lista za kolonu). Ako neka vrsta ili kolona nema nenultih
elemenata, odgovarajuća lista je prazna, pa zaglavlje ukazuje samo na sebe. Na slici 8 je prikazan
izgled ovakve predstave za retku matricu sa slike 6.
R 1 2 3 4 5 6 7
C
1
1 3 4
2 4 5 2 6 11
4
4 1 9 4 4 8
5
5 7 15
Operacija pristupa elementu X[i,j] sada ide po listi na koju ukazuje zaglavlje R[i] ispitujući
elemente sve dok ne naiđe na takav čvor kod kojeg je col = j, pa uzima njegovu vrednost val.
Ukoliko se dođe do elementa čiji je col veći od j ili se vrati do zaglavlja liste, onda je X[i,j] = 0.
Operacija upisivanja vrednosti nekog elementa, koja rezultuje umetanjem novog nenultog elementa,
mora da ulanča novi čvor u dve liste na tačno određenu poziciju, dok postavljanje postojećeg
elementa na nulu mora da izbaci čvor i preveže dve liste. Pri traženju elementa X[i,j] može da se
8
Ulančane liste
krene i po koloni, od zaglavlja kolone C[j], pogotovo ako je i < j, jer je tada verovatnije da se
element nalazi bliže početku kolone nego početku vrste.
Skup se jednostavno može definisati kao kolekcija članova ili elemenata, gde je svaki član ili
skup ili primitivni, atomski element (celobrojni, znakovni, itd.). Svi članovi jednog skupa su
različiti. Sve moguće vrednosti koje članovi skupa mogu imati čine osnovni skup (universal set).
Među članovima skupa može (ali ne mora) postojati poredak uređenja zasnovan na relacijama veće,
manje i jednako. Skupovna vrednost se obično predstavlja velikim zagradama (na primer, skupovna
vrednost sa četiri celobrojna člana {1, 4, 7, 9}).
Osnovna relacija u teoriji skupova je pripadnost elementa skupu (operator ). Ako x pripada
osnovnom skupu nad kojim je definisana skupovna vrednost A, onda je relacija x A istinita ako je
x član skupa A, na primer 5 {8, 2, 5}. Skup koji nema nijednog člana se naziva prazan skup - .
Relacija x je uvek neistinita. Ako je svaki član skupa A takođe i član skupa B, tada je skup A
podskup skupa B (A B), a skup B je nadskup skupa A (B A). Prazan skup je podskup svakog
9
Ulančane liste
Osnovne operacije sa skupovima su unija (+), presek(*) i razlika (-). Unija dva skupa je skup
sa elementima koji su članovi ili skupa A ili skupa B ili oba skupa:
x (A + B) (x A) or (x B) .
Presek dva skupa čine samo oni elementi koji se nalaze i u jednom i u drugom skupu:
x (A * B) (x A) and (x B) .
Razliku dva skupa čine oni elementi skupa A koji nisu elementi skupa B
x (A - B) (x A) and not (x B) .
Pored ovih operacija javljaju se i operacije umetanja i brisanja pojedinog elementa skupa.
Način reprezentacije skupa se bira na osnovu broja elemenata u skupu i tipičnih operacija.
Dve najčešće implementacije su sekvencijalna i ulančana. Zbog poređenja sa ulančanom, ovde se
ukratko razmatra i sekvencijalna reprezentacija u vidu vektora bitova. Ako osnovni skup fiksne
veličine ima n vrednosti kojima se mogu pridružiti redni brojevi 1..n (vrednosti x1,…, xn), onda se
svaki skup A definisan nad ovim osnovnim skupom može predstaviti vektorom bitova dužine n, gde
i-ti bit predstavlja i-ti element xi osnovnog skupa. Ako je ovaj bit jednak 1, to znači da xi pripada
skupu A, a ako je nula, znači da element xi nije član skupa A.
10
Ulančane liste
Ako se radi sa polinomima jedne nezavisno promenljive, polinom je algebarski izraz koji se
sastoji od zbira članova, pri čemu opšti član ima formu aixi. Prema tome, za svaki član treba pamtiti
koeficijent ai i stepen promenljive i. Pri izboru načina predstavljanja treba imati u vidu da polinom
može da ima nepredvidljiv broj članova, da članovi koji odgovaraju mnogim stepenima mogu da
izostanu i da pri operacijama sa njima redovno nastaje potreba za ubacivanjem novih članova ili
brisanjem postojećih. Ovo su upravo tipične okolnosti u kojima je ulančana reprezentacija bolja od
sekvencijalne, pa je prirodno usvojiti predstavu u vidu ulančane liste. Analizom operacija može se
utvrditi da se obično kroz polinom prolazi u jednom smeru, tako da je dovoljno usvojiti jednostruko
ulančanu kružnu listu sa zaglavljem. Prema tome, čvor liste treba da sadrži polja: c za koeficijent,
11
Ulančane liste
exp za stepen promenljive x i next za pokazivač na sledeći čvor. Pored toga, zbog efikasnosti
operacija pogodno je listu držati uređenom po opadajućoj vrednosti polja exp. Tako bi, na primer,
predstava polinoma 3x15 – 8x7 + 2x - 6 izgledala kao na slici 9.
12
Ulančane liste
4. Literatura
www.wikipedia.org
13