Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 6

JEDNOSTRUKO VEZANE LISTE U C JEZIKU

U ovom tekstu emo se upoznati s osnovnim strukturama i tehnikama izgradnje vezanih listi uz poneka objanjenja, crtee, primjere koda, itd. Vezane liste su korisne za uenje zbog dva razloga. Vezane liste su podatkovne strukture koje elimo koristiti u pravim programima. Vezane liste su klasino podruje za svakog programera koje koristi za istraivanje i vjebu s pokazivaima, iako nikada nisu planirali koristiti vezane liste.

1. OSNOVNE STRUKTURE LISTE


1.1 ZATO VEZANE LISTE?
Vezane liste i nizovi su slini jer oboje pohranjuju neku kolekciju podataka. Specifian tip elemenata nije vaan jer ista struktura pohranjuje elemente bilo kojeg tipa. Jedan od naina za razumijevanje vezanih listi je da pogledamo kako rade nizovi i razmislimo o alternativnim pristupima.

1.2 NIZOVI
Nizovi su najvjerojatnije najvie koritena struktura podataka za pohranu veeg broja elemenata. U veini jezika, nizovi su povoljni jer koriste [] sintaksu pomou koje moemo pristupiti svakom elementu uz pomo njegovog indeksnog broja. Sljedei primjer pokazuje jedan tipian oblik niza i sliku kako bi niz mogao izgledati u memoriji. Primjer alocira niz int niz_brojeva[50], postavlja vrijednosti trima prvim elementima u 1, 2, 3 i ostavlja ostatak niza neinicijaliziranim.
void Array_Test () { int niz_brojeva[50]; niz_brojeva[0] = 1; niz_brojeva[1] = 2; niz_brojeva[2] = 3; }

Ovo je crte kako brojevi mogu izgledati u memoriji. Kljuna stvar je da je cijeli niz alociran kao jedan blok u memoriji. Svaki element u nizu dobiva svoj prostor u nizu. Bilo kojem elementu se moe direktno pristupiti pomou [] sintakse.
brojevi

1
indeks 0 1

2
2

3
3

-3451

23456
49

Jednom kada je niz napravljen, pristup bilo kojem elementu je brz i pouzdan s [] operatorom. Pristup nizu s izrazom poput niz_brojeva[i] je skoro uvijek implementiran koristei aritmetiku brzog adresiranja: adresa elementa je prikazana kao odreeni pomak od poetka niza. Nedostatci niza su sljedei: 1. Veliina niza je fiksna 50 elemenata u naem sluaju. Najee je ta veliina koritena u vremenu kompajliranja s jednostavnim deklaracijama. S malo vie truda, veliina niza moe biti nepoznata sve dok niz nije stvoren za vrijeme izvoenja programa, ali nakon toga veliina ipak ostaje fiksna. 2. Upravo zbog gore navedenog, najpouzdaniji nain za programera je da stvori dovoljno velik niz. Iako je pouzdano, ovaj nain ima dva nedostatka: veinu vremena niz je neiskoriten i taj neiskoriteni prostor je ustvari nepotreban. Ako programer ikada zatreba vie od zadane veliine niza, kd ''puca''. 3. Umetanje elemenata na poetak niza je potencijalno skupo jer se ve postojei elementi moraju pomaknuti u stranu da bi napravili mjesta. Vezane liste imaju svoje nedostatke i prednosti, ali se doimaju jake na onim poljima gdje se nizovi pokazuju slabima.

1.3 POKAZIVAI
Ovo je mali pregled terminologije i pravila kod uporabe pokazivaa. Kd vezanih listi e se uvelike oslanjati na ova pravila. Pokaziva Pokaziva sadrava referencu na neku varijablu (pointee). On moe takoer biti postavljen na vrijednost NULL ime se prevoditelju eli rei da pokaziva trenutno ne pokazuje ni na jednu varijablu. Dereferenca Operatorom derefernciranja na pokaziva pristupamo varijabli na koju pokaziva pokazuje. Pokaziva moe biti dereferenciran samo onda kada je odreen na odreenu varijablu. Pokaziva koji ne pokazuje na nijednu varijablu nazivamo loim (''bad pointer'') pokazivaem i ne moe se dereferencirati. Pridruivanje vrijednosti Operator pridruivanja izmeu dva pokazivaa poput a=b ustvari usmjerava oba pokazivaa na istu adresu. On ne kopira sadraj memorijske lokacije varijable na koju pokazuje. Nakon pridruivanja vrijednosti oba pokazivaa e pokazivati na istu memorijsku lokaciju, taj je sluaj poznat pod nazivom ''dijeljenje lokacije''. Malloc() malloc() je funkcija kojom alociramo jedan blok memorije u ''heapu'' i vraa pokaziva na taj novostvoreni blok. Prototip za funkciju malloc() i ostale heap

funkcije se nalaze u datoteci zaglavlja stdlib.h. Argument za funkciju malloc() je cjelobrojnog tipa ( integer ) veliine bloka u byteovima. Ne kao u sluaju lokalnih (''stack'') varijabli, heap memorija se automatski ne dealocira kada funkcija koja ju je kreirala zavri. Malloc() vraa vrijednost NULL ako ne moe ispuniti zahtjev. Free() free() je funkcija suprotna funkciji malloc(). Pozivajui funkciju free() memorijski blok u heapu, mi sustavu kaemo da smo zavrili s koritenjem privremeno stvorene varijable. Argument za funkciju free() je pokaziva na memorijski blok u heapu pokaziva koji smo ranije takoer koristili pri pozivu funkcije malloc().

1.4 PRAZNA LISTA NULL


Najee praznu listu oznaavamo pokazivaem na poetak liste ( head pointer ) koji ima vrijednost NULL. Sluaj prazne liste se esto pojavljuje i zato je uvijek preporuljivo pri pisanju programa s vezanim listama uvrstiti i dodatnu petlju i kd u sluaju da je lista prazna.

1.5 TIPOVI PODATAKA VEZANIH LISTI


Prije bilo kakvog pisanja kda, potrebno nam je dva tipa podataka: vor (node) je tip koji e napraviti tijelo vezane liste. On je alociran u heapu. Svaki vor sadri jedan element unesen od strane korisnika i pokaziva na sljedei element.

struct node { int data; struct node* next; };

Pokaziva vora (node pointer) Ovo e biti tip pokazivaa glave liste i dijela bloka u listi koji pokazuje na sljedei vor.

1.6 123() FUNKCIJA


Evo primjera jednostavne funkcije koja koristi operacije s pokazivaima da bi napravila listu koja se sastoji od elemenata 1, 2 i 3. Ovom funkcijom elimo pokazati kako se poziva funkcija malloc() i kako se pridruuje vrijednost pokazivaima da bi se napravila pokazivaka struktura u heapu:
struct node* 123() { struct node* head = NULL; struct node* second = NULL; struct node* third = NULL; head = malloc(sizeof(struct node)); second = malloc(sizeof(struct node)); third = malloc(sizeof(struct node));

head->data=1; head->next=second; second->data=2; second->next=third; third->data=3; third->next=NULL; return (head); }

STACK
head

HEAP Ova je lista napravljena povezivanjem vorova njihovim next pokazivaima. vorovi su alocirani u heapu.

123 ( )

Svaki vor sadri jedan podatkovni element

Svaki vor sadri i jedan next pokaziva

Sljedei vor na koji pokazuje je NULL (nema ga)

1.7 FUNKCIJA DULJINA_LISTE () Funkcija duljina_liste rauna broj elemenata liste. Ona je jednostavna funkcija i dobra za demonstraciju nekoliko koncepata koji e se koristiti kasnije, za neke sloenije funkcije koritene kod vezanih listi.
int duljina_liste(struct node* head) { struct node* current = head; int brojac = 0; while (current != NULL) { brojac++; current = current -> next; } return (brojac); }

Postoje dva uobiajena naina koja su demonstrirana u funkciji duljina_liste(): 1. Prolaz kroz listu prenosei pokaziva glave liste Pokaziva glave je kopiran iz argumenta u lokalnu varijablu koja predstavlja privremeni pokaziva glave. Kopiranjem ovog pokazivaa se ne kopira cijela lista. Pokaziva se kopira samo zbog toga da poziva funkcije i sama funkcija imaju pokaziva na istu strukturu. Ovo je klasini primjer dijeljenja pokazivaa. Program koji poziva funkciju i sama funkcija imaju kopije pokazivaa glave, ali zato dijele memorijsku lokaciju na koju oba pokazivaa pokazuju. 2. Iteracija kroz listu s lokalnim pokazivaem Kd za iteraciju preko svih elemenata je jako koritena petlja u upotrebi programa s vezanim listama.
struct node* current = head; while (current != NULL) { current=current->next; }

Karakteristike ovog kda su sljedee: Lokalini pokaziva, current u naem sluaju, na poetku pokazuje na istu lokaciju kao i pokaziva glave ( current = head ). Kada funkcija zavri s izvoenjem, current se automatski dealocira jer je on samo lokalan, ali vorovi ostaju i dalje u heapu. While petlja zavrava s izvoenjem kada zadani uvjet prestane zadovoljavati ( current ! = NULL). Na dnu while petlje, current = current -> next; prebacuje adresu na koju pokazuje lokalni pokaziva na idui vor. Kada vie ne postoji idui vor, lokalni pokaziva postavlja vrijednost u NULL. 1.7.1 Memorijski prikaz Najbolji nain da protumaimo vezane liste je da koristimo memorijski prikaz kako bi vidjeli na koji nain operacije pokazivaima djeluju u memoriji. Memorijski prikaz prije izvoenja funkcije duljina_liste()

STACK

HEAP

brojac

-15231

Memorijski prikaz za vrijeme izvoenja funkcije duljina_liste

You might also like