Microsoft PowerPoint - 07-DinamickeStrukturePodataka

Слични документи
Microsoft PowerPoint - Programski_Jezik_C_Organizacija_Izvrsnog_Programa [Compatibility Mode]

Univerzitet u Novom Sadu Tehnički fakultet Mihajlo Pupin Zrenjanin Seminarski rad Predmet: Konkuretno programiranje doc. dr Dejan Lacmanovic Zorica Br

Programski jezici i strukture podataka 2018/2019. Programski jezici i strukture podataka Računarske vežbe vežba 10 Zimski semestar 2018/2019. Studijsk

Računarski praktikum I - Vježbe 09 - this, static

Uvod u računarstvo 2+2

Funkcije predavač: Nadežda Jakšić

P9.1 Dodela resursa, Bojenje grafa

Tutoring System for Distance Learning of Java Programming Language

Microsoft Word - 11 Pokazivaci

Uvod u računarstvo 2+2

Logicko projektovanje racunarskih sistema I

P11.3 Analiza zivotnog veka, Graf smetnji

Računarski praktikum I - Vježbe 03 - Implementacija strukture string

Računarski praktikum I - Vježbe 07 - Podstrukture, const, reference

Grafovi 1. Posmatrajmo graf prikazan na slici sa desne strane. a) Odrediti skup čvorova V i skup grana E posmatranog grafa. Za svaku granu posebno odr

Programski jezik C

Microsoft PowerPoint - Programski_Jezik_C_Organizacija_Izvornog_Programa_I_Greske [Compatibility Mode]

Programiranje 2 0. predavanje Saša Singer web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb Prog2 2019, 0. predavanje p. 1/4

Microsoft PowerPoint - OOPpredavanja05 [Compatibility Mode]

Microsoft Word - AIDA2kolokvijumRsmerResenja.doc

1 jmbag ime i prezime Programiranje 2 prvi kolokvij, Rezultati i uvidi u kolokvije: Rezultati u petak, 3.5., navečer na webu, a uvidi u p

Microsoft PowerPoint - 13-Funkcije_2.ppt [Compatibility Mode]

Uvod u računarstvo 2+2

Konstrukcija i analiza algoritama vežbe 10 Nina Radojičić 15. decembar Algoritamske strategije - podeli pa vladaj (divide and conquer) Ova stra

Рачунарска интелигенција

Računarski praktikum I - Vježbe 01 - Uvod

Programiranje za UNIX Okruženje unix procesa

Microsoft PowerPoint - C-4-1

Računarski praktikum I - Vježbe 06 - Standard Template Library (2)

Microsoft PowerPoint - 10-Jednodimenzionalni nizovi.ppt [Compatibility Mode]

Funkcije predavač: Nadežda Jakšić

VEŽBA 5: KLASE I OBJEKTI U C# Cilj ove vežbe je upoznavanje sa osnovama rada sa klasama i objektima u programskom jeziku C#. Pored toga, bide demonstr

Microsoft PowerPoint - 03-Slozenost [Compatibility Mode]

Programiranje u C-u ili C++-u Pseudo-slučajni brojevi; Dinamička alokacija memorije 1 ZADACI SA ČASA Zadatak 1 Napraviti funkciju koja generišlučajan

Programiranje II Beleške sa vežbi Smer Informatika Matematički fakultet, Beograd Sana Stojanović 1

Datoteke predavač: Nadežda Jakšić

Inženjering informacionih sistema

07_PJISP_II_Predavanja

Microsoft PowerPoint - MR - Vjezbe - 03.ppt [Compatibility Mode]

Увод у организацију и архитектуру рачунара 1

Programski jezik C

Microsoft PowerPoint - Datoteke [Compatibility Mode]

Programiranje 1 drugi kolokvij, 2. veljače Ime i prezime: JMBAG: Upute: Na kolokviju je dozvoljeno koristiti samo pribor za pisanje i brisanje,

3.Kontrlne (upravlja~ke) strukture u Javi

Електротехнички факултет Универзитета у Београду Катедра за рачунарску технику и информатику Kолоквијум из Интелигентних система Колоквију

Programiranje 2 popravni kolokvij, 15. lipnja Ime i prezime: JMBAG: Upute: Na kolokviju je dozvoljeno koristiti samo pribor za pisanje i brisanj

Računarske mreže Čas 2 Ivana Tanasijević Matematički fakultet, Beograd 1

Postavka 2: Osnovni graf algoritmi 1 DISTRIBUIRANI ALGORITMI I SISTEMI Iz kursa CSCE 668 Proleće 2014 Autor izvorne prezentacije: Prof. Jennifer Welch

Programiranje 1 9. predavanje Saša Singer web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb Prog1 2018, 9. predavanje p. 1/6

Tutoring System for Distance Learning of Java Programming Language

MergedFile

1. Apsolutni pobednik na glasanju vreme memorija ulaz izlaz 0,1 s 64 Mb standardni ulaz standardni izla Apsolutni pobednik izbora je onaj ko osvoji ba

Microsoft Word - MySQL_3.doc

Algoritmi

Računarski praktikum I - Vježbe 11 - Funktori

MIP-heuristike (Matheuristike) Hibridi izmedu metaheurističkih i egzaktnih metoda Tatjana Davidović Matematički institut SANU

6-8. ČAS Celobrojno programiranje Rešavamo sledeći poblem celobrojnog programiranja: Gde pretpostavljamo da je A celobrojna matrica dimenzije,. Takođe

Uvod u računarstvo 2+2

Zadatak T=5: Jedinica WBSD propušta vred Potiče iz polja Rwb.LMD Signal Rwb.WRLMD izaziva propuštanje ove vrednosti 2. Vrednost 0000

Celobrojno programiranje Rešavamo sledeći poblem celobrojnog programiranja: min c T x Ax = b x 0 x Z n Gde pretpostavljamo da je A celobrojna matrica

13E114PAR, 13S113PAR DOMAĆI ZADATAK 2018/2019. Cilj domaćeg zadatka je formiranje petlje softverske protočnosti za minimalni broj ciklusa.

ELEKTROTEHNIČKI FAKULTET UNIVERZITETA U BEOGRADU BEOGRAD, Ispit iz Programiranja 2 Ispit traje 135 minuta Napomene: a) Pažljivo proučite U

NIZOVI

P11.2 Izbor instrukcija, IBURG

P3.2 Paralelno programiranje 2

Програмирај!

Писање и превођење модула

Класе комбинација презентације (Хортона) и к о бајаги скрипте (Ово је прича коју врло радо причам) нови тип података: дефинишу могуће вредности подата

PROMENLJIVE, TIPOVI PROMENLJIVIH

1. Vremensko ograničenje Memorijsko ograničenje ulaz izlaz 0,1 s 64 MB standardni ulaz standardni izlaz Banka želi da upozori kupce na sumnjive aktivn

Microsoft PowerPoint - 12-Funkcije_1.ppt [Compatibility Mode]

P2.1 Projektovanje paralelnih algoritama 1

Primenjeno programiranje - vezbe GUI i baze podataka

Programiranje 1 IEEE prikaz brojeva sažetak Saša Singer web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb Prog1 2018, IEEE p

PowerPoint Presentation

Орт колоквијум

ELEKTROTEHNIČKI FAKULTET, UNIVERZITET U BEOGRADU KATEDRA ZA ELEKTRONIKU UVOD U ELEKTRONIKU - 13E041UE LABORATORIJSKA VEŽBA Primena mikrokontrolera

Introduction to Programming

KORISNIČKO UPUTSTVO

Microsoft Word - Zadaci za samostalno vjezbanje 4.doc

070-ALIP2-udzbenik.indb

Algoritmi SŠ P1

RACUNARSKA ELEKTRONIKA – VEŽBE 3

Microsoft Word - Uputstvo za koristenje aplikacije GIPKO

Oblikovanje i analiza algoritama 5. predavanje Saša Singer web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb OAA 2017, 5. pr

Tutoring System for Distance Learning of Java Programming Language

Programski jezici i strukture podataka

CARNET Helpdesk - Podrška obrazovnom sustavu e-dnevnik upute za nadzor razrednih knjiga tel: fax: mail:

Алгоритми засновани на рођенданском парадоксу и примене

Postavka 12: Uzročnost 1 DISTRIBUIRANI ALGORITMI I SISTEMI Iz kursa CSCE 668 Proleće 2014 Autor izvorne prezentacije: Prof. Jennifer Welch

Projekti šabloni

Programiranje 2 7. predavanje Saša Singer web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb Prog2 2019, 7. predavanje p. 1/7

P1.2 Analiza efikasnosti algoritama 2

Zadatak 011 Razmotrite sljedeći primjer. package hr.fer.oopj.primjeri.p011; public class Main { } public static void main(string[] args) { obrada(2.71

Microsoft PowerPoint - Timer0 16F887.ppt [Compatibility Mode]

Dijagrami sekvenci

PowerPoint Presentation

Classroom Expectations

I grupa 1. Napisati program koji izračunava i ispisuje zbir 4 najveća od pet brojeva unetih sa standardnog ulaza. ulaz izlaz Analiza: 1.

2015_k2_z12.dvi

Транскрипт:

Динамичке структуре података листа, стек, ред Програмирање 2: глава 6

Динамичке структуре података Динамичка алокација и динамичке структуре података Најзначајније динамичке структуре података листе и стабла 2

Динамичке / статичке структуре података Карактеристике низа (статичког и динамичког) уношење, брисање, претрага На почетак, крај, средину низа Временска сложеност 3

Листе Једноструко повезане листе Кружне листе Двоструко повезане листе Креирање (уношење), обрада, брисање 4

Једноструко повезана листа Чворови: вредности произвољних типова и показивачи Први чвор је глава листе и на њега показује показивач glava (то је адреса главе листе) Остатак листе је опет листа тзв. реп листе Листа без чворова је празна листа У последњем чвору листе показивач је NULL. 5

Једноструко повезана листа: предности и недостаци Уношење, брисање, претрага На почетак, крај, средину листе Временска сложеност Фрагментација меморије 6

Избор Коју структуру података бисте користили ако треба да......често приступате подацима и мењате њихове вредности?... често додајете нове податке на крај?... често додајете нове податке на почетак?... често додајете нове податке на одговарајуће место?... често додајете и бришете податке? Зашто? 7

Структура чвора листе typedef struct cvor { <type> podatak; struct cvor *sledeci; Cvor; <type> означава тип податка чвора листе (произвољан, може и структура) Чвор може да садржи и више података: typedef struct cvor { <type1> podatak1;... <typen> podatakn; struct cvor *sledeci; Cvor; 8

Креирање листе Приступ преко показивача на почетак / крај листе На почетку је листа празна Нови чвор (елемент) се додаје на почетак, крај или у средину листе Нови елемент се креира пре додавања у листу 9

Креирање елемента листе Динамичка алокација Иницијализовање вредности typedef struct cvor { int vrednost; /* podatak koji cvor sadrzi */ struct cvor *sledeci; /* pokazivac na sledeci cvor */ Cvor; Cvor *napravi_cvor(int broj) { Cvor *novi = (Cvor *) malloc(sizeof(cvor)); if(novi == NULL) return NULL; /*alokacija nije uspela*/ novi->vrednost = broj; novi->sledeci = NULL; return novi; 10

Додавање елемента на почетак листе Најједноставније Креира се елемент (чвор) са подацима Новокреирани чвор се повезује са почетком листе а показивач glava показује на новокреирани чвор Мења се глава листе тј. вредност показивача glava 11

Додавање елемента на почетак листе Функција додавања чвора на почетак листе int dodaj_na_pocetak_liste(cvor **adresa_glave, int broj) { Cvor *novi = napravi_cvor(broj); if(novi == NULL) return 1; /* uvezujemo novi cvor na pocetak */ novi->sledeci = *adresa_glave; /*Postavljamo novu glavu liste*/ *adresa_glave = novi; return 0; 12

Додавање елемената на почетак листе - Int main() { Cvor *glava = NULL; int broj; scanf("%d", &broj); while(broj>=0) { пример if(dodaj_na_pocetak_liste(&glava, broj) == 1) { fprintf(stderr, "Greska: Neuspesna alokacija memorije za cvor.\n"); oslobodi_listu(&glava); exit(exit_failure); scanf("%d", &broj); /* obrada liste */ oslobodi_listu(&glava); exit(exit_success); 13

Обрада елемената листе Обрада свих елемената листе састоји се у следећем: 1. Постављање показивача tekuci на почетак листе 2. Провера да ли показивач tekuci показује на празну листу и у том случају завршетак обраде 3. Обрада податка у чвору на који показује показивач tekuci 4. Померање показивача tekuci тако да показује на следећи чвор листе и повратак на корак 2 14

Обрада свих елемената листе - пример void uvecaj_za_tri(cvor *glava) { Cvor *tekuci; for (tekuci = glava; tekuci!= NULL; tekuci = tekuci->sledeci) tekuci->vrednost += 3; 15

Рекурзивни пролазак кроз листу Листа је дефинисана рекурзивно (глава, реп) па је погодно рекурзивно имплементирати алгоритме обраде листе: Ако је листа празна, завршити; Ако листа није празна, обрадити главу листе а затим позвати рекурзивно исту функцију обраде која као аргумент прима реп листе (који је опет листа) 16

Рекурзивна обрада листе -пример void uvecaj_za_tri(cvor *glava) { if(glava == NULL) return; glava->vrednost+=3; uvecaj_za_tri(glava->sledeci); 17

Пролазак кроз листу проналажење елемента Cvor *pretrazi_listu(cvor *glava, int broj) { Cvor *tekuci; for (tekuci = glava; tekuci!= NULL; tekuci = tekuci->sledeci) if (tekuci->vrednost == broj) return tekuci; return NULL; (Рекрзивна функција?) 18

Додавање на крај листе Прво треба одредити крај листе Проласком кроз листу док показивач на следећи елемент не буде NULL Чувањем показивача на крај листе (ако је потребно) 19

Проналажење последњег елемента у листи Cvor *pronadji_poslednji(cvor *glava) { if(glava == NULL) return NULL; while (glava->sledeci!= NULL) glava = glava->sledeci; return glava; (рекурзивна функција?) 20

Додавање на крај листе Пронашли смо показивач на последњи елемент у листи Ако је листа празна, глава листе постаје новокреирани елемент Ако листа није празна, показивач у последњем чвору мења се тако да показује на новокреирани елемент Може да се промени глава листе тј. вредност показивача који садржи адресу главе листе 21

Додавање на крај листе int dodaj_na_kraj_liste(cvor **adresa_glave, int broj) { Cvor *novi = napravi_cvor(broj); if(novi == NULL) return 1; if(*adresa_glave == NULL) { *adresa_glave = novi; else { Cvor *poslednji = pronadji_poslednji(*adresa_glave); poslednji->sledeci = novi; return 0; 22

Додавање елемента у средину 23

Додавање елемента у сортирану листу Креирати нови чвор Ако је листа празна, нова листа садржи само новокреирани чвор Ако листа није празна, проверити да ли чвор треба да се уметне на почетак листе (функција dodaj_na_pocetak_liste) Ако не умећемо на почетак, пронаћи чвор А иза којег треба да уметнемо новокреирани чвор Прво повезати новокреирани чвор са следбеником од А а затим Повезати чвор А са новокреираним чвором Уметањем у средину (случај уметања на почетак) може да се измени глава листе 24

Додавање елемента у сортирану листу int dodaj_sortirano(cvor **adresa_glave, int broj) { if(*adresa_glave == NULL){ Cvor *novi = napravi_cvor(broj); if(novi == NULL) return 1; *adresa_glave = novi; return 0; if((*adresa_glave)->vrednost >= broj) { return dodaj_na_pocetak_liste(adresa_glave, broj); Cvor *pomocni = pronadji_mesto_umetanja(*adresa_glave, broj); return dodaj_iza(pomocni, broj); 25

Додавање елемента у сортирану листу Cvor *pronadji_mesto_umetanja(cvor *glava, int broj) { if(glava == NULL) return NULL; while(glava->sledeci!= NULL && glava->sledeci->vrednost < broj) glava = glava->sledeci; return glava; int dodaj_iza(cvor *tekuci, int broj) { Cvor *novi = napravi_cvor(broj); if(novi == NULL) return 1; novi->sledeci = tekuci->sledeci; tekuci->sledeci = novi; return 0; 26

Брисање првог елемента листе Ако листа није празна, сачувати показивач на следећи елемент Обрисати чвор - главу листе Сачувани показивач показује на главу листе Брисањем првог елемента листе мења се глава листе тј. вредност показивача на главу листе 27

Брисање првог елемента листе void obrisi_prvi(cvor **adresa_glave) { Cvor *pomocni = NULL; if(*adresa_glave == NULL) return; pomocni = (*adresa_glave)->sledeci; free(*adresa_glave); *adresa_glave = pomocni; 28

Брисање целе листе Ослобађање меморије коју заузима цела листа састоји се у узастопном брисању првог елемента у листи 29

Брисање целе листе void oslobodi_listu(cvor **adresa_glave) { Cvor *pomocni = NULL; while (*adresa_glave!= NULL) { pomocni = (*adresa_glave)->sledeci; free(*adresa_glave); *adresa_glave = pomocni; 30

Брисање елемента са задатом вредношћу из листе 31

Брисање елемента са задатом вредношћу из листе Брисање елемента са задатом вредношћу из листе састоји се у следећем: Ако је листа празна, завршити Проверити да ли се тражени елемент налази на почетку листе (једном или више пута) Ако је претходни услов тачан, применити брисање елемента са почетка листе Иначе, пронаћи показивач на елемент А у листи који показује на елемент који треба да се обрише Сачувати вредност показивача на елемент који треба да се обрише Повезати елемент А са елементом који следи за елементом који треба да се обрише Ослободити меморију коју заузима елемент који треба да се обрише 32

Брисање елемента са задатом вредношћу из листе void obrisi_cvor(cvor **adresa_glave, int broj) { Cvor *tekuci = NULL; Cvor *pomocni = NULL; /* Sa pocetka liste se brisu svi cvorovi koji su jednaki datom broju i azurira se pokazivac na glavu liste */ while (*adresa_glave!= NULL && (*adresa_glave)->vrednost == broj){ pomocni = (*adresa_glave)->sledeci; free(*adresa_glave); *adresa_glave = pomocni; /* Ako je nakon ovog brisanja lista prazna, to je kraj */ if (*adresa_glave == NULL) return; 33

Брисање елемента са задатом вредношћу из листе /* Poredi se vrednost sledeceg cvora (ako postoji) sa trazenim brojem. Cvor se brise ako je jednak, a ako je razlicit, prelazi se na sledeci. Ovaj postupak se ponavlja dok se ne dodje do poslednjeg cvora. */ tekuci = *adresa_glave; while (tekuci->sledeci!= NULL) if (tekuci->sledeci->vrednost == broj) { else { return; pomocni = tekuci->sledeci; tekuci->sledeci = pomocni->sledeci; free(pomocni); tekuci = tekuci->sledeci; 34

Кружна листа У кружној листи последњи елемент показује на почетак листе Од било ког елемента у листи може да се стигне до сваког другог елемента у листи Избор првог и последњег елемента је релативан Могу да се користе за решавање разних врста проблема 35

Кружна листа Пролазак кроз кружну листу: void uvecaj_za_tri(cvor *glava) { Cvor *tekuci = glava; if (tekuci == NULL) return; do { tekuci->vrednost += 3; tekuci = tekuci->sledeci; while(tekuci!= glava); 36

Двоструко повезане листе Једноструко повезана листа једноставан обилазак у једном смеру, временски захтеван у супротном Двоструко повезана листа сваки чвор показује и на претходника и на следбеника Омогућује једноставан обилазак у оба смера (унапред и уназад) Додавање и брисање елемената захтева одржавање оба показивача Могу бити и кружне 37

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

Структура чвора двоструко повезане листе typedef struct cvor{ int vrednost; struct cvor *sledeci; struct cvor *prethodni; Cvor; 39

Двоструко повезана листа Cvor* napravi_cvor(int broj) { Cvor *novi = (Cvor*)malloc(sizeof(Cvor)); if(novi == NULL) return NULL; /* Inicijalizacija polja strukture */ novi->vrednost = broj; novi->sledeci = NULL; novi->prethodni = NULL; return novi; 40

Двоструко повезана листа додавање на почетак int dodaj_na_pocetak_liste(cvor **adresa_glave, Cvor **adresa_kraja, int broj) { Cvor *novi = napravi_cvor(broj); if (novi == NULL) return 1; /* Glava stare liste postaje sledbenik novog cvora*/ novi->sledeci = *adresa_glave; /* Ako stara lista nije bila prazna, onda prethodni cvor glave treba da bude novi cvor. Inace, novi cvor je u isto vreme i pocetni i krajnji. */ if (*adresa_glave!= NULL) (*adresa_glave)->prethodni = novi; else *adresa_kraja = novi; /* Novi cvor je nova glava liste */ *adresa_glave = novi; return 0; 41

Двоструко повезана листа додавање на крај int dodaj_na_kraj_liste(cvor **adresa_glave, Cvor **adresa_kraja, int broj) { Cvor *novi = napravi_cvor(broj); if (novi == NULL) return 1; /* U slucaju prazne liste, аzuriraju se vrednosti na koje pokazuju adresa_glave i adresa_kraja. Ako lista nije prazna, azurira se samo pokazivac na kraj liste */ if (*adresa_glave == NULL) { *adresa_glave = novi; *adresa_kraja = novi; else { (*adresa_kraja)->sledeci = novi; novi->prethodni = (*adresa_kraja); *adresa_kraja = novi; return 0; 42

Двоструко повезана листа додавање у сортирану листу int dodaj_sortirano(cvor **adresa_glave, Cvor **adresa_kraja, int broj) { if (*adresa_glave == NULL) { Cvor *novi = napravi_cvor(broj); if (novi == NULL) return 1; *adresa_glave = novi; *adresa_kraja = novi; return 0; if ((*adresa_glave)->vrednost >= broj) { return dodaj_na_pocetak_liste(adresa_glave, adresa_kraja, broj); Cvor *pomocni = pronadji_mesto_umetanja(*adresa_glave, broj); if (dodaj_iza(pomocni, broj) == 1) return 1; if(pomocni == *adresa_kraja) return 0; *adresa_kraja = pomocni->sledeci; 43

Двоструко повезана листа додавање у сортирану листу Cvor *pronadji_mesto_umetanja(cvor *glava, int broj) { if(glava == NULL) return NULL; while(glava->sledeci!= NULL && glava->sledeci->vrednost < broj) glava = glava->sledeci; return glava; int dodaj_iza(cvor *tekuci, int broj) { Cvor *novi = napravi_cvor(broj); if (novi == NULL) return 1; novi->sledeci = tekuci->sledeci; novi->prethodni = tekuci; if (tekuci->sledeci!= NULL) tekuci->sledeci->prethodni = novi; tekuci->sledeci = novi; return 0; 44

Двоструко повезана листа брисање void obrisi_tekuci(cvor **adresa_glave, Cvor **adresa_kraja, Cvor *tekuci) { /* Ako je tekuci NULL pokazivac, nema potrebe za brisanjem */ if(tekuci == NULL) return; if(tekuci->prethodni!= NULL) tekuci->prethodni->sledeci = tekuci->sledeci; if(tekuci->sledeci!= NULL) tekuci->sledeci->prethodni = tekuci->prethodni; if(tekuci == *adresa_glave) *adresa_glave = tekuci->sledeci; /* Ako je cvor koji se brise poslednji u listi, azurira se i pokazivac na kraj liste */ if(tekuci == *adresa_kraja) *adresa_kraja = tekuci->prethodni; free(tekuci); 45

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

Стек Стек (engl. stack) је структура која функционише по принципу LIFO (last in, first out) Основне операције (О(1)) : Додавање елемента на врх стека потискивање (engl. push); Скидање елемента са врха стека (engl. pop) Примери Различите имплементације 47

Стек-имплементација коришћењем низова Тренутно последњи елемент у низу се третира као врх стека Додавање на врх стека -> додавање на крај низа Скидање елемента са врха стека -> узимање последњег елемента низа 48

Стек-имплементација коришћењем листе Функција potisni_na_stek -> функција dodaj_na_pocetak_liste Функција skini_sa_steka -> модификована функција obrisi_sa_pocetka_liste Функција skini_sa_steka треба да Обрише елемент Врати вредност која се налази у чвору који је у врху листе Врати информацију да ли је скидање са стека успело (нпр. да ли је стек празан) 49

Стек-имплементација коришћењем листе int potisni_na_stek(cvor **adresa_vrha, int broj) { Cvor *novi = napravi_cvor(broj); if (novi == NULL) return 1; novi->sledeci = *adresa_vrha; *adresa_vrha = novi; return 0; int skini_sa_steka(cvor **adresa_vrha, int *adresa_broja) { Cvor *pomocni = NULL; if (*adresa_vrha == NULL) return 1; pomocni = *adresa_vrha; if (adresa_broja!= NULL) *adresa_broja = pomocni->vrednost; *adresa_vrha = pomocni->sledeci; free(pomocni); /* Vraca se indikator uspesno izvrsene radnje */ return 0; 50

Ред Ред (engl. queue) је структура која функционише на принципу FIFO (first in, first out) Основне операције (О(1)): Додавање елемента на крај реда (engl. add) Скидање елемента са почетка реда (engl. get) Примери Различите имплементације 51

Ред имплементација коришћењем низова Додавање на крај реда -> додавање на крај низа Скидање са почетка реда -> узимање са почетка низа Ради ефикасности праве се циклични низови Следећи индекс се рачуна по модулу n (величина резервисане меморије) Наредни елемент (било да се додаје на крај или скида са почетка) рачуна се са i = (i + 1) mod n За индексе почетка p и краја реда k не мора да важи да је p < k Важно је да се води рачуна да крај низа не прегази почетак низа 52

Ред имплементација коришћењем листе Ради ефикасности користи се показивач на почетак реда и показивач на крај реда Функције добијају оба показивача, на пример: int dodaj_u_red(cvor **adresa_pocetka, Cvor **adresa_kraja, int broj); int skini_sa_reda(cvor **adresa_pocetka, Cvor **adresa_kraja, int *adresa_broja); 53

Ред имплементација коришћењем листе int dodaj_u_red(cvor **adresa_pocetka, Cvor **adresa_kraja, int broj); Додавањем елемента у ред могу да се измене и почетак и крај реда Ако је ред празан, мењају се оба показивача, ако није, мења се само крај Повратна вредност говори да ли је додавање у ред успешно Пролазак кроз ред као и кроз листу 54

Ред имплементација коришћењем листе int skini_sa_reda(cvor **adresa_pocetka, Cvor **adresa_kraja, int *adresa_broja); Брисањем елемента из реда могу да се промене и почетак и крај реда Ако ред садржи само један елемент, мењају се оба, ако садржи више елемената, мења се само почетак Функција скидања елемента са реда Брише елемент из реда Враћа вредност која је скинута са реда (као свој аргумент) Враћа информацију о томе да ли је скидање елемента са реда успело (као повратну вредност) нпр. да ли је ред празан 55

Ред имплементација коришћењем листе int dodaj_u_red(cvor **adresa_pocetka, Cvor **adresa_kraja, int broj) { Cvor *novi = napravi_cvor(broj); if(novi == NULL) return 1; if(*adresa_kraja!= NULL) { else { return 0; (*adresa_kraja)->sledeci = novi; *adresa_kraja = novi; *adresa_pocetka = novi; *adresa_kraja = novi; 56

Ред имплементација коришћењем листе int skini_sa_reda(cvor **adresa_pocetka, Cvor **adresa_kraja, int *adresa_broja) { Cvor *pomocni = NULL; if (*adresa_pocetka == NULL) return 1; if (adresa_broja!= NULL) *adresa_broja = (*adresa_pocetka)->vrednost; pomocni = *adresa_pocetka; *adresa_pocetka = (*adresa_pocetka)->sledeci; free(pomocni); if (*adresa_pocetka == NULL) return 0; *adresa_kraja = NULL; 57

Ред имплементација коришћењем кружне листе Ред може да се имплементира коришћењем кружне листе Памти се само показивач на последњи елемент у листи Иза последњег елемента у кружној листи налази се први елемент реда dodaj u red: додавање се врши иза последњег елемента и ажурира се вредност показивача на последњи елемент skini sa reda: врши се узимањем првог елемента иза последњег 58