Professional Documents
Culture Documents
Jednostruko Vezane Liste U C Jeziku
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.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().
Pokaziva vora (node pointer) Ovo e biti tip pokazivaa glave liste i dijela bloka u listi koji pokazuje na sljedei vor.
STACK
head
HEAP Ova je lista napravljena povezivanjem vorova njihovim next pokazivaima. vorovi su alocirani u heapu.
123 ( )
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