82
Увод у програмски Увод у програмски језик језик C C Структуре Електротехнички факултет у Источном Сарајеву

uvod u programiranje predavanja 8

Embed Size (px)

DESCRIPTION

uvod u programiranje

Citation preview

Page 1: uvod u programiranje predavanja 8

Увод у програмски језик Увод у програмски језик CC

Структуре

Електротехнички факултет у Источном Сарајеву

Page 2: uvod u programiranje predavanja 8

2

СадржајСадржај

СтруктуреСтруктуре

Операције над структурамаОперације над структурама

Приступање појединим елементима структуреПриступање појединим елементима структуре

Иницијализација стрктураИницијализација стрктура

Динамичке структуре податакаДинамичке структуре података

Page 3: uvod u programiranje predavanja 8

3

СтруктуреСтруктуре

• Низови: сложени тип података чији сви елементи имају исти тип.

• Структура: сложени тип података, може да садржи елементе различитих типова.

• Структура је тип податка који дефинише програмер.

• Претпоставимо да треба да се напише програм који обрађује податке студената. Проблем: већина од тих подтака је различитог типа

Page 4: uvod u programiranje predavanja 8

4

СтруктуреСтруктуре

Структура је скуп хетерогених података логички повезаних међусобно

Погодна је за груписање атрибута неког ентитета (стварног или не)

Atributi?Atributi?

prezimevisina

ime

struct osoba {

char prezime[15];

char ime[15];

int visina;

}

Page 5: uvod u programiranje predavanja 8

5

СтруктуреСтруктуре

• Општа синтакса структуре је следећа:

struct ime_strukture{ tip_podatka ime_podatka1; tip_podatka ime_podatka2; . . .tip_podatka ime_podatkaN;};Дефиниција структуре НЕ резервише меморију

Page 6: uvod u programiranje predavanja 8

6

СтруктуреСтруктуре

Декларација структуре

Општи облик декларације:

struct ime { tip1 element1; tip2 element2; ... tipN elementN;

} lista_promjenljivih;

Кључнљ реч

Име структуре

Декларација елемената (поља)

Листа променљивих овог типа

Пример:

struct osoba { char prezime[15]; char ime[15]; int visina; } student1, student2, klub[100];

Page 7: uvod u programiranje predavanja 8

7

СтруктуреСтруктуре

Пример:

struct student

{

char prezime[20];

char ime[20];

char dat_rodj[8];

int god_studija;

float prosecna_ocena;

};

Page 8: uvod u programiranje predavanja 8

8

Дефинисање променљивихДефинисање променљивих

• Пример дефиниције променљиве типа структуре:

struct student stud_pod;

struct student stud_novi;

stud_pod и stud_novi имају елементе са истим именима.

stud_pod

?

?

dat_rodj ? ?

ime

prezime

god_studija

Prosecna_ocena ?

? ?

stud_novi

dat_rodj ? ?

ime

prezime

god_studija

Prosecna_ocena ?

Page 9: uvod u programiranje predavanja 8

9

Дефинисање променљивихДефинисање променљивих

Алтернативни облик декларације структуре са дефинисањем променљивих

struct ime { tip1 element1; tip2 element2; ... tipN elementN;

};

struct ime lista_promjenljivih;

Пример:

struct osoba { char prezime[15]; char ime[15]; int visina; }; struct osoba student1, student2, klub[100];

Page 10: uvod u programiranje predavanja 8

10

Дефинисање променљивихДефинисање променљивих

• Променљива (типа структуре) може да се дефинише заједно са структуром:

struct student{ char prezime[20]; char ime[20]; char dat_rodj[8]; int god_studija; float prosecna_ocena;} stud_pod;• Истовремено описује облик структуре и резервише

меморијски простор за променљиву типа student која се зове stud_pod.

Page 11: uvod u programiranje predavanja 8

11

Дефинисање променљивихДефинисање променљивих

• Истовремено дефинисање више променљивих:struct student

{

char prezime[20];

char ime[20];

char dat_rodj[8];

int god_studija;

float prosecna_ocena;

} stud_pod, stud_novi;

Page 12: uvod u programiranje predavanja 8

12

Операције над структурамаОперације над структурама

• Програмски језик C подржава релативно мали број операција над структурама:– Приступање појединим елементима структуре

применом оператора ”.” и ”->”

– Oдређивање адресе структуре коришћењем адресног оператора &

– Одређивање величине структуре применом оператора sizeof

– Додељивање вредности (=) свих елемената једне структуре елементима друге структуре истог типа.

Page 13: uvod u programiranje predavanja 8

13

Приступање елементима структуреПриступање елементима структуре

• Приступање појединим елементима структуре може да се изврши на два начина:

– Директно приступање имену елемената структуре. Директно приступање се врши применом оператора ”.”

– Индиректно, преко показивача. Индиректно приступање се врши применом оператора ”->”

Page 14: uvod u programiranje predavanja 8

14

Директно приступањеДиректно приступањеstruct student{ char prezime[20]; char ime[20]; char dat_rodj[8]; int god_studija; float prosecna_ocena;};

struct datum{ int dan; int mesec; int godina;};

main(){ struct student stud_novi; struct datum datum_rodjenja; ... stud_novi.prezime[0]='B'; stud_novi.god_studija=4; sud_novi.prosecna_ocena=7.8; ... datum_rodjenja.dan=14; datum_rodjenja.godina=1983; ...}

Page 15: uvod u programiranje predavanja 8

15

Иницијализација стрктураИницијализација стрктура

• Иницијализација структуре на два начина:– Директно код дефинисања структуре– Приликом дефиниције променљиве која има тип

структуре

struct datum

{

int dan;

int mesec;

int godina;

}dan_u_godini={21,10,1968};

Page 16: uvod u programiranje predavanja 8

16

Иницијализација стрктураИницијализација стрктура

struct datum{ int dan; int mesec; int godina;};

main(){ struct datum dan_u_godini={21,10,1968}; ... }

Page 17: uvod u programiranje predavanja 8

17

Директно приступањеДиректно приступање

Приступ помоћу оператора

”.” = ELEMENT STRUKTURE

Пример:

struct osoba { char prezime[15]; char ime[15]; int visina; } student, klub[100];

Pristup poljima:

student.prezime = ”Markovic”; klub[1].prezime = ”Jankovic”;student.ime = ”Marko”; klub[1].ime = ”Janko”;student.visina = 190; klub[1].visina = 202;

Page 18: uvod u programiranje predavanja 8

18

Директно приступањеДиректно приступањеПример: Рад са комплексним бројевима помоћу структуре

#include <stdio.h>

main()

{

struct kompleks { float re,im; };

kompleks x = { 3.0, 2.0 }; kompleks y = { 2.0, 3.0 };

kompleks zbir, proizvod;

zbir.re = x.re + y.re; zbir.im = x.im + y.im;

proizvod.re = x.re*y.re – x.im*y.im; proizvod.im = x.re*y.im + x.im*y.re;

printf(”Zbir je: %5.2f + j%5.2f\n”, zbir.re, zbir.im); printf(”Proizvod je: %5.2f + j%5.2f\n”, proizvod.re, proizvod.im);}

Page 19: uvod u programiranje predavanja 8

19

Додељивање вредности свих елемената...Додељивање вредности свих елемената...

struct student{ char prezime[20]; char ime[20]; char dat_rodj[11]; int god_studija; float prosecna_ocena;};main(){ struct student prvi = {”Petrovic”,”Marko”, ”02.10.1983”, 1, 8.96}; /* L1*/

struct student drugi; ... drugi = prvi; /* L3*/}

Page 20: uvod u programiranje predavanja 8

20

Додељивање вредности свих елемената...Додељивање вредности свих елемената...

struct student prvi = {”Petrovic”,”Marko”,...

drugi = prvi; /* L3*/

prvi

Petrovic

Marko dat_rodj 02.10.83 1

ime

prezime

god_studija

Prosecna_ocena 8.96

?

?

drugi

dat_rodj ? ?

ime

prezime

god_studija

Prosecna_ocena ?

prvi

Petrovic

Marko dat_rodj 02.10.83 1

ime

prezime

god_studija

Prosecna_ocena 8.96

Petrovic

Marko

drugi

dat_rodj 02.10.83 1

ime

prezime

god_studija

Prosecna_ocena 8.96

Page 21: uvod u programiranje predavanja 8

21

Структуре могу да Структуре могу да садрже...садрже...• Елементи једне структуре могу бити свих

типова података који се користе у програмском језику C, осим функција.

• Унутар структура може да се појави: - друга структура, - не и она сама, али може показивач на њу!

Page 22: uvod u programiranje predavanja 8

22

Структура као елемент структуреСтруктура као елемент структуре

Структура може бити елемент неке друге структуре

Приступ пољима

struct datum { int dan, mjesec, godina; };

struct osoba { char prezime[15]; char ime[15]; int visina; datum rodjen; } student;

Приступ пољима:

student.prezime = ”Markovic”; student.ime = ”Marko”;student.visina = 190; student.rodjen.dan = 1;student.rodjen.mjesec = 4;student.rodjen.godina = 1980;

Page 23: uvod u programiranje predavanja 8

23

Структуре које садрже Структуре које садрже структуреструктуре

struct datum{ int dan; int mesec; int godina;};struct radnik{ char prezime[20]; char ime[20]; struct datum datum_rodjenja; struct datum datum_namestenja;} novi_zaposleni;

novi_zaposleni

?

?

datum_rodjenja

ime

prezime

datum_namestenja

dan

mesec

godina

? ?

?

dan

mesec

godina

? ?

?

Page 24: uvod u programiranje predavanja 8

24

Неименоване структуреНеименоване структуре

• Посебан случај представљају неименоване структуре:struct { int dan; int mesec; int godina;} datum_rodjenja, datum_namestenja;• Обавезна истовремена дефиниција свих

променљивих типа те структуре• Дефиниција неименоване структуре без истовремене

дефиниције променљивих нема смисла, јер се таква структура не може користити.

Page 25: uvod u programiranje predavanja 8

25

СтруктуреСтруктуре и низовии низови

• Стуктуре могу да буду елементи низова. • Користећи структуру student могуће је дефинисати низ

који се зове st_prve_godine а чији ће елементи (њих 250) бити структуре:

struct student st_prve_godine[250]

• Овим се е дефинише низ st_prve_godine који има 250 елемената (st_prve_godine[0],..., st_prve_godine[249]) и сваки елемент низа је представљен структуром student.

Page 26: uvod u programiranje predavanja 8

26

СтруктуреСтруктуре и низовии низови

[0]

[1]

[2]

[248]] [249]

st_prve_godine

student

dat_rodj

ime

prezime

god_studija

Prosecna_ocena

.

.

.

Page 27: uvod u programiranje predavanja 8

27

Структуре и функцијеСтруктуре и функције

Структура може бити аргумент функције

Пример:

void funkcija ( struct tacka a )

Ако функција враћа структуру треба дефинисати тип, а затим у дефиницији/декларацији функције навести да је функција тог типа

Пример:

typedef struct {int i,j} TACKA;

TACKA funkcija ( TACKA a, TACKA b );

Page 28: uvod u programiranje predavanja 8

28

Структуре и функцијеСтруктуре и функцијеПример: Програм за рад са комплексним бројевима

#include <stdio.h>typedef struct { float re,im; } COMPLEX;COMPLEX dodela ( float a, float b ) { COMPLEX x; x.re=a; x.im=b; return(x); } COMPLEX zbir ( COMPLEX x, COMPLEX y ) { COMPLEX z; z.re=x.re+y.re; z.im=x.im+y.im; return(z); } main(){ COMPLEX x,y,z; x=dodjela(1,2); y=dodela(3,4); z=zbir(x,y); printf(”(%.2f,%.2f)+(%.2f,%.2f)=(%.2f,%.2f)\n”, x.re,x.im,y.re,y.im,z.re,z.im);}

Page 29: uvod u programiranje predavanja 8

29

Структуре - пример

Рад са тачком у дводимензионалном систему координата

x

y

A(x,y)

x

y

A(xA,yA)

B(xB,yB)

d

#include <stdio.h>#include <math.h>#define KV(x) (x)*(x)

main()

{

struct tacka { float x,y; } a,b;

float d;

printf(”A: x=”); scanf(”%f”, &a.x); printf(”A: y=”); scanf(”%f”, &a.y);

printf(”B: x=”); scanf(”%f”, &b.x); printf(”B: y=”); scanf(”%f”, &b.y);

d = sqrt( KV(a.x-b.x) + KV(a.y-b.y));

printf(”Udaljenost: %5.2f”, d);

}

Page 30: uvod u programiranje predavanja 8

30

Структуре - примерСтруктуре - пример Учитати координате врхова полигона, и израчунати његов обим.

#include <stdio.h>#include <math.h>#define KV(x) (x)*(x)main(){ struct tacka { float x,y; } pol[100]; float ob=0; int i,n; do { printf(”Broj vrhova: ”); scanf(”%d”, &n); } while ((n<3) || (n>100)); for (i=1; i<=n; i++) { printf(”%d. vrh:\n”, i); printf(” x=”); scanf(”%f”, &pol[i-1].x); printf(” y=”); scanf(”%f”, &pol[i-1].y); } for (i=1; i<n; i++) ob += sqrt( KV(pol[i].x-pol[i-1].x)+ KV(pol[i].y-pol[i-1].y)); ob += sqrt( KV(pol[0].x-pol[n-1].x)+ KV(pol[0].y-pol[n-1].y)); printf(”Obim: %5.2f”, ob);}

A0(x0,y0)

A1(x1,y1)

A2

A3

A4

Page 31: uvod u programiranje predavanja 8

31

Показивачи на структуреПоказивачи на структуре

Neka imamo strukturu struct datum {

int dan; int mjesec; int godina; };

Tada možemo da definišemo: struct datum rodjen, *pokaz ;

Pokazivač na strukturu datum(još uvijek ne pokazuje

nikakav konkretan podatak)

Ako želimo da pokaz pokazuje rodjen: *pokaz = &rodjen ;

pokaz sada pokazuje na promjenljivu rodjen (sadrži adresu promjenljive rodjen)

Page 32: uvod u programiranje predavanja 8

32

Показивачи на структуреПоказивачи на структуре

Индиректни приступ елементима структуре

Нека је дата структура

struct datum { int dan; int mjesec; int godina;

} rodjen, *pokaz = &rodjen ;

Директни приступ елементима структуре:

rodjen.dan = 1; rodjen.mjesec = 4; rodjen.godina = 1985;

Приступ елементима структуре преко показивача:

(*pokaz).dan = 1; (*pokaz).mjesec = 4; (*pokaz).godina = 1985;

или

pokaz->dan = 1;pokaz->mjesec = 4;pokaz->godina = 1985;

Page 33: uvod u programiranje predavanja 8

33

Индиректно приступањеИндиректно приступање

struct datum{ int dan; int mesec; int godina;};

main(){ struct datum datum_rodjenja, struct datum *point_struk_datum; point_struk_datum= &datum_rodjenja; point_struk_datum->dan=27; point_struk_datum->mesec=6; point_struk_datum->godina=1952; printf(”\nMesec rodjenja je %d \n”,

datum_rodjenja.mesec); }

Mesec rodjenja je 6

Page 34: uvod u programiranje predavanja 8

34

Индиректно приступањеИндиректно приступање

• Наредбе са оператором “->” је на веома једноставан начин могуће трансформисати у еквивалентне наредбе са знаком “.” и обрнуто.

• Пример, point_struk_datum->dan=27;

• се може писати и у облику:(*point_struk_datum).dan=27;

• point_struk_datum је у малим заградама јер оператор “.” има већи приоритет од оператора “*”.

• Додавање јединице показивачу који показује на неку структуру (point_struk_datum++) значи повећање адресе на коју указује за дужину целе структуре.

Page 35: uvod u programiranje predavanja 8

35

Индиректно приступањеИндиректно приступање

Пример:

#include <stdio.h>main(){ struct datum { int dan, mjesec, godina; }; struct datum r, *p = &r; p->dan = 1; p->mjesec = 4; p->godina = 1985; printf(”Datum: %02d.%02d.%d.”, r.dan, r.mjesec, r.godina);}

Datum: 01.04.1985.

Page 36: uvod u programiranje predavanja 8

36

Показивачи у структуриПоказивачи у структури

x=2 y=5

Показивач може да буде елемент структуре

struct primjer { int *p1, *p2; } clan;

Приступ показивачу у структури

*clan.p1 odnosno *clan.p2

Пример:

#include <stdio.h>main(){ int x,y; struct primjer { int *p1, *p2; }; struct primjer proba, *pok = &proba; proba.p1 = &x; *proba.p1 = 2; pok->p2 = &y; *pok->p2 = 5; printf(”x=%d y=%d”, x,y);}

Page 37: uvod u programiranje predavanja 8

37

УнијеУније

Унија је скуп података различитих типова смештених у истом меморијском простору.

Подаци у унији нису међусобно независни, јер користе исти меморијски простор.

Промена једног податка може довести и до промјене другог податка у унији.

Унија заузима у меморији онолико бајтова колико је потребно за меморисање највећег податка у унији

MEMORIJA

Podatak1(2 bajta)

Podatak2(1 bajt)

Zajednička oblastza podatak1 i za podatak2 Unija zauzima

ukupno 2 bajta

Page 38: uvod u programiranje predavanja 8

38

УнијеУније

Општи облик декларације уније

union ime { tip1 element1; tip2 element2; ... tipN elementN;

} lista_promjenljivih;

Кључна реч

Име уније

Декларација елемената (поља)

Листа променљивих овог типа

Пример:

union unija { char c; int i; } x;

Page 39: uvod u programiranje predavanja 8

39

УнијеУније

Алтернативни облик декларације уније

union ime { tip1 element1; tip2 element2; ... tipN elementN; };union ime lista_prom;

Пример: union unija { char c; int i; float f; }; union unija x;

Приступ елементима (пољима) унијеx.i = 100;

x.c = ’A’;

Page 40: uvod u programiranje predavanja 8

40

Уније Уније

Пример:

#include <stdio.h>

union unija { char c; int i; };

main()

{

union unija x;

x.i = 0x141;

printf(”x.i = %d\n”, x.i);

printf(”x.c = %c\n”, x.c);

}

MEMOРИJA

41

01x.i

x.c

x.i = 321

x.c = A

Page 41: uvod u programiranje predavanja 8

41

ДефиДефинисање корисничких типова нисање корисничких типова податакаподатака

C омогућава:

• дефинисање корисничких типова

• промену имена постојећим типовимаОпшти облик:

typedef staritip novitip;

Примери:

typedef int INTEGER; INTEGER i,j; -----------------------

typedef float NIZ[100];NIZ niz1, niz2;

-----------------------

typedef struct { int i; char c; } TIP; TIP niz[10];

Page 42: uvod u programiranje predavanja 8

42

Сложени типови податакаСложени типови података - -задацизадаци

1. Написати програм који учитава N бројева, а затим исписује све оне који су позитивни, као и њихов укупан број.

2. Написати програм који учитава N бројева, а затим исписује све оне елементе низа који се не понављају.

3. Написати програм који учитава N бројева, а затим исписати колико се пута сваки од њих понавља у том низу.

4. Написати програм који учитава N бројева, а затим исписати све парне бројеве из тог низа који су већи од аритметичке средине низа.

5. Написати програм који учитава двије квадратне матрице, а затим исписује њихов збир.

6. Написати програм који учитава матрицу, а затим исписује све елементе матрице веће од највећег елемента на главној дијагонали.

7. Учитати матрицу, па исписати све елементе матрице поређане од највећег до најмањег.

8. Учитати матрицу, па исписати све елементе матрице изнад главне дијагонале поређане од највећег до најмањег.

9. Ако би се на прво поље шаховске табле ставило једно зрно, а на свако сљедеће поље двоструко више него на претходно, израчунати колико би се зрна налазило на посљедњем (64-ом) пољу, односно колико би укупно зрна требало да буде на табли.

Page 43: uvod u programiranje predavanja 8

43

Повезане структуре податакаПовезане структуре података

• Листе

• Стабла

Page 44: uvod u programiranje predavanja 8

44

Повезане структуре и показивачи

Комбиновањем показивача на структуру и структуре са показивачем можемо да добијемо структуру са показивачем на исту структуру тј. имамо повезане структуре

struct element { tip info;

struct element *next;

} prvi, drugi;

pokazivač na istu strukturu(omogućava povezivanje struktura i pravljenje liste – dinamičkog niza)

informaciono polje u strukturi

prvi

Aprvi.next = &drugi

prvi.info prvi.next

drugi

B

drugi.info drugi.next

Page 45: uvod u programiranje predavanja 8

45

Повезане структуре и показивачи

• Већ виђено како се креирају структуре са показивачима као елементима структуре.

• Структуре података приказане овде захтевају да имају као елемент показивач на исту структуру, тј. морају да буду само-референцирајуће.

• Само-референцирајуће структуре у себи садрже као елемент показивач који показује на исту такву структуру.

• У ову групу спадају повезане листе, редови, стекови, стабла и табеле.

Page 46: uvod u programiranje predavanja 8

46

Динамичке структуре податакаДинамичке структуре података

• Структура може садржати елементе различитих типова, па и друге структуре али не саму себе.

• Тај проблем је могуће решити употребом показивача.

struct lista_jedna{ int dan; int mesec; int godina; struct lista_jedna *point_na_listu;};

Page 47: uvod u programiranje predavanja 8

47

Динамичке структуре податакаДинамичке структуре података

• Једна од веома честих примена динамичких структура је линеарна листа.

• Линеарна листа је скуп компоненти који се називају чворови (node).

• Сваки чвор (изузев последњег) садржи адресу наредног чвора.

• Због тога сваки чвор у линеарној листи има бар два елемента: један који садржи податке (data) и један који садржи адресу наредног чвора (link).

Page 48: uvod u programiranje predavanja 8

48

Повезане листеПовезане листе

• Повезане листе су најосновнији вид само-референцирајућих структура.

• Елемент повезане листе је структура која се састоји од неког елемента који је битан за програм, и показивача који показује на исту структуру.

• Преко овог показивача можемо да повежемо текући елемент са следећим

struct llnode {

<type> data;

struct llnode *next;

};

Page 49: uvod u programiranje predavanja 8

49

Повезане листеПовезане листе

• Погоднији начин дефинисања повезане листе преко typedef, тј дефинисања новог типа:

typedef struct list_node {

<type> data;

struct list_node *next; } llnode;

llnode *head = NULL;

• Један од начина да се дефинише глава листе је дефинисањем показивача на први члан

Page 50: uvod u programiranje predavanja 8

50

Динамичке структуре податакаДинамичке структуре података

• Адреса првог чвора у листи се чува на посебној локацији која се зове: head или prvi.

• Линеарна листа је листа која се састоји од чворова, а редослед чворова је одређен адресом која је записана у сваком чвору.

adresa

podatak8.96

45

65

34

76

Prvi

Page 51: uvod u programiranje predavanja 8

51

Динамичке структуре податакаДинамичке структуре података

• Претпоставимо да је први чвор на адреси 1200 да се други чвор налази на меморијској локацији 1575 итд. Тада имамо следећу ситуацију:

45

65

Prvi 1200

1200 1575

Page 52: uvod u programiranje predavanja 8

52

Динамичке структуре податакаДинамичке структуре података

• Како сваки чвор има бар две компоненте (две врсте податка) неопходно га је формирати као структуру.

• Тип податка који се налази у чвору зависи од конкретне примене.

• Други податак је увек истог типа, представља адресу па је према томе показивач.

struct lista_jedna{ int dan; struct lista_jedna *point_na_listu;};• поред тога потребно је дефинисати и променљиву struct lista_jedna *point_prvi

Page 53: uvod u programiranje predavanja 8

53

• Нека имамо следећу листу:

• То је линеарна листа од 4 чвора.

• Адреса првог чвора је записана у показивачу prvi. Сваки чвор се састоји : podatak у коме се чува жељена вредност и sled_adresa адреса наредног чвора.

podatak sled_adresa

podatak sled_adresa

podatak sled_adresa

2000

2800 17

3600

0 45

2800 1500

3600 63

prvi

2000

podatak sled_adresa

92

1500

Page 54: uvod u programiranje predavanja 8

54

вредност

prvi 2000

prvi->podatak 17

prvi->sled_adresa 2800

prvi->sled_adresa -> podatak 92

podatak sled_adresa

podatak sled_adresa

podatak sled_adresa

2000

2800 17

3600

0 45

2800 1500

3600 63

prvi

2000

podatak sled_adresa

92

1500

Page 55: uvod u programiranje predavanja 8

55

struct lista_jedna *tekuci;

tekuci = prvi;

podatak sled_adresa

podatak sled_adresa

podatak sled_adresa

2000

2800 17

3600

0 45

2800 1500

3600 63

prvi

2000

podatak sled_adresa

92

1500

tekuci

2000

вредност

tekuci 2000

tekuci->podatak 17

tekuci->sled_adresa 2800

tekuci->sled_adresa->podatak 92

Page 56: uvod u programiranje predavanja 8

56

• tekuci = tekuci -> sled_adresa;• након ове наредбе показивач tekuci указује на

следећи чвор у листи.

podatak sled_adresa

podatak sled_adresa

podatak sled_adresa

2000

2800 17

3600

0 45

2800 1500

3600 63

prvi

2000

podatak sled_adresa

92

1500

tekuci 2800

вредност

tekuci 2800

tekuci->podatak 92

tekuci->sled_adresa 1500

tekuci->sled_adresa->podatak 63

Page 57: uvod u programiranje predavanja 8

57

KKретање кроз листуретање кроз листу

p = prvi; // na pocetak listewhile(p != NULL){ // obrada cvora na koji ukazuje p // dopisati kod u skladu sa problemom p = p-> sled_adresa; //na sledeci cvor}

p = prvi;while(p != NULL){ printf("Vrednost podatka je %d: ", p->podatak); p = p -> sled_adresa;}

Page 58: uvod u programiranje predavanja 8

58

Уметање новог члана листеУметање новог члана листе

struct jedna_lista

{

int podatak;

struct jedna_lista *sled_adresa;

};

struct jedna_lista *prvi, *p, *novi_cvor,

podatak sled_adresa

podatak sled_adresa

podatak sled_adresa

17

0 45

63

prvi

podatak sled_adresa

92

Page 59: uvod u programiranje predavanja 8

59

Уметање новог члана листеУметање новог члана листе

• Прво се позиционира на место на које треба уметнути нови члан

...

p = prvi;

while(p -> podatak != 92)

p = p -> sled_adresa;

podatak sled_adresa

podatak sled_adresa

podatak sled_adresa

17

0 45

63

prvi

podatak sled_adresa

92

p

Page 60: uvod u programiranje predavanja 8

60

Уметање новог члана листеУметање новог члана листе

/* kreiranje novog cvora */

novi_cvor = malloc(sizeof(jedna_lista))

/* upisi podatak 50 u novi cvor */

novi_cvor -> podatak = 50;

podatak sled_adresa

podatak sled_adresa

podatak sled_adresa

17

0 45

63

prvi

podatak sled_adresa

92

p

podatak sled_adresa

50

novi_cvorprvi

Page 61: uvod u programiranje predavanja 8

61

Уметање новог члана листеУметање новог члана листе

novi_cvor->sled_adresa = p->sled_adresa;

podatak sled_adresa

podatak sled_adresa

podatak sled_adresa

17

0 45

63

prvi

podatak sled_adresa

92

p

podatak sled_adresa

50

novi_cvorprvi

Page 62: uvod u programiranje predavanja 8

62

Уметање новог члана листеУметање новог члана листе

p->sled_adresa = novi_cvor;

podatak sled_adresa

podatak sled_adresa

podatak sled_adresa

17

0 45

63

prvi

podatak sled_adresa

92

p

podatak sled_adresa

50

novi_cvorprvi

Page 63: uvod u programiranje predavanja 8

63

Брисање чвора из листеБрисање чвора из листе

• Претпоставимо да треба обрисати чвор који садржи податак 63.

podatak sled_adresa

podatak sled_adresa

podatak sled_adresa

17

0 45

63

prvi

podatak sled_adresa

92

Page 64: uvod u programiranje predavanja 8

64

Брисање чвора из листеБрисање чвора из листе• Постављање показивача на чвор испред оног који

треба да се брише

struct jedna_lista *prvi, *p, *pom;/* neka je formirana lista */

...p = prvi;while(p -> podatak != 92) p = p -> sled_adresa;

podatak sled_adresa

podatak sled_adresa

podatak sled_adresa

17

0 45

63

prvi

podatak sled_adresa

92

p

Page 65: uvod u programiranje predavanja 8

65

Брисање чвора из листеБрисање чвора из листе

• Постављање показивача на чвор који треба да се брише

pom = p->sled_adresa;

podatak sled_adresa

podatak sled_adresa

podatak sled_adresa

17

0 45

63

prvi

podatak sled_adresa

92

p pom

Page 66: uvod u programiranje predavanja 8

66

Брисање чвора из листеБрисање чвора из листе

p->sled_adresa=p->sled_adresa-> sled_adresa;

podatak sled_adresa

podatak sled_adresa

podatak sled_adresa

17

0 45

63

prvi

podatak sled_adresa

92

p pom

Page 67: uvod u programiranje predavanja 8

67

Брисање чвора из листеБрисање чвора из листе

• free(pom);

podatak sled_adresa

podatak sled_adresa

17

0 45

63

prvi

podatak sled_adresa

92

p pom NULL

Page 68: uvod u programiranje predavanja 8

68

Пример 1/Пример 1/44

struct jedna_lista

{

int podatak;

struct jedna_lista *sled_adresa;

};

Page 69: uvod u programiranje predavanja 8

69

Пример 2/Пример 2/44

main() {1 struct jedna_lista *prvi,

*poslednji, *novi_cvor;2 int vrednost[5]={2, 15, 8, 24, 34};3 int i;4 prvi = NULL;5 poslednji = NULL;6 novi_cvor = NULL;7 ...

Page 70: uvod u programiranje predavanja 8

70

ПримерПример 3/4 3/4

for(i=0; i<5; i++) 8 { 9 novi_cvor = malloc(sizeof(struct jedna_lista));

10 if(novi_cvor)11 {12 novi_cvor->podatak=vrednost[i];13 novi_cvor->sled_adresa=NULL;14 }15 else16 break;17

Page 71: uvod u programiranje predavanja 8

71

ПримерПример 4/4 4/4

if(prvi == NULL) /*lista je prazna*/18 {19 prvi = novi_cvor;20 poslednji = novi_cvor;21 }22 else23 {24 poslednji->sled_adresa=novi_cvor;25 poslednji=novi_cvor;26 } 28 } /*kraj for*/29 }/* kraj main */

Page 72: uvod u programiranje predavanja 8

72

Двоструко повезане листе

Линеарна једноструко повезана листа

0glava

linkinfo

struct element { tip info; struct element *link; } *glava;

Линеарна двоструко повезана листа

glava

DinfoL

rep0 0

Page 73: uvod u programiranje predavanja 8

73

Пример Пример

Проћи кроз листу и исписати податке у листи.

thisptr=start;

while (thisptr!=0)

{

printf("%d",thisprt->data);

thisprt=thisprt-> prt;

}

Page 74: uvod u programiranje predavanja 8

74

Пример Пример • Додавање новог члана листе на почетак.

void add(llnode **head, <type> data_in) { llnode *tmp; if ((tmp = malloc(sizeof(*tmp))) == NULL) { ERR_MSG(malloc); (void)exit(EXIT_FAILURE); } tmp->data = data_in; tmp->next = *head; *head = tmp; }

/* ... inside some function ... */ llnode *head = NULL; <type> *some_data; /* ... initialize some_data ... */ add(&head, some_data);

Page 75: uvod u programiranje predavanja 8

75

Повезане листеПовезане листе

• Уклањање целе листе, није могуће обавити уклањањем само показивача на главу листе. Мора да се уклони сваки члан листе

void freelist(llnode *head) { llnode *tmp; while (head != NULL) { free(head->data); /* Don't forget to free memory within the list! */ tmp = head->next; free(head); head = tmp; } }

Page 76: uvod u programiranje predavanja 8

76

Повезане листеПовезане листе

• Стекови су посебна вртса повезаних листа, обично се обележавају као LIFO (Last In First Out)

• Стекови имају специфичне функције за додавање и брисање елемената које се зову push и pop.

• Push је у ствари додавање новог елемента на почетак листе, као мало пре.

• Поп је уклањање елемента са почетка листе.

• Када се раде pop и push, обично се користе информациони елементи структуре у програму.

Page 77: uvod u programiranje predavanja 8

77

Повезане листеПовезане листе

• Редови су FIFO (First In First Out)

• Реализација реда се ради креирањем показивача на реп листе.

• Нови елементи се додају на почетак. Уклањаје се одвија од краја листе.

• Пример за ред су листе за штампање

Page 78: uvod u programiranje predavanja 8

78

Нелинеарне повезане листеНелинеарне повезане листе

Бинарно стабло

čvor

koren

L D

info

Levo podstablo

0 0Desno

podstablo

0

0 0 0 0

Page 79: uvod u programiranje predavanja 8

79

Дефиниција бинарног стаблаДефиниција бинарног стабла

struct stablo {

int broj;

stablo *desni;

stablo * levi;

}

stablo *koren, *p;

Page 80: uvod u programiranje predavanja 8

80

Редоследи обиласка бинарног Редоследи обиласка бинарног стабластабла

Page 81: uvod u programiranje predavanja 8

81

Implementacija funkcije za INORDER redosledImplementacija funkcije za INORDER redosled

struct NODE { struct NODE *left; int value; struct NODE *right; }inorder(struct NODE *curr){ if(curr->left != NULL) inorder(curr->left); /*step-1 & step-2*/ printf("%d", curr->value); /*step-3*/ if(curr->right != NULL) inorder(curr->right); /*step-4*/}

Page 82: uvod u programiranje predavanja 8

82

Хвала на пажњи

Питања?