Algoritmi i strukture podataka Jednostruko i dvostruko povezane liste 31.10.2015. Općenita linearna jednostruko povezana lista  podatak je moguće u listu umetnuti:   na početak liste (isto.

Download Report

Transcript Algoritmi i strukture podataka Jednostruko i dvostruko povezane liste 31.10.2015. Općenita linearna jednostruko povezana lista  podatak je moguće u listu umetnuti:   na početak liste (isto.

Slide 1

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22


Slide 2

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22


Slide 3

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22


Slide 4

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22


Slide 5

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22


Slide 6

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22


Slide 7

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22


Slide 8

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22


Slide 9

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22


Slide 10

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22


Slide 11

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22


Slide 12

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22


Slide 13

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22


Slide 14

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22


Slide 15

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22


Slide 16

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22


Slide 17

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22


Slide 18

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22


Slide 19

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22


Slide 20

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22


Slide 21

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22


Slide 22

Algoritmi i strukture podataka
Jednostruko i dvostruko povezane liste

31.10.2015.

Općenita linearna jednostruko povezana lista


podatak je moguće u listu umetnuti:



na početak liste (isto kao na stog)
iza nekog elementa na listi

glava

Algoritmi i strukture podataka

15

45

31.10.2015.

63

2 / 22

Primjer


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

 Lista
Algoritmi i strukture podataka

31.10.2015.

3 / 22

Dvostruki pokazivači i adrese


glavap sadrži adresu pokazivača na prvi član liste, tj.
&(atom*) ili &(&(atom))



*glavap sadrži pokazivač na prvi član liste, tj (atom*) ili
(&atom)



**glavap je prvi član liste, tj. atom
**glavap=*glava=atom
*glavap=glava=&atom

glavap

15

glava

63

glavap=&glava=&(&atom)

Algoritmi i strukture podataka

31.10.2015.

4 / 22

Traženje, dodavanje i brisanje elemenata


pretraživanje liste – od glave dok se ne pronađe traženi element



element možemo dodati:


na početak liste (tad mijenjamo glavu)



negdje iza postojećeg elementa liste
-



na posljednje mjesto
ispred elementa koji je veći od onog koji umećemo

element koji brišemo može biti:



na početku liste (tad pomičemo glavu na sljedeći element)
negdje iza postojećeg elementa liste
-

-

treba pronaći element koji prethodi onom koji brišemo i povezati ga s elementom koji
se nalazi iza onog kojeg brišemo
obavezno obrisati memoriju koju je zauzimao brisani element

Algoritmi i strukture podataka

31.10.2015.

5 / 22

Pretraživanje liste

Zašto se ne koristi
dvostruki pokazivač?

// trazenje elementa liste
// vraca pokazivac na trazeni element ili NULL ako ga ne nadje
atom *trazi (atom *glava, int element) {
atom *p;
for (p = glava; p != NULL; p = p->sljed) {
if (p ->element == element) return p;
}
return NULL;
}

element

64

p
glava

Algoritmi i strukture podataka

15

45
31.10.2015.

64

95
6 / 22

Dodavanje na početak liste
int dodaj (atom **glavap, int element) {
atom *novi;
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
if (*glavap == NULL || (*glavap)->element >= element) {
// Dodavanje na pocetak liste
novi->sljed = *glavap;
*glavap = novi;
}....

*glavap

Algoritmi i strukture podataka

15

45
31.10.2015.

64

element

15

95
7 / 22

Dodavanje unutar liste
int dodaj (atom **glavap, int element) {
atom *novi, *p;
element
if ((novi = (atom *) malloc(sizeof(atom))) == NULL)
return 0;
novi->element = element;
// ako element dodajemo unutar liste
for (p = *glavap; p->sljed &&(p->sljed)->element < element; p = p->sljed);
novi->sljed = p->sljed;
p->sljed = novi;
...

71

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
8 / 22

Brisanje elementa s početka liste
int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
}

45

p
*glavap

Algoritmi i strukture podataka

45

64
31.10.2015.

71

95
9 / 22

Brisanje elementa iz sredine liste

Zašto smijemo mijenjati
vrijednost glavap?

int brisi (atom **glavap, int elem) {
atom *p;
for (; *glavap && (*glavap)->elem != elem; glavap = &((*glavap)->sljed));
if (*glavap) {
p = *glavap;
*glavap = (*glavap)->sljed;
elem
free (p);
return 1;
} else return 0;
Što pohranjujemo u
}

71

glavap?

p
*glavap
glavap
Algoritmi i strukture podataka

45

64

*glavap

*glavap
31.10.2015.

71

95
10 / 22

Liste s više ključeva - I


Pročitati matične brojeve (cijeli broj) i prezimena studenata (14+1
znakova). Oblikovati listu po rastućem matičnom broju i listu po
abecedi. Podaci su upisani samo jednom! Za zadani matični broj
pronaći pripadno prezime.

glavaPrez

glavaMBR

Algoritmi i strukture podataka

33433

53533

21373

Perić

Ferić

Berić

31.10.2015.

11 / 22

Liste s više ključeva - II


za razliku od prethodnog zadatka ovdje će se kod oblikovanja liste koristiti
adrese pokazivača (adresa adrese atoma) za modificiranje pokazivača na
slijedeći atom:





alternativno rješenje s varijablom pom (pom je isto što i glavap)






(*glavap)->smbr je pokazivač smbr u atomu na koji pokazuje *glavap
&((*glavap)->smbr) je adresa tog pokazivača
pom sadrži adresu pokazivača na član liste (atom) s kojim se uspoređuje novi element
*pom je pokazivač na prethodni atom
(*pom)->smbr je pokazivač na trenutni atom

kad se ustanovi da treba ubaciti novi, prekida se pretraga po listi i izmijeni se
pokazivač upisan u prethodnom atomu (ili glavi) tako da on sada pokazuje na
novi atom
 VisestrukaLista

Algoritmi i strukture podataka

31.10.2015.

12 / 22

Dvostruko povezana lista


Radi bržeg traženja u oba smjera kretanja po listi, ona može biti dvostruko
povezana. Svaki atom osim elementa s podacima, sadrži pokazivač na sljedeći
atom i pokazivač na prethodni atom.




Lista ima glavu i rep.

glava

rep

glavap

repp

Primjer: RedListom2


funkcije za dodavanje i skidanje rukuju pokazivačima na glavu (glavap) i rep (repp)

Algoritmi i strukture podataka

31.10.2015.

13 / 22

Objektno orijentirana realizacija jednostruke linearne liste
struct podatak {
int kljuc;
int element;
};

Interni podaci o realizaciji liste
Algoritmi i strukture podataka

class Lista {
private:
struct atom {
podatak stavka;
atom *sljed;
};
atom *glava;
atom *rep;
}
31.10.2015.

14 / 22

Članske funkcije klase Lista
public:
Lista ();
void DodajNaPocetak (podatak stavka);
void DodajNaKraj (podatak stavka);
bool DodajSortirano (podatak stavka, bool uzlazno);
bool NadjiPoKljucu (int kljuc, podatak & stavka);
bool BrisiSPocetka (podatak& stavka);
bool BrisiZadanog (int kljuc, podatak& stavka);
void BrisiSve ();
void IspisiListu ();
~Lista ();
};

 ListaOO
Algoritmi i strukture podataka

31.10.2015.

15 / 22

Zadaci za vježbu


U memoriji oblikovati jednostruko povezanu listu. Pojedini element
sadrži matični broj (8 znamenki), ime i prezime (24+1 znak) i
prolazne ocjene iz do 10 predmeta (cijeli brojevi). Listu oblikovati
sortirano po matičnom broju studenta. Napisati funkciju koja će
ispisivati matične brojeve, ime i prezime i prosjek ocjena studenata:
Maticni broj
Ime i prezime
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA
xxxxxxxx AAAAAAAAAAAAAAAAAAAAAAAA

Prosjecna ocjena
x.xx
x.xx


Prototip funkcije je:
void ispisi (atom *glava);

Algoritmi i strukture podataka

31.10.2015.

16 / 22

Zadaci za vježbu


U memoriji oblikovati linearnu listu. U pojedini atom liste upisati:







matični broj studenta (4 znamenke)
ime i prezime (30+1 znakova)
ocjenu (cijeli broj)
pokazivač na sljedeći atom

Napisati funkciju koja će iz liste izbrisati sve zapise koji sadrže
ocjenu 1. Prototip funkcije je:
void brisi (atom **glava);

Algoritmi i strukture podataka

31.10.2015.

17 / 22

Zadaci za vježbu


Strukturu red realizirati kao memorijski rezidentnu listu. Jedan
element sadrži šifru (cijeli broj) i naziv (15+1 znakova). Treba
napisati funkciju koja dodaje i funkciju koja briše element iz reda.
Ako je operacija uspjela, funkcija vraća vrijednost 1, a ako nije,
vraća 0.


Napomena: novi element dodaje se na kraj liste i pamti se pokazivač na
zadnji element, a elementi se skidaju iz reda od glave liste.

Algoritmi i strukture podataka

31.10.2015.

18 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje memorijski rezidentne linearne
jednostruko povezane liste u koju su upisani šifra artikla (cijeli broj) i
naziv artikla (15+1 znakova). Lista je poredana po šifri artikala.
Napisati funkciju za pronalaženje člana liste sa zadanom šifrom
artikla.

Ulazni argumenti su glava liste i šifra artikla, a izlazni argument je
naziv artikla.
Funkcija vraća rezultat 0 ako šifra nije nađena, a 1 ako jest.

Algoritmi i strukture podataka

31.10.2015.

19 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanje uzlazno poredane liste. Listu
pohraniti u neformatiranu datoteku lista. Napisati funkciju za
logičko brisanje čvora sa zadanim ključem. Ulazni podatak je
zadana vrijednost ključa. Ulazno-izlazni podatak je glava liste.
Funkcija vraća vrijednost 1 ako je brisanje uspjelo, a vrijednost 0
ako čvor sa zadanim ključem nije bio pronađen. Pojedini atom
sadrži:
-



kućni telefonski broj (4 znamenke)
prezime (15+1 slovo)
ime (15+1 slovo)

Kućni telefonski broj jest ključ. Zadnji član liste ima pokazivač s vrijednošću
-1.

Algoritmi i strukture podataka

31.10.2015.

20 / 22

Zadaci za vježbu


Napisati funkciju za oblikovanjem jednostruko povezane silazno
poredane liste. Lista je pohranjena u neformatiranom obliku u
datoteci. Glava liste je zapisana na početku datoteke. Funkcija
vraća vrijednost 1 ako je dodavanje uspjelo, a vrijednost 0 ako nije.
Pojedini čvor sadrži šifru (4 znamenke) i naziv artikla (15+1 slovo).
Šifra jest ključ.



Prototip funkcije je:
int dodaj (int sifra, char* naziv, const char *ime_dat);

Algoritmi i strukture podataka

31.10.2015.

21 / 22

Zadaci za vježbu


Zadan je niz ulaznih podataka tipa int:
11, 15, 12, 5, 4, 10

Treba napisati sadržaj datoteke u kojoj su ovi ulazni podaci
pohranjeni kao jednostruko povezana lista sortirana rastućim
redosljedom. Upisati adrese i vrijednosti pojedinih zapisa.
Pretpostaviti da je glava liste upisana na početku datoteke.


Napisati program za oblikovanje i brisanje dvostruko povezane liste,
analogno onome za jednostruko povezanu listu.

Algoritmi i strukture podataka

31.10.2015.

22 / 22