ASP - 6. Poučavanje

You might also like

Download as ppt, pdf, or txt
Download as ppt, pdf, or txt
You are on page 1of 20

ALGORTIMI I STRUKTURE PODATAKA

(6. POUČAVANJE)
Struktura podataka red

izv. prof. dr. sc. Alen Jakupović, prof. v. š.

Preddiplomski stručni studij Telematika


GRUPNI RAD
• grupni rad (45 minuta):
– podijeliti se u grupe od 5 članova
– odgovoriti na postavljena pitanja
– rasprava o pitanjima – 15 minuta

Preddiplomski stručni studij Telematika


PITANJA
• Koje osnovne karakteristike ima struktura podataka
red?
• Koje osnovne operacije treba posjedovati red?
• Kako se red implementira u programskom jeziku C?

Preddiplomski stručni studij Telematika


Koje osnovne karakteristike ima
struktura podataka red?
• red je specijalna vrsta liste kod koje se sva ubacivanja rade na jednom kraju liste
(njezinom začelju - ulaz), a brisanje elemenata se obavlja na drugom kraju liste
(njezinom čelu - izlaz) - nema ubacivanja i brisanja elemenata iz središnjeg dijela
liste
– još se naziva FIFO lista (First-In-First-Out)
– red je struktura podataka kod koje se prvi pohranjeni podatak prvi uzima u obradu

čelo reda a1
(izlaz)
a2
...

začelje reda an-1


(ulaz) an

Preddiplomski stručni studij Telematika


Koje osnovne karakteristike ima
struktura podataka red?
• Primjeri za red:
– ljudi koji čekaju na šalteru banke
– štampač odjednom može štampati samo jednu datoteku. Da bi korisnik mogao poslati
datoteku na štampanje čak i onda kad je štampač zauzet, formira se red datoteka:

datoteka_1
datoteka_2
...
datoteka_i

Štampač štampa datoteku na čelu reda, a korisnik šalje novu datoteku na začelje reda

Preddiplomski stručni studij Telematika


Koje osnovne operacije treba
posjedovati red?
• operacije u redu:
– dodavanje elementa na začelje reda
– brisanje elementa s čela reda

Preddiplomski stručni studij Telematika


Kako se red implementira u
programskom jeziku C?
• implementacija reda pomoću polja - identično kao lista:

vrijednost elementi reda prazni dio


varijable
... n-1 ... a1 a2 a3 ... an ...
... ulaz ... R[0] R[1] R[2] ... R[n-1] ... ... R[MAX-1] ...
ime varijable
varijabla u kojoj se čuva poje od MAX elemenata
pozicija zadnjeg elementa reda
– ubacivanje
(u primjeru elementa reda
je to vrijednost je jednostavno jer se element ubacuje kao zadnji element
n-1)
(na začelje) - ulaz u red
– brisanje elementa nije jednostavno jer se briše prvi element (čelo) ali se onda svi
ostali elementi trebaju pomaknuti za jedno mjesto prema naprijed

Preddiplomski stručni studij Telematika


Kako se red implementira u
programskom jeziku C?
• implementacija reda pomoću polja - identično kao lista:

elementi reda prazni dio


vrijednost
varijable
... 0 n-1 ... a1 a2 a3 ... an ...
... izlaz ulaz ... R[0] R[1] R[2] ... R[n-1] ... ... R[MAX-1] ...
ime varijable
varijabla u kojoj se čuva poje od MAX elemenata
pozicija zadnjeg elementa reda
varijabla u kojoj se (u primjeru je to vrijednost n-1)
čuva pozicija prvog – moguće rješenje za brisanje je uvođenje još jednog kursora za početak reda (izlaz).
elementa reda (u Prilikom brisanja nema pomicanja elemenata već se mijenja vrijednost kursora koji
pokazuje na početak reda
primjeru je to
vrijednost 0) – javlja se novi problem - ubacivanjem/brisanjem red putuje prema donjem kraju polja.
Moguće je dosezanje donjeg kraja polja iako u početnom dijelu polja ima mjesta.

Preddiplomski stručni studij Telematika


Kako se red implementira u
programskom jeziku C?
• implementacija reda
pomoću cirkularnog polja
jedno prazno mjesto prazni dio
– nakon zadnjeg indeksa
slijedi početni indeks
1 ] R[M
aj R[j+ AX-
1 ]

R[
R[j]

]0
. ..
. ..
. ..

... i j+1 ...


R[i ]
... izlaz ulaz ... + 1] R[i
ai+ ai
1 elementi reda

Preddiplomski stručni studij Telematika


Kako se red implementira u
programskom jeziku C?
• implementacija reda pomoću cirkularnog polja
– red zauzima niz uzastopnih ćelija polja
– postoji kursor za čelo(prvi element - izlaz) i začelje(zadnji element - ulaz) polja
– ubacivanjem/brisanjem elemenata red putuje poljem u smjeru kazaljke na satu
– cirkularnost se postiže primjenom operatora modulo (%). U klasičnom polju naredni
indeks bi bio jednak prethodnom + 1. No kada se dođe do maksimalnog indeksa
(MAX-1) ovaj postupak bi nam vratio indeks izvan veličine polja, a treba vratiti 0. To
se podudara s operatorom %. Dakle naredni indeks je (prethodni indeks + 1) %
MAX.
– kako bi se razlikovao prazni i puni red (onaj koji nema elemenata u polju i onaj koji
zauzima cijelo polje) uvodi se jedan prazan element između prvog i zadnjeg
elementa reda (izlaza i ulaza):
• zbog toga red ne može imati više od MAX -1 elementa polja
• red je prazan ako je: izlaz == ulaz
• red je pun ako je: (ulaz+1)%MAX == izlaz

Preddiplomski stručni studij Telematika


Kako se red implementira u
programskom jeziku C?
• implementacija reda pomoću cirkularnog polja - izgled praznog reda

] R[
R[6 7]

R[
]
R[5

]0
R[1
R[4

]
]

... 2 2 ...
]
... izlaz ulaz ... R[3
] R[2

Preddiplomski stručni studij Telematika


Kako se red implementira u
programskom jeziku C?
• implementacija reda pomoću cirkularnog polja - izgled reda s jednim
elementom

] R[
R[6 7]

R[
]
R[5

]0
R[1
R[4

]
]

... 2 3 ...
]
... izlaz ulaz ... R[3
] R[2
6

Preddiplomski stručni studij Telematika


Kako se red implementira u
programskom jeziku C?
• implementacija reda pomoću cirkularnog polja - izgled punog reda
7 1
] R[
R[6 7]

16

R[
]

8
R[5

]0
R[1
R[4

10
13

]
]

... 2 1 ...
]
... izlaz ulaz ... R[3
] R[2
6

Preddiplomski stručni studij Telematika


Kako se red implementira u
programskom jeziku C?
• implementacija reda pomoću cirkularnog polja:
– definicija strukture koja će čuvati indeks ulaza i izlaza reda, te same
elemente reda:

#define MAX broj definicija duljine polja


typedef struct{
polje u kojem će se čuvati
tip_elementa elementi[MAX]; elementi reda
int izlaz;
tip podataka za
int ulaz;
elemente reda
} Red;
elementi strukture u kojima će se čuvati
indeks izlaza odnosno ulaza u red
ime tipa podataka koji je
definiran strukturom, a
kojeg ćemo koristiti
prilikom deklaracije
varijable za red

Preddiplomski stručni studij Telematika


Kako se red implementira u
programskom jeziku C?
• implementacija reda pomoću cirkularnog polja:
– definicija operacije ubacivanja elementa u red:

void ubaci (tip_elementa x, Red *pokRed) OPIS ALGORITMA:


{ 1. ubaciti novi element reda na indeks koji
if ((pokRed->ulaz+1)%MAX == pokRed-> izlaz) je jednak ostatku pri dijeljenju indeksa
printf("Red je pun"); zadnjeg elementa (ulaz u red) uvećanog za
jedan, s brojem elemenata polja (MAX)
else {
pokRed->ulaz = (pokRed->ulaz+1) % MAX;
pokRed->elementi[pokRed->ulaz] = x;
}
}

Preddiplomski stručni studij Telematika


Kako se red implementira u
programskom jeziku C?
• implementacija reda pomoću cirkularnog polja:
– definicija operacije brisanja elementa iz reda:

void obrisi (Red *pokRed) { OPIS ALGORITMA:


if (pokRed->izlaz == pokRed->ulaz) 1. sačuvati novi indeks izlaza reda koji je jednak
printf("Red je prazan"); ostatku pri dijeljenju starog indeksa uvećanog
za jedan s brojem elemenata polja (MAX)
else pokRed->izlaz = (pokRed->izlaz+1)%MAX;
}

Preddiplomski stručni studij Telematika


Kako se red implementira u
programskom jeziku C?
• implementacija reda pomoću pokazivača:

polazna ćelija elementi reda


adrese

... 100 ... 200 204 ... 290 294 610 614 804 808 ...
... 200 ... 290 ... a1 610 ... a2 804 ... an NULL ... 804 ...
... izlaz ... ... ... ulaz ...
vrijednost
varijable ime varijable pokazivači na sljedeću
ćeliju
– početak vezane liste je čelo reda. Potreban je i pokazivač za kraj reda.
Polazna ćelija olakšava prikaz praznog reda (za prazan red pokazivači ulaz i
izlaz pokazuju na istu ćeliju)

Preddiplomski stručni studij Telematika


Kako se red implementira u
programskom jeziku C?
• implementacija reda pomoću pokazivača:
– definicija strukture koja će čuvati element reda i pokazivač na narednu
ćeliju, te pokazivače ulaz i izlaz:
tip podataka za
elemente reda

typedef struct celija { naziv strukture


tip_elementa element; dio strukture u kojoj će se čuvati element reda
struct celija *sljedeca; dio strukture u kojoj će se čuvati adresa naredne ćelije koja je iste
} Tip_celije; strukture kao i prethodna

typedef struct { ime tipa podataka koji je definiran strukturom, a kojeg


ćemo koristiti prilikom deklaracije pokazivača ulaz i izlaz
Tip_celije *ulaz;
Tip_celije *izlaz; dio strukture u kojoj će se čuvati pokazivači na čelo i kraj
} Red; reda.

Preddiplomski stručni studij Telematika


Kako se red implementira u
programskom jeziku C?
• implementacija reda pomoću pokazivača:
– definicija operacije ubacivanja elementa u red:

void ubaci (tip_elementa x, Red *pokRed) { OPIS ALGORITMA:


pokRed->ulaz->sljedeca = (Tip_celije*) malloc (sizeof(Tip_celije)); 1. stvoriti novu ćeliju u koju treba pohraniti
pokRed->ulaz = pokRed->ulaz->sljedeca; novi element
pokRed->ulaz->element = x; 2. u pokazivač ulaz staviti adresu nove
pokRed->ulaz->sljedeca = NULL; ćelije
} 3. u novu ćeliju spremiti element, a kao
vrijednost sljedeca staviti NULL

Preddiplomski stručni studij Telematika


Kako se red implementira u
programskom jeziku C?
• implementacija reda pomoću pokazivača:
– definicija operacije brisanja elementa iz reda:

void obrisi (Red *pokRed) { OPIS ALGORITMA:


Tip_celije *privremeno; 1. zapamtiti pokazivač na ćeliju koja je
if (pokRed->ulaz == pokRed->izlaz) trenutno izlaz
2. postavi kao novi izlaz ćeliju iza
printf("Red je prazan");
zapamćene ćelije
else { 3. izbriši zapamćenu ćeliju
privremena = pokRed->izlaz;
pokRed->izlaz = pokRed->izlaz->sljedeca;
free(privremena);
}
}

Preddiplomski stručni studij Telematika

You might also like