uvod u programiranje predavanja 8

Preview:

DESCRIPTION

uvod u programiranje

Citation preview

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

Структуре

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

2

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

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

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

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

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

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

3

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

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

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

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

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

4

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

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

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

Atributi?Atributi?

prezimevisina

ime

struct osoba {

char prezime[15];

char ime[15];

int visina;

}

5

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

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

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

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];

7

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

Пример:

struct student

{

char prezime[20];

char ime[20];

char dat_rodj[8];

int god_studija;

float prosecna_ocena;

};

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 ?

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];

10

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

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

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

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

11

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

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

{

char prezime[20];

char ime[20];

char dat_rodj[8];

int god_studija;

float prosecna_ocena;

} stud_pod, stud_novi;

12

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

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

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

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

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

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

13

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

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

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

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

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; ...}

15

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

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

структуре

struct datum

{

int dan;

int mesec;

int godina;

}dan_u_godini={21,10,1968};

16

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

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

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

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;

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);}

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*/}

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

21

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

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

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

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;

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

? ?

?

24

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

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

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

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

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.

26

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

[0]

[1]

[2]

[248]] [249]

st_prve_godine

student

dat_rodj

ime

prezime

god_studija

Prosecna_ocena

.

.

.

27

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

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

Пример:

void funkcija ( struct tacka a )

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

Пример:

typedef struct {int i,j} TACKA;

TACKA funkcija ( TACKA a, TACKA b );

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);}

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);

}

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

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)

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;

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

34

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

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

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

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

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

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

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.

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);}

37

УнијеУније

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

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

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

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

MEMORIJA

Podatak1(2 bajta)

Podatak2(1 bajt)

Zajednička oblastza podatak1 i za podatak2 Unija zauzima

ukupno 2 bajta

38

УнијеУније

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

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

} lista_promjenljivih;

Кључна реч

Име уније

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

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

Пример:

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

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’;

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

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];

42

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

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

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

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

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

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

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

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

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

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

43

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

• Листе

• Стабла

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

45

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

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

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

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

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

46

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

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

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

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

47

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

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

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

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

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

48

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

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

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

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

struct llnode {

<type> data;

struct llnode *next;

};

49

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

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

typedef struct list_node {

<type> data;

struct list_node *next; } llnode;

llnode *head = NULL;

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

50

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

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

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

adresa

podatak8.96

45

65

34

76

Prvi

51

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

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

45

65

Prvi 1200

1200 1575

52

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

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

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

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

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

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

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

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

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

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;}

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

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

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

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

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

63

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

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

podatak sled_adresa

podatak sled_adresa

podatak sled_adresa

17

0 45

63

prvi

podatak sled_adresa

92

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

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

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

67

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

• free(pom);

podatak sled_adresa

podatak sled_adresa

17

0 45

63

prvi

podatak sled_adresa

92

p pom NULL

68

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

struct jedna_lista

{

int podatak;

struct jedna_lista *sled_adresa;

};

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

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

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 */

72

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

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

0glava

linkinfo

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

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

glava

DinfoL

rep0 0

73

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

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

thisptr=start;

while (thisptr!=0)

{

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

thisprt=thisprt-> prt;

}

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);

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; } }

76

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

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

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

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

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

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

77

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

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

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

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

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

78

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

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

čvor

koren

L D

info

Levo podstablo

0 0Desno

podstablo

0

0 0 0 0

79

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

struct stablo {

int broj;

stablo *desni;

stablo * levi;

}

stablo *koren, *p;

80

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

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*/}

82

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

Питања?