Povezane liste

28
Povezane liste Za pohranjivanje skupa podataka istoga tipa do sada smo koristili nizove. Neka imamo slijedede deklaracije: struct ucenik { char ime[20]; // ime do 20 karaktera int godine; // godine starosti float visina; // u metrima } ucenik razred[30]; Prethodnim naredbama smo deklarisali strukturu ucenik i niz ciji su elementi tipa strukture ucenik. Prilikom deklaracije niza moramo navesti maksimalan broj elemenata niza, što predstavlja veliko ograničenje ove vrste podataka. Naime, ukoliko navedemo veliki broj elemenata, rizikujemo da de program nepotrebno zauzeti veliki memorijski prostor. Ako navedemo mali broj elemenata, rizikujemo da program nede zadovoljavati potrebe korisnika. Stoga, potreba dimenzionisanja niza gotovo uvijek predstavlja problem, jer je nemogude predvidjeti koliko elemenata niz uistinu ima kada se program pokrene. Kao rješenje ovog problema može se koristiti povezana lista. Međutim, svako rješenje ima i odgovarajude mane. Jedna od mana povezane liste jeste i to što imaju loše performance kada je u pitanju slučajan pristup. Šta je povezana lista? Povezana lista je složena struktura podataka koju čine čvorovi. Čvor, kao osnovni element povezane liste baziran je na tipu podataka struktura, koja sadrži bar jedan pointer. Povezanu listu čini lanac čvorova koje međusobno povezuju pointeri. Postoje jednostruko i dvostruko povezane liste. Jednostruko povezana lista sadrži pokazivač na slijededi čvor, a dvostruko povezane sadrži dva pokazivača: jedan pokazuje na slijededi a jedan na prethodni čvor. Najprije demo upoznati jednostruko povezanu listu. Na slici je primjer jednostruko povezane liste: START

Transcript of Povezane liste

Page 1: Povezane liste

Povezane liste

Za pohranjivanje skupa podataka istoga tipa do sada smo koristili nizove. Neka imamo slijedede deklaracije:

struct ucenik

{ char ime[20]; // ime do 20 karaktera

int godine; // godine starosti

float visina; // u metrima

}

ucenik razred[30];

Prethodnim naredbama smo deklarisali strukturu ucenik i niz ciji su elementi tipa strukture ucenik.

Prilikom deklaracije niza moramo navesti maksimalan broj elemenata niza, što predstavlja veliko ograničenje ove vrste podataka. Naime, ukoliko navedemo veliki broj elemenata, rizikujemo da de program nepotrebno zauzeti veliki memorijski prostor. Ako navedemo mali broj elemenata, rizikujemo da program nede zadovoljavati potrebe korisnika. Stoga, potreba dimenzionisanja niza gotovo uvijek predstavlja problem, jer je nemogude predvidjeti koliko elemenata niz uistinu ima kada se program pokrene.

Kao rješenje ovog problema može se koristiti povezana lista. Međutim, svako rješenje ima i odgovarajude mane. Jedna od mana povezane liste jeste i to što imaju loše performance kada je u pitanju slučajan pristup.

Šta je povezana lista?

Povezana lista je složena struktura podataka koju čine čvorovi. Čvor, kao osnovni element povezane

liste baziran je na tipu podataka struktura, koja sadrži bar jedan pointer. Povezanu listu čini lanac

čvorova koje međusobno povezuju pointeri.

Postoje jednostruko i dvostruko povezane liste. Jednostruko povezana lista sadrži pokazivač na slijededi

čvor, a dvostruko povezane sadrži dva pokazivača: jedan pokazuje na slijededi a jedan na prethodni čvor.

Najprije demo upoznati jednostruko povezanu listu.

Na slici je primjer jednostruko povezane liste:

START

Page 2: Povezane liste

Ime: Fred

Godine: 34

Visina: 1.7

Ime: Ime

Godine: 27

Visina: 1.2

Ime: Joe

Godine: 48

Visina: 1.4

Ime: Zoe

Godine: 30

Visina: 1.3

NULL

Povezana lista na slici sadrži 4 čvora, pri čemu svaki, osim poslednjeg, sadrži pokazivač na slijededi čvor.

Poslednji čvor umjesto pokazivača na slijededi čvor, sadrži vezu sa specijalnom vrijednošdu NULL, što

označava kraj liste.

Postoji još jedan specijalni pokazivač, Start, koji pokazuje na prvi čvor u lancu.

Definisanje strukture podataka za povezanu listu

Osnova povezane liste je struktura koja čuva podatke za svaki čvor liste (npr. ime, adresa, godine) kao i

pokazivač na slijededi čvor u listi. Slijedi primjer tipične structure koja se koristi u povezanoj listi

struct cvor

{ char ime[20]; // ime do 20 karaktera

int godine; // godine starosti

float visina; // u metrima

cvor *slijedeci; // Pointer na slijedeći čvor

};

Važan dio ove structure je zadnja linija definicije structure. Ovdje definišemo članicu strukture

slijedeci koja je pointer tipa cvor, tj. strukture koju ovim definišemo. Ovo je jedini slučaj kada je

dozvoljeno da upudujemo na tip podataka kojeg još nisamo definisali (u ovom slučaju cvor).

cvor *start_ptr;

Prethodnom naredbom deklarišemo pointer start_ptr koji de sadržati pokazivač na prvi čvor liste. Na

početku, kada je lista prazna, tj. nema čvorova, u ovaj pointer postavljamo NULL vrijednost.

Dodavanje čvora u listu

Prvi zadatak u vezi sa povezanom listom je kako dodati čvor u listu. Novi čvor možemo dodati na

početak, kraj ili unutar liste. Upoznademo najprije dodavanje čvora na kraj i početak liste.

Dodavanje čvora na kraj liste

Najjednostavniji slučaj je dodavanje čvora na kraj liste. Inače, čvor možemo dodati bilo gdje unutar liste

(ukjučujudi i početak i kraj).

Page 3: Povezane liste

Dodavanje čvora realizujemo u slijededim koracima:

1. Deklarišemo promjenljivu tipa structure na kojoj se baziraju čvorovi liste i rezervišemo

memorijski prostor za novi čvor

2. Unosimo podatke u elemente structure čvora

3. Ako lista nije prazna, onda postojedi zadnji čvor u listi mijenjamo tako što u pokazivač tog čvora

upišemo adresu novog čvora. Time novi čvor uistinu postaje dio liste.

Ako je lista prazna, adresu novog čvora dodjelimo pointer start-ptr,

Najprije deklarišemo promjenljivu tipa struktura cvor i rezervišemo memorijski prostor za čvor,

slijededom naredbom:

cvor *novi = new cvor;

novi

nedefinisano

Zatim, korisnik unosi podatke koje upisujemo u članice promjenljive novi:

cout << "Upisite ime: ";

cin >> novi->ime;

cout << "Upisite godine: ";

cin >> novi->godine;

cout << "Upisite visinu osobe: ";

cin >> novi->visina;

novi->slijedeci = NULL;

U zadnjoj liniji postavljamo NULL vrijednost u članicu strukuture slijedeci, čime iniciramo da de ovaj

čvor, kada ga ubacimo u listu, biti zadnji čvor.

Sada postavljamo vrijednost za pointer start_ptr. Ako je lista prazna, onda samo adresu tmp čvora

podešavamo da pokazuje na novi čvor:

if (start_ptr == NULL)

start_ptr = novi;

Ako u listi ved postoje čvorovi, koristimo drugi pointer, pom, i pomjeramo ga na kraj liste:

{

pom = start_ptr;

// postavljamo pom na kraj liste

while (pom->slijedeci != NULL)

{

pom = pom->slijedeci; // pomjeranje na slijedeći čvor

}

Page 4: Povezane liste

pom->slijedeci = novi; // pokazivač zadnjeg čvora u listi

//postavljamo da pokazuje na novi čvor

}

Petlja de se završiti kada pom sadrži adresu zadnjeg čvora u lancu. U zadnjem čvoru liste slijedeci sadrži

null vrijednost. Kada smo pronašli zadnji čvor, postavljamo slijedeci zadnjeg čvora da pokazuje na čvor

kojeg dodajemo u listu:

pom->slijedeci = novi;

start_ptr

pom

novi

novi

čvor

dodan

NULL

Kompletan kod za dodavanje čvora u listu slijedi:

void dodaj_cvor_na_kraj ()

{ cvor *novi, *pom; // pomoćni pokazivači

// Rezervisanje prostora za novi čvor i unos podataka

novi = new cvor;

cout << "Upisite ime: ";

cin >> novi->ime;

cout << "Upisite godine: ";

cin >> novi->godine;

cout << "Upisite visinu osobe: ";

cin >> novi->visina;

novi->slijedeci = NULL;

// Ubacivanje čvora u listu

if (start_ptr == NULL)

start_ptr = novi;

else

{

pom = start_ptr;

// postavljamo pom na pocetak liste

while (pom->slijedeci != NULL)

{

pom = pom->slijedeci; // pomjeranje na slijedeći čvor

}

pom->slijedeci = novi; // pokazivač zadnjeg čvora u listi postavljamo da pokazuje na novi čvor

}

return;

Page 5: Povezane liste

}

Dodavanje čvora na početak liste

Ovaj postupak je znatno jednostavniji. Nakon kreiranja novog čvora i unosa podataka, potrebno je u novi čvor upisati adresu trenutno prvog čvora u listi (novi->slijedeci = start_ptr), a zatim postaviti u start_ptr adrsu novog čvora (start_ptr = novi). Ako je lista prazna, samo postavimo da start_ptr pokazuje na novi čvor.

void dodaj_cvor_na_pocetak ()

{ cvor *novi, *pom; // pomocni pokazivaci

// Rezervisanje prostora za novi cvor i unos podataka

novi = new cvor;

cout << "Upisite ime: ";

cin >> novi->ime;

cout << "Upisite godine: ";

cin >> novi->godine;

cout << "Upisite visinu osobe: ";

cin >> novi->visina;

novi->slijedeci = NULL;

// Ubacivanje cvora u listu

if (start_ptr == NULL)

start_ptr = novi;

else

{

novi->slijedeci = start_ptr;

start_ptr = novi;

}

return;

}

Pristup podacima u listi

Slijededi problem kojeg treba riješiti je kako pristupati elementima liste. Pokazademo kako možemo

čitati podatke iz liste i ispisivati ih na ekranu.

Uradit demo slijedede:

Pomodni pointer postavljamo da pokazuje na prvi čvor, tj. dodjeljujemo mu vrijednosrt startnog

pointera (start_ptr).

Ako pomodni pointer sadrži null vriiednost, lista je prazna pa prikazujemo poruku: "Kraj liste" i

zaustavljamo prikaz.

Ako pomodni pointer ne sadrži null vrijednost, prikazujemo detalje iz čvora na koji pokazuje

pomodni pointer.

Mijenjamo vrijednost pomocnog pointera, dodjeljujudi mu vrijednost iz pointera “slijedeci”

čvora čiji smo sadržaj upravo ispisali.

Vradamo se na drugi korak.

Page 6: Povezane liste

Slijedi kod za ispisvanje podataka iz liste:

void ispisi_listu()

{

cvor *pom = start_ptr;

do

{

if (pom == NULL)

cout << endl<<"Kraj liste" << endl;

else

{ // Ispis detalja iz čvora na koji pokazuje pom pointer

cout << "Ime: " << pom->ime << endl;

cout << "Godina: " << pom->godine << endl;

cout << "Visina: " << pom->visina << endl;

cout << endl;

// Pomjeranje na slijedeći čvor

pom = pom->slijedeci;

}

}

while (pom != NULL);

return;

}

Brisanje čvora

Čvor može da se nalazi na početku, kraju i u sredini liste. Ovisno o njegovoj poziciji, postupak brisanja je

drugačiji.

Kada obrišemo čvor, potrebno je osloboditi memorijski prostor. Ako to ne uradimo, rizikujemo “out of

memory”! Oslobađanje memorijskog prostora realizujemo naredbom delete:

delete pom;

Međutim, ne možemo samo obrisati čvor iz liste, jer bismo u tom slučaju prekinuli lanac. Stoga, najprije

moramo izmjeniti vrijednost odgovarajudeg pokazivača pa onda obrisati čvor.

Evo kako bismo obrisali prvi čvor iz liste.

pom = start_ptr; // Sacuvamo startni pointer u pomocnom

start_ptr

etc.

Page 7: Povezane liste

pom

Nakon što smo sačuvali vrijednost startnog pointera u pom pointer, mijenjamo vrijednost start_ptr tako

da pokazuje na slijededi čvor:

start_ptr = start_ptr->slijedeci; // drugi cvor u lancu

start_ptr

etc.

pom

delete pom; // obrisi pocetni start cvor

start_ptr

etc.

pom

Slijedi funkcija za brisanje startnog čvora:

void brisi_prvi_cvor()

{ cvor *pom;

pom = start_ptr;

Page 8: Povezane liste

start_ptr = start_ptr->slijedeci;

delete pom;

return;

}

Brisanje čvora na kraju liste je teže, jer se pomodni pointer mora najprije pomjeriti na kraj liste (kao kod

unosa novog čvora). Potrebna su dva pomodna pointera, pom1 i pom2. Prvi de pokazivati na zadnji čvor

u listi, a drugi na njegovo prethodnika. Potrebne su nam obje vrijednosti kako bismo zadnji obrisali, a

predzadnji modifikovali tako da on u polju slijededi sadrži null vrijednost, pokazujudi na taj način da je

zadnji čvor liste.

Prikažimo proces brisanja zadnjeg čvora crtežima. Posmatrajmo listu. Najprije demo postaviti oba

pomodna pokazivača, pom1 i pom2, da pokazuju na početak liste.

start_ptr

NULL

pom1 pom2

Zatim , pom1 pomjeramo na slijededi čvor u listi:

start_ptr

NULL

pom2

pom1

Pošto pom1 još uvijek ne pokazuje na zadnji čvor u listi, pomjeramo i pom2, tako da pokazuje isti čvor

kao i pom1

Page 9: Povezane liste

start_ptr

NULL

pom2 pom1

Opet pomjeramo pom1 na slijededi:

start_ptr

NULL

pom2

pom1

Ovo ponavljamo sve dok pom1 ne pokazuje zadnji čvor u listi, a pom2 na njegovog prethodnika:

start_ptr

NULL

pom2

pom1

Page 10: Povezane liste

Zatim brišemo čvor na kojeg pokazuje pom1

start_ptr

pom2

pom1

Zatim u pokazivač slijedeci čvora na kojeg pokazuje pom2 upisujemo NULL vrijednost:

start_ptr

NULL

pom2

Ako lista sadrži samo jedan čvor, onda samo treba postaviti start_ptr na null vrijednost i obrisati čvor.

Slijedi kod za brisanje čvora na kraju liste:

void brisi_zadnji_cvor()

{

cvor *pom1, *pom2;

if (start_ptr == NULL)

cout << "Lista je prazna!" << endl;

else

{

pom1 = start_ptr;

if (pom1->slijedeci == NULL)

{

delete pom1;

start_ptr = NULL;

}

else

{

while (pom1->slijedeci != NULL)

{

Page 11: Povezane liste

pom2 = pom1;

pom1 = pom1->slijedeci;

}

delete pom1;

pom2->slijedeci = NULL;

}

}

return;

}

Navigacija kroz listu

Za rad sa povezanom listom, potrebno je uspostaviti mehanizam kretanja po listi, unaprijed ili unazad.

Ovo je naročito potrebno aki želimo brisati ili upisivati čvor unutar liste.

Deklarišimo pointer tekuci. Najprije mu dodjeljujemo adresu prvog čvora u listi, koju čuvamo u pointeru

start_ptr :

cvor *tekuci;

tekuci = start_ptr;

Nakon ovih naredbi oba pointera pokazuju na isti čvor:

start tekuci

itd

Pomjeranje pointera tekuci unaprijed realizujemo naredbom u kojoj pointeru tekuci dodjeljujemo

adresu cvora koji slijedi, a koja je upisana u članicu slijedeci čvora na kojeg tekuci pokazuje:

tekuci = tekuci->slijedeci;

Prije prethodne naredbe dodjele, potrebno je provjeriti da tekući u polju slijededi ne sadrži null

vrijednost. Ako je to tako, onda tekuci pokazuje na zadnji čvor u list ii nema potrebe za njegovim

pomjeranjem.

if (tekuci->slijedeci == NULL)

cout << "Pozicionirani ste na kraj liste." << endl;

else

tekuci = tekuci->slijedeci;

Page 12: Povezane liste

Pomjeranje pointera unazad je nešto teža rutina. Jedini način da nađemo prethodni čvor jeste da

krenemo od početnog i pomjeramo pokazivač do čvora kojeg tražimo. To de se desiti kada pointer

slijedeci pokazuje na tekudi čvor.

Pomod!!!

Pokušajmo sa slikama:

Najprije demo provjeriti da li pointer tekuci (na slici current) pokazuje na prvi čvor. Ako je tako, onda on

nema prethodnika. Ako nije, onda provjeravamo sve čvorove dok ne naiđemo na prethodnika tekudeg.

if (tekuci == start_ptr)

cout << "Pocetak liste!" << endl;

else

{ cvor *prethodni; // pointer koji pokazuje na prethodnika

prethodni = start_ptr;

while (prethodni->slijedeci != tekuci)

{

prethodni = prethodni->slijedeci;

}

tekuci = prethodni;

}

Kod koji je naveden iza else određuje slijedede:

Najprije deklarišemo pointer koji de pokazivati na prethodni čvor – pointer prethodni.

U prethodni postavljamo adresu prvog čvora.

Sve dok ne pokazuje na čvor koji prethodi tekudem, mijenjamo adresu u pointeru prethodni tako

da pokazuje na slijededi čvor.

Kada pronađemo prethodnika u odnosu na tekudi, pointer tekuci postavljamo da pokazuje na isti

čvor kao i pointer prethodni, kojeg smo „doveli“ do njegovog prethodnika

Sada kada možemo da se “kredemo” unaprijed i unazad kroz listu, možemo uraditi još ponešto sa listom.

Naprimjer, možemo mijenjati podatke u čvoru liste na koji pokazuje tekuci:

cout << "Unesite novo ime: "; cin >> tekuci->ime; cout << "Unesite novi podatak o godinama : "; cin >> tekuci->ime; cout << "Upisite novi podatak o visini : "; cin >> tekuci->visina;

prethodni slijedeci

Page 13: Povezane liste

Slijededa procedura je brisanje čvora koji se nalazi odmah iza čvora na kojeg pokazuje pokazivač tekuci.

Koristit demo pomodni pokazivač koji de pokazivati na čvor kojeg želimo obrisati – pom (na slici temp).

Nabrojat demo šta treba uraditi da bismo obrisali čvor.

Najprije, podesimo da pomodni pokazivač pokazuje na čvor iza tekudeg, tj. na čvor kojeg demo obrisati:

Zatim podešavamo da pointer u tekudem čvoru sadrži adresu čvora koji slijedi iza onog na kojeg

pokazuje pomodni:

Zadnji korak je brisanje čvora na kojeg pokazuje pomodni.

Slijedi kod za brisanje čvora iza tekudeg. Ovaj kod uključuje i provjeru da li je tekudi zadnji u listi.

if (tekuci->slijedeci == NULL) cout << "Nema vise cvorova u listi" << endl; else { cvor *pom; pom =tekuci->slijedeci; tekuci->slijedeci = pom->slijedeci; delete pom; }

Slijedi kod za dodavanje čvora iza tekudeg.

if (tekuci->slijedeci == NULL) dodaj_cvor_na_kraj(); else { cvor *novi; new novi;

tekuci pom

tekuci pom

Page 14: Povezane liste

upisi_podatke_u_cvor(novi); // Postavi da novi cvor pokazuje na isti cvor kao i tekuci novi->slijedeci = tekuci->slijedeci; // Tekuci pokazuje na novi tekuci->slijedeci = novi; }

Funkcija dodaj_cvor_na_kraj() je ranije deifinisana. Funkcija upisi_podatke_u_cvor(novi) omogudava unos

podataka u strukturu čvor.

U slijededem primjeru primjenidemo ove procedure i pokazati kako se implementiraju i neke dodatne

funkcionalnosti povezane liste.

Primjer 1:

Napisati program koji omogučava formiranje liste koja sadrži koeficijente kvadratne jednačine. Nakon

startovanja programa, prikazati glavni meni sa slijededim opcijama:

Za pohranjivanje podataka program koristi strukturu „cvor“, kako slijedi:

Opcija 5, „Sekvencijalna obrada liste“, nudi dodatni meni za pojedinačnu obradu čvorova liste.

Omogudava sekvencijalni prolazak kroz listu, gdje se za svaki čvor nude slijedede opcije:

Page 15: Povezane liste

Svaka od opcija glavnog menija i menija za sekvencijalnu obradu podataka realizuje se kao zasebna

funkcija. I sam meni komandi je relizovan kao funkcija koja se poziva u funkciji main, kao na screenshot-

u koji slijedi.

Program je realizovan kroz slijedede funkcije:

Glavni meni poziva se u funkciji main, gdje se, nakon povratka iz menija, u okviru switch naredbe poziva

odgovarajuda funkcija:

Page 16: Povezane liste

Glavni meni implementiran je na slijededi način:

Page 17: Povezane liste

Dodavanje čvora na početak liste ved je objašnjeno:

Kako bi program bio funkcionalan, samo kreiranje novog čvora realizovano je u zasebnoj, pomodnoj

funkciji „kreiraj_novi_cvor“ koja se poziva u prethodnoj, ali i u okviru drugih funkcija programa.

Page 18: Povezane liste

Ova funkcija vrada pokazivač na čvor. Kao tip povratne vrijednosti navodimo strukturu „cvor“, a ispred

imena funkcije znak *, kako bismo odredili da funkcija vrada pokazivač na čvor.

Prednost ovakvog pristupa je što istu funkciju možemo koristiti na više mjesta u programu. S druge

strane, prednost je i u tome što istu metodologiju možemo koristiti i u drugim zadacima – jedino što

treba da prilagodima je struktura čvora u funkciji kreiraj_novi_cvor (isto i u ispisi_cvor).

Vec u slijededoj funkciji opet koristimo funkciju „kreiraj_novi_cvor“

Za potrebe ispisivanja liste također koristimo pomodnu funkciju za ispisivanje sadržaja jednog čvora.

Page 19: Povezane liste

Argument ove funkcije je pokazivač sa fiktivnim imenom „tekuci“. On pokazuje na čvor čiji sadržaj želimo

ispisati .

Funkciju „ispisi_cvor“ koristimo u funkciji za ispisivanje liste od prvog do zadnjeg čvora, čiji algoritam

smo ved objasnili.

Funkciju „ispisi_cvor“ koristimo i u funkciji za ispisivanje liste od zadnjeg ka prvom čvoru. Ova funkcija

radi na slijededi način. Ako lista nije prazna i ako ne sadrži samo jedan čvor, koristimo dva pomodna

pokazivača. Pom1 na početku funkcije pomjerimo na zadnji čvor u petlji i ispišemo njegov sadržaj:

Sve dok pom1 ne bude imao istu adresu kao i start_ptr, radimo slijedede:

- pokazivač pom2 pozicioniramo na čvor koji prethodi čvoru pom1

- pokazivač pom1 pomjerimo na prethodni čvor i ispišemo njegov sadržaj

Page 20: Povezane liste

Slijedi kompletan kod ove funkcije:

Brisanje čvora na početku i kraju liste također je objašnjeno ranije. Slijedi kod ovih funkcija:

Page 21: Povezane liste

Sekvencijalna obrada liste realizuje se pomodu funkcije „sekvencijalna_obrada“. U okviru ove funkcije

prolazimo kroz listu, od prvog do zadnjeg čvora, tako što mijenjamo vrijednost pokazovača „tekuci“.

Nakon svakog pomjeranja, prikazujemo sadržaj čvora i prikazujemo pomodni meni iz kojeg korisnik bira

odgovarajudu akciju.

Koristi se i pomodni pokazivač „pom“ u kojeg spremimo kopiju vrijednosti polja „slijedeci“ iz tekudeg

čvora. Ova vrijednost (adresa slijededeg čvora) nam je potrebna u slučaju da korisnik izabere brisanje

tekudeg čvora. Ako ne bismo imali kopiju adrese slijededeg čvora, nakon brisanja tekudeg čvora lista bi

bila prekinuta i ne bismo se mogli referencirati na slijededi čvor (koji nakon izvršene operacije postaje

tekudi).

Page 22: Povezane liste

Za svaki čvor iz liste prikazuje se pomodni meni sa opcijama rasploživim nad odabranim čvorom:

Ista funkcija sadrži switch naredbu u okviru koje pozivamo odgovarajudu funkciju za sekvencijalnu

obradu:

Page 23: Povezane liste

Funkcija za izmjenu tekudeg čvora jednostavno mijenja upisane podatke:

Dodavanje čvora prije tekudeg realizuje se tako što se najprije provjeri dali je tekudi prvi čvor liste. Ako

jeste, pozivamo funkciju za dodavanje čvora na početak liste. Ako tekudi nije prvi čvor, onda:

- kreiramo novi čvor pozivom funkcije „kreiraj_novi_cvor“

- pomodni pokazivač „prethodni“ postavimo da pokazuje na čvor prije tekudeg, a zatim

o podesimo da u prethodnom čvoru polje slijededi pokazuje na novi čvor

o podesimo da u novom čvoru polje slijededi pokazuje na tekudi

Page 24: Povezane liste

Dodavanje čvora prije tekudeg realizujemo na slijededi način.

A) Ako je lista prazna, pozivamo funkciju za dodavanje čvora na pocetak liste

B) Ako lista nije prazna:

a. Kreiramo novi čvor pozivamo funkciju kreiraj_novi_cvor(),

b. podešavamo da pokazivač u čvoru koji prethodi tekudem pokazuje na novi čvor, a

pokazivač u novom čvoru pokazuje na tekudi

novi

prethodni novi

tekuci

Page 25: Povezane liste

Brisanje čvora poslije tekudeg realizuje se u slijededoj funkciji:

Čvor prije tekudeg brišemo pomodu funkcije:

Page 26: Povezane liste

Konačno, snimanje podataka iz čvorova povezane liste realizuje se u funkciji kako slijedi:

Npr. pozivom ove funkcije kreirana je datoteka

Podaci iz jednog čvora upisuju se u jedan red sa razmacima između pojedinih vrijednosti. Osim za prvi

čvor, prije upisa podataka iz čvora, u datoteku se upisuje znak za novi red:

if (pom != start_ptr) Izlaz << endl;

Čitanje podataka iz datoteka u listu realizuje funkcija:

Page 27: Povezane liste

Sve dok nije kraj datoteke (!Ulaz.eof()), kreiramo novi čvor i u njega upisujemo podatke pročitane iz

datoteke:

Zadaci za vježbu

1. Napisati program koji omogudava unos podataka o proizvoljnom broju učenika. Za svakog

učenika treba upisati slijedede podatke:

a. Redni broj, cio broj

b. Prezime i ime, string

c. Broj bodova, cio broj

d. Ocjena, cio broj (1-5)

Nakon unosa podataka o jednom učeniku, provjeriti da li je potreban nastavak unosa, tj.

Postaviti pitanje: „Nastavak? (D/N)“.

Ispisati učitane podatke, tako što podatke o jednom učeniku ispisujemo u jednoj liniji. Koristiti

povezanu listu.

2. Modifikovati zadatak 1 dodavanjem menija iz kojeg korisnik može izarbrati slijedede opcije:

a. Unos novog čvora, sa podacima redni broj i prezime i ime

Page 28: Povezane liste

i. Na početak liste

ii. Unutar liste, sa ažuriranjem postojedih rednih brojeva

1. Prije zadanog rednog broja

2. Poslije zadanog rednog broja

iii. Na kraj liste

b. Unos broja bodova:

i. za sve ucenike u listi

ii. Za odabranog učenika, na osnovu rednog broja

c. Brisanje učenika sa zadanim rednim brojem

d. Unos kriterija za ocjenjivanje u formi

i. Ocjena 1: do ___ bodova

ii. Ocjena 2: od ____ do ____ bodova

iii. Ocjena 3: od ____ do ____ bodova

iv. Ocjena 4: od ____ do ____ bodova

v. Ocjena 5: od ____ do ____ bodova

e. Ispisivanje ocjena učenika

i. Svi učenici

ii. Odabrani učenik, zadavanjem rednog broja

f. Ispisivanje rang liste po broju bodova

g. Upisivanje liste u datoteku

h. Učitavanje liste iz datoteke

3. Napisati program koji omogučava unos podataka u povezanu listu. Svaki čvor sadrži prezime i

me učenika i broj osvojenih bodova. Prilikom unosa učenika, automatski se vrši sortiranje

podataka u opadajču listu pr broju osvojenih bodova. Nakon unosa ispisati listu sa kolonama:

prezime ii me, broj bodova.

4. Napisati program koji nudi iste opcije kao i primjer 1, samo što se u čvorovima liste čuvaju

podaci o vrijednostim tri otpora R1, R2 i R3. Prilikom ispisa podataka iz liste izračunava se i

ispisuje ukupan otpor ako su otpornici spojeni serijski i paralelno.