You are on page 1of 51

Veleuilite u Rijeci

C++
Jasminka Tomljanovi, vii predava

Veleuilite u Rijeci

Sadraj
Zapisi (strukture)

11/12/16
Jasminka
Tomljanovi, vii predava

Veleuilite u Rijeci

Zapis
Struktura; slog; record
Sloeni tip podatka koji objedinjuje
razliite tipove podataka
Svaka komponenta zapisa ima svoje
ime preko koje joj se pristupa
Ime komponente:
ime_zapisa.ime_komponente

11/12/16
Jasminka
Tomljanovi, vii predava

Veleuilite u Rijeci

Deklaracija zapisa
struct identifikator {
deklaracija komponente_1;
deklaracija komponente_2;

deklaracija komponente_N;
} identifikator;

11/12/16
Jasminka
Tomljanovi, vii predava

Veleuilite u Rijeci

Primjer
struct student {
long int mat_br;
char prez_ime[35];
char adresa[40];
double pros_ocj;
}stud;

11/12/16
Jasminka
Tomljanovi, vii predava

Veleuilite u Rijeci

Komponente zapisa
stud.mat_br;
stud.prez_ime;
stud.adresa;
stud.pros_ocj;

11/12/16
Jasminka
Tomljanovi, vii predava

Veleuilite u Rijeci

Primjer
Napiite program u kojem je definiran
zapis ije su komponente: mat_br,
prez_ime, adresa i pros_ocj koja se
rauna nakon uitanih ocjena. Ispiite
komponente zapisa.

11/12/16
Jasminka
Tomljanovi, vii predava

Veleuilite u Rijeci

#include "stdafx.h"
#include <iostream>
using namespace std;
void main ()
{
int Ocjena=1, B=0, S=0;
struct student {
int mat_br;
char prez_ime[35];
char adresa[40];
double pros_ocj;
}
stud;
11/12/16

Jasminka Tomljanovi, vii predava

Veleuilite u Rijeci

cout << "Maticni broj studenta: ";


cin >> stud.mat_br;
cout << "Prezime i ime: ";
cin.ignore();
cin.getline(stud.prez_ime,sizeof(stud.prez
_ime));
cout << "Adresa: ";
cin.getline(stud.adresa,sizeof(stud.adres
a));
while (Ocjena>0) {
B++;
cout << B << . Ocjena: ";
cin >>
Ocjena;
11/12/16
9
Jasminka
Tomljanovi,
vii predava

Veleuilite u Rijeci

stud.pros_ocj=(float)S/(B-1);
cout << "Student: " << stud.mat_br << " " <<
stud.prez_ime;
cout<< endl;
cout<<" Adresa: "<<stud.adresa<<endl;
cout<<" Prosjek: " << stud.pros_ocj << endl;
system("pause");
}

11/12/16
Jasminka
Tomljanovi, vii predava

10

Maticni broj ustudenta:


1234
Veleuilite
Rijeci
Prezime i ime: Matic Mate
Adresa: A. Starcevica 3, 51000 Rijeka
1. ocjena: 3
2. ocjena: 4
3. ocjena: 5
4. ocjena: 2
5. ocjena: 3
6. ocjena: 4
7. ocjena: 4
8. ocjena: 2
9. ocjena: 5
10. ocjena: 3
11. ocjena: 0
Student: 1234 Matic Mate
Adresa: A. Starcevica 3, 51000 Rijeka
Prosjek: 3.5
Press any key to continue . . .
Jasminka Tomljanovi, vii predava
Press
any key to continue . . .
11/12/16

11

Veleuilite u Rijeci

Neimenovani zapis
je onaj zapis kojem se odmah
pridruuje varijabla i koristi se samo
tamo gdje je deklariran i nije mu
potrebno dodijeliti ime
Npr.: struct {
long int mat_br;
char prez_ime[35];
char adresa[40];
double pros_ocj;
11/12/16
Jasminka
Tomljanovi, vii predava

12

Veleuilite u Rijeci

struct student{
long int mat_br;
char prez_ime[35];
char adresa[40];
double pros_ocj;
};
int main(){
student stud;

11/12/16
Jasminka
Tomljanovi, vii predava

13

Veleuilite u Rijeci

Sadraj
Vezane liste

11/12/16
Jasminka
Tomljanovi, vii predava

14

Veleuilite u Rijeci

Vezana lista
Vezana lista je oblik dinamikog
uvanja podataka iji broj elemenata
nije unaprijed poznat. Predstavlja skup
elemenata povezanih pokazivaima u:
jednom smjeru => jednostavna
vezana lista
u dva smjera => dvostruko vezana
lista
Temelji se na uporabi struktura (zapisa,
slogova) i pokazivaa tj. osnovni
Jasminka Tomljanovi, vii predava
element liste je struktura koja sadri
11/12/16

15

Veleuilite u Rijeci

Jednostavna vezana lista


moe se deklarirati na slijedei nain:
struct element_liste Komponenta strukture istog tipa
kao i struktura. Dozvoljeno je jer
{
se radi o pokazivau!
char podatak[10];
struct element_liste *slijedeci;
};
struct element_liste *pocetak_liste;

na poetak liste pokazuje pokaziva


pocetak_liste
zadnji element liste u komponenti za vezu
(slijedeci) sadri vrijednost NULL. Ako je
Jasminka Tomljanovi, vii predava
11/12/16

16

Veleuilite u Rijeci

(glava_liste)
pocetak_liste

podatak

podatak

podatak

slijedeci

slijedeci

NULL

...

Podatkovni sadraj glave liste nije bitan jer je glava samo


pomoni element liste!

11/12/16
Jasminka
Tomljanovi, vii predava

17

Veleuilite u Rijeci

Postupak stvaranja jednostvne


vezane liste
najprije emo inicijalizirati praznu listu
slijedeom naredbom:
pocetak_liste
pocetak_liste=NULL;
NULL

pocetak_liste
11/12/16
Jasminka
Tomljanovi, vii predava

18

Veleuilite u Rijeci

za stvaranje prvog dinamikog objekta


(prvog elementa liste) moramo mu
dodijeliti memorijski prostor naredbom:
pocetak_liste
NULL

novi=new element_liste;
novi
*novi

?
?

gdje je novi pokaziva na struct

11/12/16
Jasminka
Tomljanovi, vii predava

19

Veleuilite u Rijeci

Dinamikom objektu (elementu liste)


novi mogu se dodijeliti vrijednosti:
strcpy(novi->podatak,Prvi,10);
novi->slijedeci=pocetak_liste;
//
odnosno NULL

to prikazuje slijedea slika:


pocetak_liste
NULL

novi
*novi
11/12/16
Jasminka
Tomljanovi, vii predava

Prvi
NULL
20

Veleuilite u Rijeci

da bi varijabla pocetak_liste
pokazivala na poetak tj. na prvi
element liste treba joj pridruiti
vrijednost varijable novi naredbom:
pocetak_liste=novi;
dobili smo listu od jednog elementa
pocetak_liste

novi
*novi

11/12/16
Jasminka
Tomljanovi, vii predava

Prvi
NULL

21

Veleuilite u Rijeci

ako elimo ponovo dodati novi element


u listu moramo opet operatorom new
rezervirati memorijski prostor
novi= new element_liste;
novi
*novi

?
?

pocetak_liste

Prvi
NULL

11/12/16
Jasminka
Tomljanovi, vii predava

22

Veleuilite u Rijeci

i nakon izvrenja slijedeih naredbi:


strcpy(novi->podatak,Drugi,10);
novi->slijedeci=pocetak_liste;

podatkovni dio drugog elementa liste


je definiran

11/12/16
Jasminka
Tomljanovi, vii predava

23

Veleuilite u Rijeci

sada slika izgleda ovako:


novi
*novi

Drugi

pocetak_liste

Prvi
NULL

11/12/16
Jasminka
Tomljanovi, vii predava

24

Veleuilite u Rijeci

da bi varijabla pocetak_liste
pokazivala na poetak ponavlja se
naredba pridruivanja:
pocetak_liste=novi;
novi

Drugi

*novi

Prvi

pocetak_liste

11/12/16
Jasminka
Tomljanovi, vii predava

NULL

25

Veleuilite u Rijeci

Programsko rjeenje stvaranja liste dodavanjem


elemenata na poetak liste

#include "stdafx.h"
#include <iostream>
using namespace std;
struct element_liste
{
char podatak[10];
element_liste *slijedeci;
};
11/12/16
Jasminka
Tomljanovi, vii predava

26

Veleuilite u Rijeci

void pisi(element_liste *tekuci)


{
while(tekuci!=NULL){
cout<<tekuci->podatak<<endl;
tekuci=tekuci->slijedeci;
}
cout<<endl;
}
11/12/16
Jasminka
Tomljanovi, vii predava

27

void main()
{
element_liste *pocetak_liste,*novi;
pocetak_liste=NULL;
cout<<"Upisite sadrzaj liste:"<<endl;
novi=new element_liste;
cin.getline(novi->podatak,10);
while(strcmp(novi->podatak,"")!=0)
{
novi->slijedeci=pocetak_liste;
pocetak_liste=novi;
novi=new element_liste;
cin.getline(novi->podatak,10);
}
cout<<"Sadrzaj liste je:\n";
pisi(pocetak_liste);
}

Veleuilite u Rijeci

11/12/16
Jasminka
Tomljanovi, vii predava

28

Veleuilite u Rijeci

Upisite sadrzaj liste:


Prvi
Drugi
Treci
Cetvrti
Peti

Sadrzaj liste je:


Peti
Cetvrti
Treci
Drugi
Prvi

Press any key to continue . . .


11/12/16
Jasminka
Tomljanovi, vii predava

29

Veleuilite u Rijeci

Vezana lista sastoji se od:


glave liste
prvi element u listi
pokaziva na listu sadri adresu glave
liste
pomona uloga (moe se koristiti za
privremeni smjetaj podataka)

elemenata liste (definiranih


odgovarajuom strukturom) koji
sadre
podatke
pokaziva na slijedei element liste i
11/12/16
Jasminka
Tomljanovi,
vii predava
(eventualno)
pokaziva na prethodni

30

kraj liste

NULL

podatkovni
dio

pokaziva na
slijedei element
u listi

glava

podatkovni dio liste

prazna lista sastoji se samo od glave liste


pokaziva na slijedei element u zadnjem
elementu liste ima vrijednost NULL
pogodna kontrolna struktura za itanje liste je
iteracija tipa while jer
nije poznat broj elemenata liste (nema zadanu
dimenziju, kao polje)
nula kao vrijednost logikog izraza omoguuje
31
Jasminka Tomljanovi, vii predava
izlazak iz petlje

Primjer: vezana lista studenata


Element liste (TIP podatka):
struct student{
int mat_br;
char prez_ime[35];
int god_stu;
student *slijedeci;
};
Jasminka Tomljanovi, vii predava

32

struct student{
int mat_br;
char prez_ime[35];
podatkovni dio elementa liste
int god_stu;
student *slijedeci;pokaziva na slijedei element u listi
};

Jasminka Tomljanovi, vii predava

33

struct student{
int mat_br;
char prez_ime[35]
int god_stu;
student *slijedeci;
};

Jasminka Tomljanovi, vii predava

Komponenta strukture istog tipa


kao i struktura. Dozvoljeno je jer
se radi o pokazivau!

34

Veleuilite u Rijeci

Alokacija glave liste:


student *lista = new student;

lista -> slijedeci = NULL;

11/12/16
Jasminka
Tomljanovi, vii predava

35

Alokacija glave liste:

student *lista = new student;


glava liste studenata
lista -> slijedeci = NULL; kraj liste
za statike strukture i klase koristi se operator . ,
a za dinamike (dostupne preko pokazivaa) ->
Podatkovni sadraj glave liste nije bitan jer je glava samo
pomoni element liste!
Jasminka Tomljanovi, vii predava

36

NULL

NULL

Dodavanje novog elementa na kraj


liste:

lista

zadnji

novi

Koraci dodavanja novog elementa na kraj liste:


pronai zadnji element u listi
alocirati novi element
povezati zadnji element u listi s novim
upisati NULL vrijednost pokazivaca slijedeci u novi
element liste (kraj liste)
upisati podatkovni sadraj u novi element liste

Jasminka Tomljanovi, vii predava

37

Dodavanje novog elementa na kraj liste:


student *novi,*zadnji;
zadnji = lista;
while (zadnji->slijedeci)
zadnji = zadnji->slijedeci;
novi = new student;
zadnji -> slijedeci = novi;
novi -> slijedeci = NULL;

traenje zadnjeg elementa u listi

dodavanje novog elementa u listu

cout << "Maticni broj: "; cin >> novi -> mat_br;
cout << "Prezime i ime: "; cin >> novi -> prez_ime;
cout << "Godina studija: "; cin >> novi -> god_stu;

Jasminka Tomljanovi, vii predava

upis
podatkovnog
sadraja

38

Ispis svih elemenata vezane


liste:
Ispis poinje od prvog
student *tekuci = lista -> slijedeci;
elementa iza glave!
Tipina struktura za itanje
vezane liste !
(tekuci){

while
cout << "Maticni broj: " << tekuci -> mat_br
<< endl;
cout << "Prezime i ime: " << tekuci ->
prez_ime << endl;
cout << "Godina studija: " << tekuci ->
god_stu << endl;
kretanje kroz listu
cout << "---------------------"
<< endl;
39
Jasminka Tomljanovi,
vii tekuci
predava
tekuci =
-> slijedeci;

Pretraivanje liste prema kljuu


(matini broj):
student *tekuci = lista -> slijedeci;
while (tekuci){
if (tekuci -> mat_br == mat_br){
cout << "Maticni broj: " << tekuci ->
mat_br << endl;
cout << "Prezime i ime: " << tekuci ->
prez_ime << endl;
cout << "Godina studija: " << tekuci ->
god_stu << endl;
cout << "---------------------" << endl;
break; // izlaz iz petlje za pretraivanje
};
tekuci = tekuci -> slijedeci;
Jasminka Tomljanovi, vii predava
};

40

mat_br=X

lista

prethodni

NULL

Brisanje elementa liste:

brisi

Koraci brisanja elementa liste:


pronai element u listi za brisanje (prema
zadanom kljuu) i njegov prethodnik
povezati prethodni element liste s onim
iza elementa za brisanje (= premostiti

element koji se brie)

dealocirati element liste koji se brie

Jasminka Tomljanovi, vii predava

41

student *brisi = lista -> slijedeci,


*prethodni = lista;
while (brisi) {
if (brisi -> mat_br == mat_br){
prethodni -> slijedeci = brisi ->
slijedeci;
delete brisi;
break; // izlaz iz petlje
};
prethodni = brisi;
brisi =
Jasminka Tomljanovi,
vii brisi->slijedeci;
predava

42

NULL

Sortiranje vezane liste (bubble sort;


prema matinom broju uzlazno):

3
lista,
prethodni

tekuci

slijedeci

efekat zamjene mjesta


preusmjeravanjem pokazivaa

Jasminka Tomljanovi, vii predava

43

Postupak:
prolazi se ponavljaju dok ima zamjena
(indikator=1)
unutar prolaza koristi se pokaziva tekuci
za kretanje kroz listu
pokaziva slijedeci sadri adresu slijedeeg
elementa u listi
(tekuci -> slijedeci), a prethodni adresu
prethodno elementa
usporede se matini brojevi u tekuem i
slijedeem elementu
ako ima potrebe za zamjenom mjesta:
u tri koraka preusmjere se pokazivai
44
Jasminka Tomljanovi,
vii predava = 1 (indikator zamjene)
indikator

student *prethodni,*tekuci,*slijedeci;
int indikator,brojac=0;indikator zamjene; izlaz je ako ostane 0
do{
nakon prolaza
indikator = 0;
tekuci=lista->slijedeci; tekuci se kree do predzadnjeg
prethodni=lista;
elementa liste
while (tekuci->slijedeci){
uvjet za zamjenu mjesta
slijedeci=tekuci->slijedeci;
if (tekuci->mat_br > slijedeci->mat_br){
prethodni->slijedeci=slijedeci; preusmjeravanje pokazivaa
tekuci->slijedeci=slijedeci->slijedeci;
odgovara zamjeni mjesta
slijedeci->slijedeci=tekuci;
elemenata kod polja
indikator=1;
} //if
Voditi rauna o rasporedu pokazivaa
prethodni, tekuci i slijedeci na tri
prethodni=tekuci;
uzastopna elementa liste!
tekuci=tekuci->slijedeci;
} //while
} Tomljanovi,
while (indikator==1);
45
Jasminka
vii predava

Dealokacija vezane liste:


student *tekuci,*prethodni;
prethodni=lista;
tekuci=lista->slijedeci;
while (tekuci){
delete prethodni;
prethodni=tekuci;
tekuci=tekuci->slijedeci;
}//while
delete prethodni;
lista=NULL;

pokaziva prethodni kasni


jedan element u odnosu
na tekuci
dealokacija elementa liste
ukljuuje dealokaciju glave
liste

dealokacija zadnjeg elementa liste


liste vie nema!

Jasminka Tomljanovi, vii predava

46

Dealokacija vezane liste:


funkcija za dealokaciju liste treba vratiti
NULL pokaziva
student *dealokacija_liste(student *lista){
funkcija vraa pokaziva na student,
.
(ovdje je to NULL pokaziva)
.
return NULL;
};

poziv funkcije za dealokaciju liste:

lista=dealokacija_liste(lista);

Jasminka Tomljanovi, vii predava

47

Usporedba polja i vezane liste


Alokacija memorije
polja: statika ili dinamika
<TIP> polje[<broj_elemenata>]; // statiko
polje
<TIP> *polje = new <TIP>[N]; // dinamiko
polje
kod dinamikog polja moe se u toku izvoenja
programa odrediti broj elemenata, ali se polje ne
moe proirivati

vezana lista: dinamika alokacija svakog elementa lis


zasebno
48
Jasminka Tomljanovi, vii predava
<TIP> *glava = new <TIP>; // alokacija glave

Upis podataka
polje:
element polja ve je alociran i pristupa mu se
uz pomo indeksa
int polje[5];
polje[0] = 15;
vezana lista:
potrebno je najprije dinamiki alocirati
element liste i
upisati mu podatkovni sadraj

student *novi = new student; // alokacija novog


elementa liste
novi->mat_br = 12345;
strcpy (novi->prez_ime,Peri Pero);
novi->god_stu = 2;
Jasminka Tomljanovi, vii predava
prethodni->slijedeci=novi; //povezivanje 49

Ispis podataka
polje:
broj elemenata polja je poznat (zadat
dimenzijom polja),
pa se tipino koristi iteracija tipa for:
int polje[5]={2,5,7,8,4};
for (i=0;i<5;i++)
cout <<polje[i]<< ; // ispis svih
elemenata polja
vezana lista:
broj elemenata vezane liste
unaprijed
Izlaznije
iz petlje
osigurava
zadan,
NULL vrijednost u zadnjem
vezane liste!
tipino se koristi iteracijaelementu
tipa while
:
tekuci = glava -> slijedeci;
while (tekuci){
kretanje kroz listu
50
Jasminka Tomljanovi,
vii predava
cout<<tekuci->mat_br<<endl;

Dealokacija
polje:
statiko polje dealocira se pri zavretku programa
dinamiko polje dealocira se pomou operatora

delete []

int *polje = new int[N];


delete [] polje;
vezana lista:
svaki element vezane liste mora se odvojeno
dealocirati
pomou operatora delete
tekuci=lista->slijedeci;
while (tekuci!=NULL){
iduci=tekuci->slijedeci; // iduci pamti
poziciju slijedeceg el.
delete
Jasminka Tomljanovi,
viitekuci;
predava

51

You might also like