You are on page 1of 33

STRUKTURE PODATAKA I ALGORITMI

-UVOD i LISTE-
Elektrotehnički fakultet, Banja Luka

Dijana Vuković - SPA 2016 1

STRUKTURE PODATAKA – DEFINICIJA
• Struktura podataka - opis načina organizacije
podataka; “statički” aspekt nekog programa, tj. struktura
podataka je ono sa čime se radi
• Termini „tip podatka“, „apstraktni tip podatka“ i
„struktura podataka“ su sinonimi.
• Strukture podataka mogu se podijeliti po dva kriterijuma:
– po složenosti relacija između elemenata
• linearne strukture podataka,
• nelinearne strukture podataka,
– po mogućnosti promjene veličine strukture pri
izvršavanju
• statičke strukture podataka,
• dinamičke strukture podataka.
Dijana Vuković - SPA 2016 2

ALGORITAM – DEFINICIJA
• Algoritam - opisuje načina obrade
podataka.
• Struktura podataka prethodi algoritmu,
jer najprije treba da postoji objekt da bi
se nešto moglo raditi sa njim.
• Složenost strukture podataka ipak nije u
 direktnoj zavisnosti sa složenošću
algoritma.
• Postoje složeni algoritmi sa vrlo prostim
strukturama i obratno.
Dijana Vuković - SPA 2016 3

• Po ovom kriterijumu strukture se dijele na statičke i dinamičke. • Tako se zauzima onoliko memorijskog prostora koliko je stvarno potrebno. pa se memorija efikasnije koristi. • Statičke strukture imaju fiksnu veličinu koja se određuje pri prevođenju. Dijana Vuković .Klasifikacija struktura podataka • Kriterijum za drugu podjelu je mogućnost promjene v eličine strukture pri izvršavanju.SPA 2016 4 . • Dinamičke strukture mogu da se povećavaju ili smanjuju u vrijeme izvršavanja programa saglasno potrebama za umetanjem novih elemenata ili brisanjem postojećih.

Klasifikacija struktura podataka • Strukture podataka koje se čuvaju na spoljašnjim memorijama nazivaju se datotekama. Tako se razlikuju: sekvencijalne. • Osnovni element datoteke je najčešće zapis. • Na osnovu fizičkog i logičkog rasporeda elemenata strukture u memoriji mogu se razlikovati dva osnovna načina predstavljanja: Dijana Vuković . • Fizička uređenost zapisa u datoteci i skup operacija za pristup zapisima određuje način organizacije datoteke. indeksno sekvencijalne i datoteke sa više ključeva. relativne. • Memorijska reprezentacija strukture podataka u memoriji se često naziva memorijskom strukturom.SPA 2016 5 .

pozicija i veličina pojedinih elemenata. Ovako se najčešće u memoriji predstavljaju linearne strukture (nizovi).Klasifikacija struktura podataka • Sekvencijalna (kontinualna) reprezentacija i • Ulančana (spregnuta. a elementi mogu biti istog ili različitog tipa i veličine. Dijana Vuković .nekontinualna) reprezentacija Kod  sekvencijalne reprezentacije elementi strukture se smještaju jedan za drugim u jednom kontinualnom prostoru tako da su fizički i logički poredak isti. Pristup svakom elementu je direktan i zahtijeva poznavanje početne adrese strukture. Jedan element zavisno od svoje veličine može smještati u jednu memorijsku lokaciju ili više uzastopnih lokacija.SPA 2016 6 .

mora da postoji drugi način da se izraze veze elemenata u strukturi. • Pošto ovdje logičko susjedstvo ne može biti određeno pozicijom elementa. na proizvoljnim mestima u memoriji.Klasifikacija struktura podataka • Kod ulančane reprezentacije elementi su raspoređeni u nekontinualnom prostoru. • Za tu svrhu služi  pokazivački tip – elementarni tip čiji skup vrednosti sadrži memorijske adrese. Dijana Vuković .SPA 2016 7 . a njihov fizički poredak nema nikakve veze sa logičkim poretkom.

• Poređenje sekvencijalne i ulančane reprezentacije u pogledu iskorišćenja prostora i brzine pristupa pokazuje da obje imaju svoje prednosti i nedostatke.SPA 2016 8 .Klasifikacija struktura podataka • Pokazivači su promjenjljive koje sadrže adrese drugih promjenljivih u memoriji. na svog prethodnika i sljedbenika u listi. • Primjer: U dvostruko ulančanoj listi svaki element ima dva pokazivača. pa zato i svaki element strukture uključuje i jedan ili više pokazivača koji sadrže adrese njegovih logičkih susjeda. Dijana Vuković .

onda kažemo da je lista prazna.SPA 2016 9 . Prvi element liste nema svog prethodnika.  Dijana Vuković . • Lista je konačan niz (od nula ili više) podataka istog tipa. Osnovno svojstvo koje karakteriše linearne strukture podataka je postojanje određenog poretka između elemenata strukture. Ako je broj podataka u listi nula. Podaci koji čine listu nazivaju se elementima liste. LISTA – LINEARNA STRUKTURA PODATAKA • Liste spadaju u linearne strukture podataka. kao što ni posljednji element liste nema svog sljedbenika.

TIPOVI LISTA • Jednostruko ulančane liste • Dvostruko ulančane liste • Cirkularne liste Dijana Vuković .SPA 2016 10 .

. – Koje su moguće operacije nad elementima liste. . a3.n)..GENERALNI OBLIK LISTE • Posmatrajmo listu u generalnom obliku kao - a1. a2. . – i – pozicija elementa u listi. an – n – broj elemenata liste. posmatrajući navedene karakteristike liste u generalnom obliku? – Koji su potencijalni problemi koji se mogu pojaviti pri implementaciji mogućih operacija? Dijana Vuković . – ai – element liste (i=1.SPA 2016 11 . .

JEDNOSTRUKO ULANČANE LISTE • Pod pojmom ulančana lista podrazumijeva se kolekcija čvorova koji zajedno formiraju linearni poredak.  Dijana Vuković . a posljednji tail (tail se može definiše kao čvor koji ima null NEXT referencu). Svaki čvor u listi je složen objekat koji skladišti referencu na element i još jednu referencu zvanu NEXT na sljedeći čvor. Poredak je utvrđen na osnovu dječije igre „Follow the Leader“.SPA 2016 12 . • Prvi čvor se naziva head.

prezime ili broj indeksa studenta. • sa određene pozicije (removeAt()). npr.  – Operacija brisanja • sa početka liste (removeElement()). za listu studenata) (findElement(). head()). • relativno u odnosu na tekući element (nextElement(). Dijana Vuković . • iza / ispred nekog elementa liste (insertAfter()). • po ključu (vrijednosti elementa ili nekog njegovog dijela.   – Operacija pretraživanja • po indeksu (getElementAt()). findElementByX()). • na proizvoljno mjesto u listi (insertAt()).• Operacije koje se mogu vršiti nad jednostruko ulančanim listama su:  – Operacije umetanja elementa • na prvo mjesto u listi (insertFront()).SPA 2016 13 .

SPA 2016 14 .DINAMIČKA JEDNOSTRUKO ULANČANA LISTA typedef int tip. head }. • Potrebna nam je struktura u kojoj imamo: – element liste (element) – pokazivač na sljedeću takvu strukturu (next) • Čvor (node) • head je pokazivač na prvi čvor liste Dijana Vuković . struct node { 17 35 12 tip element. struct node *next.

Primjer jednostruko ulančane liste • Napisati program koji će pročitati niz listaDyn. Učitavati podatke koje se želi brisati iz liste.SPA 2016 15 . Dijana Vuković . Program se završava kad se upiše podatak koji ne postoji u listi. Ispisati redom sadržaj liste.c cijelih brojeva i od njih oblikovati linearnu jednostruko povezanu listu tako da podaci budu u rastućem nizu.

// head liste FILE *fin. . // ulazna datoteka . break. } else { struct node { printf ("Nema vise mjesta\n").main() (1) int main (void) { int element. // element i brojac elemenata node *head. } 17 35 42 head Dijana Vuković . tip element... if ((dodaj (&head. typedef int tip. "%d"..SPA 2016 16 . element))) { ispisi (head). } typedef struct node node. while (fscanf (fin. } }.... &element) != EOF) { . j. struct node *next. fclose (fin).

SPA 2016 17 . } Traži se od glave sve dok se ne pronađe traženi element (ili dođe do NULL) p 17 35 42 Primjer: Tražimo podatak 42 head Dijana Vuković . p != NULL. tip element) { node *p. } return NULL.Pretraživanje po elementima liste node *trazi1 (node *head. p = p->next) { if (p ->element == element) return p. for (p = head.

tip element) { node *p.3) node *trazi1 (node *head. } node *trazi2 (node *head. tip element) { node* p. head = head->next). return head. tip element) { for (. p != NULL. for (p = head.SPA 2016 18 . } return NULL. p = p->next). head && head->element != element. for (p = head. } Dijana Vuković .2.Pretraživanje po elementima liste (1. return p. p = p->next) { if (p ->element == element) return p. } Zar ovo neće promijeniti pokazivač head (tako da on na kraju pokazuje na podatak koji tražimo)? node *trazi3 (node *head. p && p->element != element.

ali samo lokalnu kopiju u funkciji trazi3(). return head. node *trazi3 (node *head. head = head->next).SPA 2016 19 . head && head->element != element. tip element) { for (. } trazi3 head &(node 2) 1) 17 35 42 head main &(node 1) Dijana Vuković .head kao parametar funkcije Odgovor: hoće.

} promijeni_head headp &head **headp 17 35 42 head == *headp main NULL &(node 1) Kad unutar funkcije f želimo promijeniti adresu koja se sadrži u pokazivaču head = &node (a ne vrijednost na koju on pokazuje). node *n) { .. . &head) Dijana Vuković .. *headp = NULL.SPA 2016 20 ...Kako promijeniti head Zašto pointer na u funkciji? pointer? void *promijeni_head (node **headp. tada funkciji moramo poslati pokazivač na taj pokazivač (tj.

} Primjer: umetanje elementa 11 na početak liste novi 11 *headp **headp headp head 17 35 42 Dijana Vuković ..Dodavanje na početak liste int dodaj (node **headp. if ((novi = (node *) malloc(sizeof(node))) == NULL) return 0. if (*headp == NULL || (*headp)->element >= element) { // Dodavanje na pocetak liste novi->next = *headp.SPA 2016 21 . novi->element = element.. tip element) { node *novi. *headp = novi. } else { // dodavanje u sredinu liste . *p. } return 1.

else { // Dodavanje iza postojeceg elementa kad: // a) postojeci node nema sljedeceg // b) element u sljedecem cvoru je veci ili jednak novome for (p = *headp.Dodavanje unutar liste int dodaj (node **headp. p->next && (p->next)->element < element. } return 1. novi->next = p->next. tip element) { . p = p->next). p->next = novi. } Primjer: umetanje elementa 39 u listu p novi 39 *headp **headp headp head 17 35 42 Dijana Vuković ...SPA 2016 22 .

if ((novi = (node *) malloc(sizeof(node))) == NULL) return 0. *headp && ((*headp)->element < element). } Dijana Vuković . headp = &((*headp)->next)). for (. *p. tip element) { node *novi.Dodavanje elemenata u listu (2) int dodaj1 (node **headp. return 1. *headp = novi.SPA 2016 23 . novi->next = *headp. novi->element = element.

} return 1. } else { // Brisanje iza clana liste .. element)) == NULL) return 0. if (p == *headp) { // Brisanje s pocetka liste pp = (*headp)->next.Brisanje elementa s početka liste int brisi (node **headp. *headp = pp. if ((p = trazi1 (*headp. *pp. } Primjer: brisanje podatka 17 p pp *headp **headp headp head 17 35 42 Dijana Vuković . free (*headp). tip element) { node *p.SPA 2016 24 ..

pp = pp->next).. // Povezi prethodni node sa sljedbenikom izbrisanog cvora pp->next = p->next. pp->next != p. } Primjer: brisanje podatka 39 pp p *headp **headp headp head 17 35 39 42 Dijana Vuković . } else { // Brisanje iza clana liste // pronadji prethodni node for (pp = *headp.Brisanje elementa iz sredine liste int brisi (node **headp. tip element) { .SPA 2016 25 . } return 1. // oslobodi memoriju zauzetu elementom koji se brise free (p)..

*headp = (*headp)->next.SPA 2016 26 . } } Dijana Vuković . tip element) { node *p.Brisanje elemenata (2) int brisi1 (node **headp. for (. free (p). *headp && (*headp)->element != element. return 1. headp = &((*headp)->next)). } else { return 0. if (*headp) { p = *headp.

koji pokazuje na prethodni čvor u listi. Dijana Vuković . Header ima validnu NEXT referencu. koji pokazuje na sljedeći čvor i PREV. dummy čvorovi ne sadrže nikakav element.SPA 2016 27 .DVOSTRUKO ULANČANE LISTE • Ono što je karakteristično kod dvostruko ulančanih lista je da čvor u ovim listama skladišti dvije reference: NEXT. a null PREV referencu (kod trailer-a je suprotno). • Po konvenciji se u dvostruko ulančanu listu dodaju još dva čvora: header (ispred prvog čvora u listi) i trailer (nakon posljednjeg čvora u listi) – ovi tzv.

Dijana Vuković .SPA 2016 28 . insertBefore()). – Operacija brisanja • removeElement(). – Operacija pretraživanja • po indeksu (getElementAt()). • na proizvoljno mjesto u listi (insertAt()). • removeAt(). findElementByX()). • removeBack().• Operacije koje se mogu vršiti nad dvostruko ulančanim listama su: – Operacije umetanja elementa • na prvo mjesto u listi (insertFront()). • relativno u odnosu na tekući element (nextElement(). prezime ili broj indeksa studenta. npr. • removeHead(). • iza / ispred nekog elementa liste (insertAfter(). tail()). • na posljednje mjesto u listi (insertBack()). prevElement(). head(). za listu studenata) (findElement(). • po ključu (vrijednosti elementa ili nekog njegovog dijela.

17 35 12 struct node { tip element.SPA 2016 .DVOSTRUKO ULANČANE LISTE typedef int tip. • Potrebna nam je struktura u kojoj imamo: – element liste (element) – pokazivač na sljedeću takvu strukturu (next) – pokazivač na prethodnu takvu strukturu (prev) • head je pokazivač na početak liste • tail je pokazivač Dijana na kraj liste 29 Vuković . }. struct node *prev. head tail struct node *next.

SPA 2016 30 . Dodavanje elemenata u DLL novi 39 *headp **headp *tailp headp head 17 35 42 tail tailp Dijana Vuković .

Brisanje elementa iz DLL *headp **headp *tailp headp head 17 35 42 tail tailp Dijana Vuković .SPA 2016 31 .

SPA 2016 32 .CIRKULARNE LISTE • Kružna struktura • next posljednjeg čvora pokazuje na prvi čvor (umjesto na NULL) • prev prvog čvora pokazuje na posljednji čvor (umjesto na NULL) 17 35 12 head Dijana Vuković .

com/channel/UCwbsWIWfcOL2FiUZ2 hKNJHQ – kurs CS 61B.SPA 2016 33 .com/watch?v=yJLFyy6nCIM&list=P L3D11462114F778D7 • Vizuelne simulacije pojedinih struktura podataka - https://visualgo.youtube.Korisni linkovi za učenje • https:// www.youtube. • https:// www.net/list Dijana Vuković .