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 ReportTranscript 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
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