of 35 /35
ASP auditorne vježbe Liste i redovi; pokazivači na pokazivače; obilazak stabla 1

ASP auditorne vježbe

  • Upload
    nikkos

  • View
    57

  • Download
    1

Embed Size (px)

DESCRIPTION

ASP auditorne vježbe. Liste i redovi ; pokaziva či na pokazivače; obilazak stabla. Creative Commons. slobodno smijete: dijeliti — umnožavati, distribuirati i javnosti priopćavati djelo remiksirati — prerađivati djelo pod sljedećim uvjetima: - PowerPoint PPT Presentation

Citation preview

Page 1: ASP auditorne  vježbe

1

ASP auditorne vježbe

Liste i redovi; pokazivači na pokazivače; obilazak stabla

Page 2: ASP auditorne  vježbe

2

Creative Commons• slobodno smijete:

– dijeliti — umnožavati, distribuirati i javnosti priopćavati djelo – remiksirati — prerađivati djelo

• pod sljedećim uvjetima:– imenovanje. Morate priznati i označiti autorstvo djela na način kako

je specificirao autor ili davatelj licence (ali ne način koji bi sugerirao da Vi ili Vaše korištenje njegova djela imate njegovu izravnu podršku).

– nekomercijalno. Ovo djelo ne smijete koristiti u komercijalne svrhe. – dijeli pod istim uvjetima. Ako ovo djelo izmijenite, preoblikujete ili

stvarate koristeći ga, preradu možete distribuirati samo pod licencom koja je ista ili slična ovoj.

U slučaju daljnjeg korištenja ili distribuiranja morate drugima jasno dati do znanja licencne uvjete ovog djela. Najbolji način da to učinite je linkom na ovu internetsku stranicu. Od svakog od gornjih uvjeta moguće je odstupiti, ako dobijete dopuštenje nositelja autorskog prava. Ništa u ovoj licenci ne narušava ili ograničava autorova moralna prava.

Tekst licencije preuzet je s http://creativecommons.org/.

Dijelovi ove prezentacije preuzeti su iz pratećih materijala predavanja FER-a Sveučilišta u Zagrebu

Page 3: ASP auditorne  vježbe

3

Zadatak 1 (ZI 2012)Za red realiziran jednostruko povezanom listom napišite funkciju dodaj za dodavanje elementa u red.Prototip funkcije je:

int dodaj(int element, atom **ulaz, atom **izlaz);

Funkcija treba vratiti 1 ukoliko je element uspješno dodan u red, a 0 inače.Tip atom definiran je sljedećim programskim odsječkom:

struct at { int element; struct at *sljed; };typedef struct at atom;

Page 4: ASP auditorne  vježbe

4

Pozivni program:

int DodajURed (int element, Red *red) {atom *novi; if (novi = malloc (sizeof (atom))) {

novi->element = element;novi->sljed = NULL;if (red->izlaz == NULL) red->izlaz = novi; //ako je bio prazan

else (red->ulaz)->sljed = novi; // inace, na krajred->ulaz = novi; // zapamti zadnjegreturn 1;

}return 0;

}

Dodavanje elementa u red realiziran listom

Red red;init_red(&red);DodajURed(52, &red);

52red->izlaz red->ulaz

novi

Page 5: ASP auditorne  vježbe

5

Realizacija reda listom

problem kod realizacije poljem jest mogućnost popunjenja u stvarnosti veličina reda nije ograničena

realnija je realizacija listom

typedef struct at atom;struct at {

int element;struct at *sljed;

};

typedef struct {atom *ulaz, *izlaz;

} Red;

sljed

element

atom atom

Page 6: ASP auditorne  vježbe

6

Usporedba s primjerom iz predavanja

A: int DodajURed (int element, Red *red); B: int dodaj(int element, atom **ulaz, atom **izlaz);

Razlike? Zašto?

Informacija je ista – u (A) smo dva pokazivača „zapakirali” u strukturu RedPored toga, strukturom možemo doći do adrese pokazivača, red->izlaz u (A) je slično kao *izlaz u (B)

Page 7: ASP auditorne  vježbe

7

Strategija rješavanja

• Ulazom u funkciju imamo integer, trebamo ga dodati u red očito prvo kreiramo zapis

• U postojeći red dodajemo novi zapis na ulaz („kraj” reda)

• Pokazivač na kraj reda moramo pomaknuti na novi kraj ako je ulaz adresa pokazivača kraja onda sa *ulaz na LHS (left-hand side, lijevo od znaka „=”) pokazivač na zapis

• Na kraju rubni uvjeti

Page 8: ASP auditorne  vježbe

8

„... očito prvo kreiramo zapis”

/* .... */atom *novi; novi = malloc (sizeof (atom));novi->element = element;novi->sljed = NULL;

/* .... */

Page 9: ASP auditorne  vježbe

9

„…U postojeći red dodajemo novi zapis na ulaz („kraj” reda)…”

+ „... Pokazivač na kraj reda moramo pomaknuti na novi

kraj...”

/* .... */ /* prvo osigurati da stari zadnji *//* pokazuje na novog zadnjeg */(*ulaz)->sljed = novi; /* zatim pomaknuti pointer reda na novog

*/*ulaz = novi;

/* .... */

Page 10: ASP auditorne  vježbe

10

„...rubni uvjeti” i ostatak

• lista je bila prazna: treba i pokazivač na izlaz postaviti

• malloc može vratiti NULL ako ne dobije traženu memoriju

• povratne vrijednosti iz funkcije

Page 11: ASP auditorne  vježbe

11

int dodaj(int element, atom **ulaz, atom **izlaz) {

atom *novi; if (novi = malloc (sizeof (atom))) {

novi->element = element;novi->sljed = NULL;if (*izlaz == NULL)

*izlaz = novi; else

(*ulaz)->sljed = novi; *ulaz = novi; return 1;

}return 0;

}

Page 12: ASP auditorne  vježbe

12

Zadatak 2 (ZI 2008.)U jednostruko povezanu listu spremaju se podaci o radnicima nekog poduzeća. Lista je zadana sljedećim strukturama.

struct zapis { char imeprezime[30+1]; int matbr; int godisnji;};

struct at { struct zapis element; struct at *sljed; };

typedef struct at atom;

Page 13: ASP auditorne  vježbe

13

Zadatak 2 nastavakJedan element liste sadrži sljedeće podatke: ime i prezime radnika (30+1 znakova), matični broj radnika (int) i broj dana godišnjeg odmora (int). Lista nije sortirana. Napisati funkciju koja će iz liste izbaciti one radnike koji imaju više od 30 dana godišnjeg odmora. Funkcija mora imati prototip:

void izbaci(atom **glava);

Page 14: ASP auditorne  vježbe

14

Strategija rješavanja• Negdje (zamislimo da je u main()-u) je lista bila

popunjena i tamo (opet recimo u main()-u) se nalazi pokazivač „atom* adresaListe”, a sadrži adresu same liste, recimo „0x100“

• Ako je prvi element liste bio izvađen i stavljen u novu listu, očito moramo u main()-u promijeniti vrijednost u pokazivaču adresaListe

• Zato funkciji moramo predati adresu tog pokazivača (recimo da je pokazivač na adresi „0xA”), tako da u funkciji promijenimo sadržaj te lokacije

Page 15: ASP auditorne  vježbe

15

Strategija rješavanja (2)

• Kretati ćemo se po listi i izbacivati neke elemente• Da bismo izbacili element, treba nam adresa

elementa (pokazivač na struct)• Da bismo povezali prethodnika na sljedbenika,

dovoljan nam je pokazivač (radimo standardnu operaciju tipa „kaskajuci = front; front = front -> slijedeci;”)

• Samo za glavu liste moramo imati pokazivač na pokazivač – imamo varijablu glava iz argumenta!

Page 16: ASP auditorne  vježbe

16

„ Da bismo izbacili element, treba nam adresa elementa „

void izbaci(atom **glava) {atom *stari, *prethodni;stari = *glava;

/* ... */

free(stari);

/* ... */

Page 17: ASP auditorne  vježbe

17

„... Kretati ćemo se po listi ...”

void izbaci(atom **glava) {atom *stari, *prethodni;stari = *glava;prethodni = NULL;

while(stari) {/* ... */free(stari);/* ... */

prethodni = stari;stari = stari->sljed;

}

Page 18: ASP auditorne  vježbe

18

Očito ili izbacujemo element (koji ispunjava uvjet) ili se krećemo po listi:

void izbaci(atom **glava) {atom *stari, *prethodni;stari = *glava;prethodni = NULL;

while(stari) {if (stari->element.godisnji > 30) {

/* ... */free(stari);/* ... */

} else {prethodni = stari;stari = stari->sljed;

}}

Page 19: ASP auditorne  vježbe

19

I popunimo još što fali (rubni uvjet za praznu l.):void izbaci(atom **glava){ atom *stari, *prethodni;

stari = *glava; prethodni = NULL;

while(stari) { if (stari->element.godisnji > 30) { if (stari == *glava){ *glava = stari->sljed; free(stari); stari = *glava; } else { prethodni->sljed = stari->sljed; free(stari); stari = prethodni->sljed; }

} else { prethodni = stari; stari = stari->sljed; } }}

Page 20: ASP auditorne  vježbe

20

Zadatak 3 (dekanski 2011.)U jednostruko povezanu nesortiranu listu spremljeni su podaci o uspjehu studenata na nekom predmetu. Lista je zadana sljedećim strukturama:

struct zapis { char imeprezime[80+1]; char jmbag[10]; float ocjena;};struct at { struct zapis element; struct at *sljed; };

typedef struct at atom;

Page 21: ASP auditorne  vježbe

21

Zadatak 3 nastavakJedan element liste sadrži sljedeće podatke: ime i prezime studenta (80+1 znakova), JMBAG (10 znakova) i završna ocjena iz predmeta (float). Napišite funkciju koja će iz zadane liste sve čvorove koji sadrže studente koji su položili predmet prebaciti (bez stvaranja novih čvorova) u novu jednostruko povezanu listu. Funkcija treba vratiti pokazivač na glavu nove liste i prosjek ocjena studenata koji su položili predmet.Funkcija mora imati prototip:

atom *razdvojiStudente(atom **glava, float

*prosjek);

Page 22: ASP auditorne  vježbe

22

Zadatak 3 nastavakNapomena: U izvornoj listi na koju pokazuje glava ostaju čvorovi koji sadrže studente čija ocjena nije dovoljna za prolazak predmeta.Primjer: Varijabla glava prije poziva funkcije pokazuje na listu čvorova koji sadrže sljedeće ocjene:

5, 1, 4, 3, 4, 3, 2, 4, 5, 1.

Prosjek ocjena je 3,75 (vrijednost varijable prosjek) pa nakon poziva funkcije razdvojiStudente ona vraća pokazivač na novu listu koja sadrži čvorove sa sljedećim ocjenama:

5, 4, 3, 4, 3, 2, 4, 5.

Varijabla glava pokazuje na listu čvorova koji sadrže preostale zapise.

Page 23: ASP auditorne  vježbe

23

Strategija rješavanja

• Slično kao i u prethodnom zadatku• Radimo s novom listom: moramo čuvati adresu

prvog elementa (za povratnu vrijednost) i zadnjeg elementa (za dodavanje u listu)

• Ništa ne free()-amo, samo prebacujemo zapise (strukture) iz jedne liste u drugu – dakle samo mijenjamo vrijednosti pokazivača u strukturama!

Page 24: ASP auditorne  vježbe

24

atom *razdvojiStudente (atom **glava, float *prosjek) {

float suma = 0;int brojac = 0;atom *novi, *p, *preth, *zap = NULL;

novi = NULL;

for (p = *glava; p; p = p->sljed) {if (p->element.ocjena >= 2) {

suma += p->element.ocjena;++brojac;

}}

*prosjek = 0;if (brojac == 0) return novi;*prosjek = suma/brojac;

Page 25: ASP auditorne  vježbe

25

for (p = *glava; p; p = p->sljed) { if (p->element.ocjena >= 2) {

if (novi == NULL) novi = p;else zap->sljed = p;zap = p; if (p == *glava) {

*glava = (*glava)->sljed;}else {

preth->sljed = p->sljed;p = preth;

}}preth = p;

}if (zap) zap->sljed = NULL;return novi;

}

Page 26: ASP auditorne  vježbe

26

Zadatak 4 (ZI 2008)a) Napišite funkciju čiji je prototip

int jeligomila(int stablo[], int n);

koja će vratiti 1 ako je potpuno binarno stablo s n elemenata (implementirano poljem) gomila, a 0 inače.

b) Napišite funkciju čiji je prototip

int jeligomila(cvor *korijen);

koja će vratiti 1 ako je potpuno binarno stablo (čiji je korijen zadan) gomila, a 0 ako nije.

Page 27: ASP auditorne  vježbe

27

Strategija riješavanja

• Moramo provjeriti da stablo ima svojstvo gomile, znači:1. Korijen je veći od lijevog i od desnog djeteta2. Lijevo djete je veće od svog lijevog i od svog desnog

djeteta3. Desno dijete je veće od svog lijevog i od svog

desnog djeteta4. Lijevo djete lijevog djeteta je veće...

• Rekurzija? Dijelimo i vladamo

Page 28: ASP auditorne  vježbe

28

a:

int jeligomila(int stablo[], int n){int i;for (i = n; i >= 2; i--)

if (stablo[i] > stablo[i/2])return 0;

return 1; }

Page 29: ASP auditorne  vježbe

29

b:int jeligomila(cvor *korijen){

if (korijen == NULL) return 1;if ((korijen->lijevo != NULL)

&& (korijen->lijevo->element > korijen->element))

return 0;if ((korijen->desno != NULL)

&& (korijen->desno->element > korijen->element))

return 0;return

jeligomila(korijen->lijevo) && jeligomila(korijen->desno);

}

Page 30: ASP auditorne  vježbe

30

Zadatak 5 (ZI 2012)

Za tip podatka Stog koji je realiziran jednostruko povezanom listom definirane su funkcije za inicijalizaciju stoga, dodavanje elementa na stog te skidanje elementa sa stoga. Zadana su dva stoga stog1 i stog2, a elementi stogova su podaci tipa Osoba koji sadrže informaciju o šifri osobe (cijeli broj) i visini (cijeli broj). Stog stog1 sadrži podatke samo za muškarce, a stog2 samo za žene i na oba stoga su podaci sortirani po visini tako da je najviša osoba na vrhu stoga.

Page 31: ASP auditorne  vježbe

31

Zadatak 5 nastavakPrototipovi navedenih funkcija su:

void init_stog(Stog *stog); int dodaj(Osoba element, Stog *stog);int skini(Osoba *element, Stog *stog);

Funkcije dodaj i skini vraćaju 1 ako je operacija dodavanja ili skidanja uspjela, a 0 inače.

a)(1 bod) Napišite definicije odgovarajućih struktura (tipovi podataka Osoba, Stog i atom) za stog realiziran jednostruko povezanom listom.b)(7 bodova) Napišite rekurzivnu funkciju spoji koja će sa stoga stog2 skinuti sve podatke i staviti ih na stog stog1, ali tako da ostane očuvan poredak po visini. Poredak osoba s istom visinom nije bitan.

Page 32: ASP auditorne  vježbe

32

Zadatak 5 nastavak

vrh-> 345, 202 vrh-> 348, 203 vrh->

348, 203

161, 200 234, 200 345, 202654, 197 111, 189 234, 200122, 182 981, 169 161, 200234, 170 654, 197

111, 189122, 182234, 170981, 169

Page 33: ASP auditorne  vježbe

33

Strategija rješavanja

• Zamislimo da treba samo poskidati elemente sa stoga i vratiti ih istim redosljedom Ako radim rekurzivno, mogu u prvom pozivu skinuti

prvi element, čuvati ga lokalno i rekurzivno riješiti manji stog i nakon toga vratiti element na vrh

• U svakom koraku treba skinuti veći element sa stoga Možemo skinuti oba, zatim usporediti i vratiti manji

nazad na stog s kojeg je skinut Samo moramo paziti da ne radimo s jednim ili oba

prazna stoga (kad su oba prazna je lako – to je kraj rekurzije)

Page 34: ASP auditorne  vježbe

34

typedef struct {int sifra;int visina;

} Osoba;

struct at { Osoba element; struct at *sljed; };typedef struct at atom;typedef struct{

atom *vrh;} Stog;

Page 35: ASP auditorne  vježbe

35

void spoji (Stog *s1, Stog *s2){

Osoba os1, os2, pom;int imas1, imas2; imas1=skini(&os1, s1); imas2=skini(&os2, s2);if (!imas1 && !imas2) return; else if (imas1 && imas2) {if (os1.visina <os2.visina) { dodaj (os1,s1);pom=os2;}else { dodaj (os2,s2);pom=os1;}}else if (imas1) pom=os1;else pom=os2;

spoji (s1,s2);dodaj (pom,s1);

}