View
235
Download
9
Category
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
Хвала на пажњи
Питања?
Recommended