Celková osnova všech přednášek. Algoritmy II prezentace k přednáškám. Celková osnova všech přednášek (pokrač.)

Podobné dokumenty
Dynamická alokace paměti

Lineární datové struktury

Úvodní přednáška. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

Úvodní přednáška. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

Lineární datové struktury

Úvodní přednáška. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

Úvodní přednáška. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

Spojová implementace lineárních datových struktur

Algoritmy II. Otázky k průběžnému testu znalostí

Programování v C++, 2. cvičení

Základní datové struktury

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Algoritmizace prostorových úloh

Konstruktory a destruktory

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Datové typy a struktury

Dynamické datové struktury I.

Programování v C++ 2, 4. cvičení

Algoritmizace prostorových úloh

Kolekce, cyklus foreach

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Abstraktní datové typy

Pointery II. Jan Hnilica Počítačové modelování 17

NMIN102 Programování /2 Z, Zk

2 Datové struktury. Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Da D to t v o é v ty t py IB111: Datové typy

Mělká a hluboká kopie

Maturitní témata. IKT, školní rok 2017/18. 1 Struktura osobního počítače. 2 Operační systém. 3 Uživatelský software.

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Dynamické datové struktury IV.

TÉMATICKÝ OKRUH TZD, DIS a TIS

ADT/ADS = abstraktní datové typy / struktury

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) b)

Binární vyhledávací stromy II

Lineární spojový seznam (úvod do dynamických datových struktur)

Úvod do programovacích jazyků (Java)

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Základy programování (IZP)

KIV/ZI Základy informatiky. Přednášející: Ing. Jana Krutišová Cvičící: Ing. Michal Nykl

Programování v C++ 1, 1. cvičení

Prohledávání do šířky = algoritmus vlny

Šablony, kontejnery a iterátory

Datové struktury. alg12 1

Název předmětu: Školní rok: Forma studia: Studijní obory: Ročník: Semestr: Typ předmětu: Rozsah a zakončení předmětu:

Ukazatele, dynamická alokace

ALGORITMIZACE A PROGRAMOVÁNÍ

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Předměty. Algoritmizace a programování Seminář z programování. Verze pro akademický rok 2012/2013. Verze pro akademický rok 2012/2013

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

8 Třídy, objekty, metody, předávání argumentů metod

3 Co je algoritmus? Trocha historie Definice algoritmu Vlastnosti algoritmu... 3

IUJCE 07/08 Přednáška č. 6

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Maturitní otázky z předmětu PROGRAMOVÁNÍ

12PPOK PROJEKTOVÁNÍ POZEMNÍCH KOMUNIKACÍ

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Více o konstruktorech a destruktorech

Programování v jazyce C a C++

Jazyk C++ II. STL knihovna kontejnery část 2

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Programování v C++ 2, 8. cvičení

PB161 Programování v jazyce C++ Přednáška 9

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Dynamické datové typy a struktury

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

Datové struktury 2: Rozptylovací tabulky

Distanční opora předmětu: Programování v jazyce C Tématický blok č. 8: Dynamické datové struktury, ladění programů Autor: RNDr. Jan Lánský, Ph.D.

přetížení operátorů (o)

bfs, dfs, fronta, zásobník, prioritní fronta, halda

Grafy. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 13.

Matematika I (2017) Literatura Opakovací kurs SŠ matematiky (4 str., 138 příkladů)+ Zákl. vzorce... Zákl. informace: Úroveň A, B,...

Jazyk C++ II. STL knihovna kontejnery část 1

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Úvod do programování - Java. Cvičení č.4

O datových typech a jejich kontrole

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Reprezentace dat v informačních systémech. Jaroslav Šmarda

Paralelní programování

PŘETĚŽOVÁNÍ OPERÁTORŮ

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

Základy algoritmizace. Hašování

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Algoritmizace a programování

1. D Y N A M I C K É DAT O V É STRUKTUR Y

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

Informační a komunikační technologie

Struktura programu v době běhu

Vstupní požadavky, doporučení a metodické pokyny

SYLABUS BAKALÁŘSKÁ PRÁCE A PRAXE

Cílem kapitoly je seznámit studenta se seznamem a stromem. Jejich konstrukci, užití a základní vlastnosti.

Abstraktní datové typy: zásobník

HARMONOGRAM AKADEMICKÉHO ROKU 2018/2019

Základy programování (IZP)

Transkript:

elková osnova všech přednášek lgoritmy prezentace k přednáškám doc. Mgr. iří vorský, Ph.. Katedra informatiky akulta elektrotechniky a informatiky VŠ TU Ostrava Prezentace ke dni 28. března 2018 iří vorský (VŠ TUO) lgoritmy 1 / 458 0. Úvodní přednáška O předmětu lgoritmy Prezenční forma studia Výuka Úkoly a jejich hodnocení Kombinovaná forma studia Výuka Úkoly a jejich hodnocení Software pro výuku Studijní literatura 1. Lineární datové struktury atové struktury Zásobník ronta Seznam 2. ynamická alokace paměti Podobenství o žlutém lístečku a kastrolu s gulášem iří vorský (VŠ TUO) lgoritmy 2 / 458 elková osnova všech přednášek (pokrač.) Podobenství o kabátu v šatně na plese Pointery v ++ 3. Spojová implementace lineárních datových struktur Spojová implementace obousměrného seznamu Zdrojové kódy 4. rafy Sled, cesta, kružnice Stromy Kořenový strom Vybrané pojmy Seřazený strom 5. lgoritmy průchodů grafem Prohledávání grafu do šířky Prohledávání grafu do hloubky plikace Topologické třídění iří vorský (VŠ TUO) lgoritmy 3 / 458 elková osnova všech přednášek (pokrač.) ledání cesty v bludišti Počítačová grafika vyplňování oblasti 6. inární vyhledávací stromy inární stromy inární vyhledávací stromy 7. inární vyhledávací stromy 8. Vyvážené a vícecestné stromy -stromy 9. ašování 10. Vyhledávání v textu efinice základních pojmů Vyhledávání hrubou silou Morris-Prattův algoritmus Knuth-Morris-Prattův algoritmus iří vorský (VŠ TUO) lgoritmy 4 / 458

O předmětu lgoritmy Úvodní přednáška doc. Mgr. iří vorský, Ph.. Katedra informatiky akulta elektrotechniky a informatiky VŠ TU Ostrava Upozornění Všechny informace k předmětu naleznete na webu http://www.cs.vsb.cz/dvorsky/ Tento web je průběžně aktualizován. Tato prezentace slouží jen pro účely úvodní přednášky a nebudu ji následně aktualizovat. iří vorský (VŠ TUO) Úvodní přednáška 5 / 458 iří vorský (VŠ TUO) Úvodní přednáška 6 / 458 O předmětu lgoritmy Prerekvizity Předmět je pokračováním předmětu lgoritmy. lavní náplní předmětu jsou datové struktury a související algoritmy. V předmětu budou využívány znalosti z předmětu Programování objektově orientované programování. Probírané algoritmy a datové struktury budou demonstrovány v jazyce ++. Nemalý důraz je kladen na praktickou implementaci probíraných algoritmů a datových struktur. Studenti jsou vedeni k analýze algoritmizovaných problémů a k syntéze řešení z menších celků. Prerekvizity jsou soubor nutných podmínek, které musí student splňovat, aby si mohl daný předmět zapsat. Poznámky: Předmět lgoritmy má jako prerekvizitu uveden v systému dison předmět lgoritmy, ale protože se jedná (L ) o povinný předmět, prerekvizity v tomto případě nehrají roli nelze studentovi znemožnit, aby si zapsal povinný předmět. inak řečeno, na lgoritmy nemá vliv jestli jste předmět lgoritmy v zimním semestru formálně ukončili s úspěchem nebo ne. Pro zvládnutí předmětu je nutné znát ++ v rozsahu předmětu lgoritmy a Programování. Znalost středoškolské matematiky. iří vorský (VŠ TUO) Úvodní přednáška 7 / 458 iří vorský (VŠ TUO) Úvodní přednáška 8 / 458

Rozsah předmětu, způsob zakončení arant předmětu Rozsah předmětu výuka probíhá v letním semestru prvního ročníku bakalářského studia, hodinová dotace: 2 hodiny přednášky a 2 hodiny cvičení týdně v prezenční formě, 6 tutoriálů v kombinované formě studia. předmět je ohodnocen 5 kredity. doc. Mgr. Kancelář: mail: Web: iří vorský, Ph.. 441 jiri.dvorsky@vsb.cz www.cs.vsb.cz/dvorsky K čemu je garant předmětu? Způsob zakončení arant předmětu zodpovídá za průběh výuky celého předmětu, průběh cvičení, plnění úkolů na cvičeních a za korektní hodnocení úkolů. Problémy spojené se cvičeními řešte primárně se svým cvičícím. Pokud se nepodaří dosáhnout řešení problému s cvičícím obracejte se na garanta předmětu. zakončení klasifikovaným zápočtem, klasifikovaný zápočet není zkouška, nejsou tři termíny jako u zkoušky, iří vorský (VŠ TUO) arant předmětu, přednášející, tutor komb. formy Úvodní přednáška 9 / 458 Konzultační hodiny iří vorský (VŠ TUO) Úvodní přednáška 10 / 458 Studenti se specifickými nároky Pokud na přednášce nebudete něčemu rozumět, potřebujete poradit nebo vyřešit nějaký problém s přednáškou, cvičeními, testy, Vaší absencí na výuce atd. je možné využít konzultační hodiny. V tento čas jsem připraven věnovat se Vám osobně. Termín konzultačních hodin je uveřejněn mým webových stránkách. Žádám Vás ale o dodržení několika pravidel: 1. Konzultaci je nutné si domluvit předem, nejlépe emailem. 2. Pokud potřebujete poradit s učivem, přineste si s sebou materiály, které jste si k tématu prostudovali, vypište si co je Vám jasné a kde jste se zasekli a potřebujete poradit. Rozhodně neplatí myšlenka: á k němu přijdu na konzultaci, on si o mě bude myslet, že jsem úplně blbej a u zápočtu mě vyhodí. entrum Slunečnice http://slunecnice-fei.vsb.cz/, poskytování služeb a podpory zpřístupňující studium i pro studenty se specifickými nároky, lze získat, mimo jiné, zvýšenou časovou dotaci na úkoly. Výzva e vysoce žádoucí, aby studenti, kteří dostanou tuto zvýšenou časovou dotaci, neprodleně kontaktovali svého cvičícího a garanta předmětu, abychom předešli případným problémům! Přijdte se zeptat rovnou ke zdroji informací internetová fóra jsou zaplevelena různými polopravdami i naprostými nesmysly. iří vorský (VŠ TUO) Úvodní přednáška 11 / 458 iří vorský (VŠ TUO) Úvodní přednáška 12 / 458

lgoritmy výuka, úkoly a jejich hodnocení Specifika výuky, úkolů a jejich hodnocení pro různé formy studia prezenční a kombinované studium má specifickou formu výuky, obě formy studia mají specifické podmínky pro splnění předmětu, podle formy Vašeho studia se Vás týká pouze jedna ze dvou následujících částí prezentace. Prezenční forma studia iří vorský (VŠ TUO) Úvodní přednáška 13 / 458 iří vorský (VŠ TUO) Úvodní přednáška 14 / 458 Přednášky Stručná osnova přednášek Každé pondělí od 12:30 do 14:00, učebna N1. sou nepovinné, nicméně účast se doporučuje. Slouží především k výkladu učiva, k převedení ukázkových příkladů, jejich typických řešení atd. Na Vaše případné dotazy jsem schopen odpovídat v konzultačních hodinách. 0. Úvodní přednáška organizační záležitosti, souhrn nutných znalostí z předmětu lgoritmy 1. Lineární datové struktury abstraktní datové struktury, zásobník, fronta, seznam 2. ynamická alokace paměti pointery, operátory reference, dereference, alokování a dealokování paměti 3. Spojová implementace lineárních datových struktur využití OOP a dynamicky alokovaných struktur 4. rafy základní pojmy, graf jako datová struktura, možnosti implementace grafu 5. lgoritmy průchodů grafem průchod grafu do hloubky a do šířky, aplikace průchodu grafem 6. inární vyhledávací stromy základní pojmy, vyhledávání iří vorský (VŠ TUO) Úvodní přednáška 15 / 458 iří vorský (VŠ TUO) Úvodní přednáška 16 / 458

Stručná osnova přednášek (pokrač.) vičení 7. inární vyhledávací stromy vkládání, rušení vrcholů, průchody stromem 8. Vyvážené a vícecestné stromy VL-stromy, red-black stromy. -stromy 9. ašování hašovací tabulky, metody řešení kolizí 10. Vyhledávání v textu vyhledávání jednoho a více vzorků, elementární lexikální analýza textu 11. ednoduchý překladač překlad aritmetických a logických výrazů, postfixová notace a její interpretace pomocí zásobníku 12. Techniky řešení problémů rozděl a panuj, žravý algoritmus, dynamické programování Náplní cvičení je průběžné hodnocení aktivity studentů a implementace jednoho až dvou příkladů vztahujících se k probíranému učivu. Ve cvičeních, kde je naplánována obhajoba projektu průběžný test znalostí neprobíhá, ani neprobíhá implementace příkladů. elé cvičení je věnováno obhajobě projektů. Ve cvičeních je také možné konzultovat probírané učivo. Všechna pondělní cvičení se považují za příslušná k následujícímu týdnu. inak řečeno, studenti mající cvičení v pondělí odpovídají na otázky průběžného testu až následující týden. Rozdělení do cvičení, tak jak je uvedeno v informačním systému dison, je nutné respektovat. Není možné překračovat kapacitu cvičení. Veškeré přesuny je nutné mít zaznamenány v systému dison. iří vorský (VŠ TUO) Úvodní přednáška 17 / 458 iří vorský (VŠ TUO) Úvodní přednáška 18 / 458 vičení Úkoly Upozornění vičení nenahrazuje přednášku! Neočekávejte, že pokud nebudete chodit na přednášky, tak Vám cvičící na cvičeních bude dělat jakousi bleskovou náhradní přednášku, abyste se vůbec mohli pustit do příkladů, jejichž řešení se na cvičení předpokládá. ývá dobrým zvykem, že studenti se na cvičení aspoň minimálně připraví. Není nutné látku precizně ovládat, ale je nutné se orientovat v základních pojmech. inak cvičení nemají smysl. V průběhu semestru a ve zkouškovém období budete plnit tyto úkoly: 1. Průběžné hodnocení cvičení 2. Semestrální projekt 3. Závěrečná písemná práce iří vorský (VŠ TUO) Úvodní přednáška 19 / 458 iří vorský (VŠ TUO) Úvodní přednáška 20 / 458

Průběžné hodnocení cvičení Přednášky a odpovídající hodnocená cvičení Na deseti hodnocených cvičeních bude každý student cvičím hodnocen za následující aktivity: 1. průběžný test znalostí (znám též jako pešek ), 2. aktivita při plnění úkolů na cvičení a 3. splnění domácích úkolů zadaných cvičícím. Za každé hodnocené cvičení lze získat 0 až 2 body. ednou získané bodové hodnocení není možné měnit - pokud například student získá z některého cvičení nulu, je výsledek definitivní. Studenti, kteří se ze cvičení omluví se dohodnou se cvičícím na přiměřeném splnění hodnocených aktivit. V tomto případě lze hodnotit průběžný test znalostí, případně splnění domácích úloh, aktivitu na cvičení už samozřejmě hodnotit nelze. Za neomluvené absence na cvičeních je 0 bodů. Týden Pondělí Sada otázek Ve cvičení se zkouší Projekty z přednášky sada otázek 1 12. února 2 19. února 1 1 3 26. února 2 2 4 05. března 3 3 5 12. března 4 4 Zadání projektů 1 6 19. března 5 5 7 26. března 6 6 8 02. dubna Velikonoce Zadání projektů 2 Obhajoba projektů 1 9 09. dubna 7 7 10 16. dubna 8 8 11 23. dubna 9 Zadání projektů 3 Obhajoba projektů 2 12 30. dubna 10 9 13 07. května 10 14 14. května Závěrečná písemka Obhajoba projektů 3 iří vorský (VŠ TUO) Úvodní přednáška 21 / 458 iří vorský (VŠ TUO) Úvodní přednáška 22 / 458 Semestrální projekt V průběhu semestru každý student vypracuje semestrální projekt. Zadání témat, vypracování a obhajoby proběhnou ve třech dávkách. Každé dávky se zúčastní třetina studentů. Na webu předmětu bude zveřejněno rozdělení studentů do dávek a odpovídající zadání. Tři cvičení během semestru budou věnována obhajobám projektů. Na každém z těchto tří cvičení vystoupí určená třetina studentů se svým projektem a seznámí cvičícího a své spolužáky s řešením zadaného projektu. Odevzdání projektu proběhne prostým přinesením projektu na cvičení, není nutné projekt zasílat dopředu. Pokud vznikne pochybnost o autorství projektu, obhajoba bude hodnocena 0 body. Oprava bude realizována formou realtime testu ve zkouškovém období. iří vorský (VŠ TUO) Úvodní přednáška 23 / 458 Závěrečná písemná práce Závěrečná písemná práce se bude psát ve zkouškovém období. ude zaměřena především na teoretické znalosti, a částečně také na schopnost vysvětlit ukázku kódu v ++ a naopak napsat jednoduchou ukázku kódu v ++ podle slovního či matematického zadání. U závěrečné písemné práce si termín volíte sami tím, že se na něj přihlásíte v disonu. Takto zvolený termín je pro Vás závazný v okamžiku, kdy je systémem ukončeno přihlašování. V opačném případě je termín hodnocen automaticky 0 body. Opravný termín vám už nebude poskytnut. Opravný termín na závěrečnou písemnou práci je poskytován jen těm studentům, kteří u svého prvního pokusu získali aspoň 10 bodů. Počet bodů na prvním termínu Opravný termín 0 až 9 N 10 až 20 NO více než 21 není nutný, úspěch iří vorský (VŠ TUO) Úvodní přednáška 24 / 458

Závěrečná písemná práce (pokrač.) odnocení úkolů Obdobná povinnost omluvit se platí i pro opravný termín. U všech úkolů jste povinni se, na požádání učitele, prokázat svou studentskou kartou nebo jiným oficiálním dokladem totožnosti. Předmět je ukončen klasifikovaným zápočtem. Nevztahuje se tudíž na něj požadavek dvou opravných pokusů, jak to vyžaduje studijní řád u zkoušky. Proč nepovolovat opravný termín Pokud někteří studenti nepovažují za nutné se na písemnou práci aspoň trochu připravit, já zase nepovažuji za nutné s těmito studenty ztrácet čas opravováním jejich písemek, či spíše výtvorů! Pro úspěšné absolvování předmětu je nutné splnit všechny výše uvedené úkoly, a zároveň u všech úkolů aspoň minimální počet bodů. Minimální body Maximální body Průběžný test znalostí 10 20 Obhajoba projektu 21 40 Písemná práce 20 40 elkem 51 100 iří vorský (VŠ TUO) Úvodní přednáška 25 / 458 iří vorský (VŠ TUO) Úvodní přednáška 26 / 458 Konec části pro prezenční formu studia Kombinovaná forma studia iří vorský (VŠ TUO) Úvodní přednáška 27 / 458 iří vorský (VŠ TUO) Úvodní přednáška 28 / 458

Tutoriály Tutoriály (pokrač.) 1. tutoriál 16. února 2018 Na tomto úvodním soustředění Vám budou sděleny informace o organizaci studia předmětu a informace o náplni předmětu. Souhrn nutných znalostí z předmětu lgoritmy. 2. tutoriál 2. března 2018 K tomuto datu se předpokládá zvládnutí následujících témat: bstraktní datové struktury. Zásobník, fronta, seznam. bstraktní datové struktury s využitím OOP. 3. tutoriál 16. března 2018 K tomuto datu se předpokládá zvládnutí následujících témat: rafy. raf jako datová struktura. Možnosti implementace grafu. Průchod grafu do hloubky a do šířky. plikace průchodu grafem. 4. tutoriál 6. dubna 2018 povinný tutoriál K tomuto datu se předpokládá zvládnutí následujících témat: inární stromy, vkládání, rušení vrcholů, průchody stromem. inární stromy, definice, vyhledávání. inární stromy, vkládání, rušení vrcholů, průchody stromem. Na tomto tutoriálu proběhne první test. iří vorský (VŠ TUO) Úvodní přednáška 29 / 458 iří vorský (VŠ TUO) Úvodní přednáška 30 / 458 Tutoriály (pokrač.) Tutoriály (pokrač.) 5. tutoriál 21. dubna 2018 povinný tutoriál Tento tutoriál je rozdělen do několika skupin, tutoriál proběhne na počítačové učebně, celou náplň tutoriálu bude tvořit druhý test. 6. tutoriál 4. května 2018 Není 7. tutoriál 18. května 2018 povinný tutoriál K tomuto datu se předpokládá zvládnutí následujících témat: Vyvážené binární stromy. -stromy. ašování. Konzultace k projektu. iří vorský (VŠ TUO) Úvodní přednáška 31 / 458 iří vorský (VŠ TUO) Úvodní přednáška 32 / 458

Úkoly a jejich hodnocení Úkoly a jejich hodnocení (pokrač.) První test První test se bude psát na tutoriálu 6. dubna 2018. ude to krátký písemný test na cca 10 až 15 minut maximálně. ruhý test ruhý test se bude psát na tutoriálu 21. dubna 2018. Opravný termín bude ve zkouškovém období. Na začátku vymezené doby dostanete zadání, které ve zbývajícím čase naprogramujete, odladíte a předvedete. Projekt Koncem března budou na webu tutora zveřejněna zadání projektů a jejich rozdělení mezi studenty. eadline pro odevzdání projektu je 20. května 2018 23:59. Podrobné pokyny k odevzdání budou zveřejněny se zadáním. Ve zkouškovém období proběhne obhajoba. Termíny budou vypsány v systému dison. K obhajobě projektu není opravný termín. Zásadním kritériem pro úspěšnou obhajobu je funkční program. iří vorský (VŠ TUO) Úvodní přednáška 33 / 458 iří vorský (VŠ TUO) Úvodní přednáška 34 / 458 odnocení úkolů Obecné poznámky k úkolům nutno splnit všechny výše uvedené úkoly, a zároveň u všech úkolů aspoň minimální počet bodů, bodové hodnocení konkrétní úlohy pro konkrétního studenta je uloženo v systému dison. Minimální počet bodů Maximální počet bodů První test 10 20 ruhý test 10 20 Projekt 31 60 elkem 51 100 Na všechny oba testy a obhajobu projektu budou v disonu vypsány řádné termíny, kde se budete hlásit. bsolvování prvního a druhého testu v řádném termín tj. na příslušném tutoriálu je povinné. Pokud se řádného termínu testu nezúčastníte, bez ohledu na to zda jste byli přihlášeni nebo ne, je vaší povinností se garantovi předmětu předem omluvit. Termín předem znamená nejpozději do začátku termínu, na kterém máte daný test psát. Postačující je omluva emailem na adresu garanta předmětu. Pokud se neomluvíte, daný úkol bude považován za nesplněný (0 bodů) a opravný termín vám nebude umožněn. ůsledkem je pak neúspěšné ukončení celého předmětu. Pokud se řádného termínu zúčastníte a neuspějete s řešením zadaného úkolu, máte nárok na opravný termín. iří vorský (VŠ TUO) Úvodní přednáška 35 / 458 iří vorský (VŠ TUO) Úvodní přednáška 36 / 458

Obecné poznámky k úkolům (pokrač.) Obdobná povinnost omluvit se platí i pro opravný termín. Opravné termíny budou vypsány ve zkouškovém období. K obhajobě projektu opravný termín není. U všech úkolů jste povinni se prokázat svou studentskou kartou nebo jiným oficiálním dokladem totožnosti (občanský průkaz, řidičský průkaz, cestovní pas). ez prokázání totožnosti Vám nebude výsledek započítán. ále připomínám, že každý prohřešek vůči studijnímu řádu u testů a písemné práce bude nekompromisně postihován. de především o opisování, plagiátorství, a záměnu studentů (pošlete na test někoho jiného místo sebe). Konec části pro kombinovanou formu studia iří vorský (VŠ TUO) Úvodní přednáška 37 / 458 iří vorský (VŠ TUO) Úvodní přednáška 38 / 458 Software pro výuku Vývojová prostředí pro ++ Primární software: Vývojové prostředí pro ++ okumentace k ++ oplňkový software: okumentační systém oxygen, www.doxygen.org Typografický systém L TX, www.cstug.cz Microsoft Visual Studio 2015 (VS2015): pro výukové účely zcela legálně a zadarmo, image instalačních disků lze stáhnout z Microsoft reamspark for cademic nstitutions, elms.cs.vsb.cz instalace včetně dokumentace Microsoft eveloper Network, msdn.microsoft.com, alternativou je tzv. ommunity dition, ke stažení přímo od Microsoftu. iří vorský (VŠ TUO) Úvodní přednáška 39 / 458 iří vorský (VŠ TUO) Úvodní přednáška 40 / 458

Studijní literatura Učební materiály lze rozdělit do dvou skupin: literatura o programovacím jazyku ++, literatura o algoritmech a datových strukturách. Níže uvedenou literaturu využijete v předmětech: lgoritmy a lgoritmy, Programování a Programování. iří vorský (VŠ TUO) Úvodní přednáška 41 / 458 Základní literatura o ++ O jazyce ++, který je naším hlavním tématem, existuje v dnešní době řada česky psaných knih. Následující knihy můžete využít pro své studium: 1. Liberty., ones. L.: Naučte se ++ za 21 dní, 2. aktualizované vydání, omputerpress, 2007, SN 978-80-251-1583-1. Zdařilá učebnice jazyka ++. Kniha je sice poněkud tlustá, nicméně je rozdělena do 21 lekcí rozumného rozsahu. Pokrývá veškerou látku, kterou bychom měli za oba semestry probrat. 2. ckel.: Myslíme v jazyku ++, rada Publishing, 2000, SN 80-247-9009-2. Kniha od klasika ve výuce jazyka ++. Opět pokrývá veškerou látku, kterou bychom měli za oba semestry probrat.. Kniha je dostupná v angličtině i online na serveru http://www.mindviewinc.com/ndex.php 3. Stroustrup,.: ++ Programovací jazyk. Česky: N-technická literatura, Praha 1997. Vynikající kniha přímo od autora jazyka ++. Kniha dosti rozsáhlá, ale na druhou stranu obsahující naprosto vše co lze o ++ napsat. iří vorský (VŠ TUO) Úvodní přednáška 42 / 458 oplňková literatura o ++ ále je možné čerpat zajímavé informace z následujících knih: 1. Virius M.: Pasti a propasti jazyka ++, 2. aktualizované a rozšířené vydání, omputerpress, 2005, SN 80-251-0509-1. V této knize naleznete podrobné vysvětlení, pro začátečníka mnohdy překvapivého chování překladače jazyka ++. 2. lexandrescu.: Moderní programování v ++ Šablony, generické komponenty a návrhové vzory, omputerpress 2004, SN 80-251-0370-6. Pro ty z Vás, kteří se hodlají dozvědět něco o trendech ve využití jazyka ++, nabízí tato kniha rozšiřující informace. Pozor, nejedná se přímo o učebnici jazyka ++. 3. Koenig., Moo..: Rozumíme ++, omputerpress, 2003, SN 80-7226-656-X. lternativní učebnice jazyka ++ s odlišnou metodou výkladu než předchozí doporučené. Výuka je vedena přes využití knihoven jazyka ++, okamžitý nástup objektového programování atd. iří vorský (VŠ TUO) Úvodní přednáška 43 / 458 Ostatní literatura o ++ 1. Šaloun, P.: Programovací jazyk ++ pro zelenáče, Neocortex Praha, 2005, SN 80-86330-18-4. 2. Richta, K., Šaloun, P.: Programovací jazyk, skriptum ČVUT, Praha 1998 3. Šaloun, P.: Programovací jazyk. Skriptum VŠ-TU Ostrava 1994 4. Kernighan,., Ritchie,.: Programovací jazyk, lfa ratislava, 1988 5. erout, P., Rudolf, V., Šmrha, P.: programátora v jazyce, nakladatelství KOPP, České udějovice, 1992 6. Vondrák,., Šaloun, P.: Objektově orientované programování, skriptum VŠ Ostrava, 1994 7. orstmann,. S.: Vyšší škola objektového návrhu v ++. Science, Veletiny 1997 8. Večerka,.: azyk ++: popis jazyka s příklady, skriptum UP Olomouc, Olomouc 1996, SN 80-7067-658-2 iří vorský (VŠ TUO) Úvodní přednáška 44 / 458

Základní literatura o algoritmech oplňková literatura o algoritmech 1. Skripta lgoritmy 2. Wirth, N.: lgoritmy a štruktúry údajov, lfa, ratislava, 1989 3. Sedgewick R.: lgoritmy v, části 1-4, SoftPress, Praha, 2003. xistuje i v anglické verzi, náročná, ale vynikající kniha. 4. Wróblewski P.: lgoritmy. atové struktury a programovací techniky, omputer Press, Praha 2003, druhé vydání 2015 1. Topfer, P.: lgoritmy a programovací techniky, Prometheus, Praha 1995. 2. Virius, M.: Základy algoritmizace, ČVUT Praha, 1997, skripta. 3. onzík,. a kolektiv: Programovací techniky, VUT rno, 1987, skripta. 4. arel,.: lgorithmics, The Spirits of omputing, ddison-wesley Publishing ompany, 1993. 5. ormen, Leiserson, Rievest: ntroduction to lgorithms, MT Press, 2001. 6. Sedgewick, R.: lgorithms in ++, ddison-wesley Publishing ompany, 1992. 7. Wood,.: ata Structures, lgorithms and Performance, ddison-wesley Publishing ompany, 1993. iří vorský (VŠ TUO) Úvodní přednáška 45 / 458 iří vorský (VŠ TUO) Úvodní přednáška 46 / 458 Ostatní učební materiály Prezentace z přednášek Prezentace z přednášek nejsou studijním materiálem. Slouží přednášejícímu jako osnova jeho výkladu a studentům jako přehled probrané látky. Pročtení těchto několika prezentací není možné považovat za dostatečnou přípravu k tomu slouží studijní literatura a hlavně vlastní, samostatné programování. ěkuji za pozornost alší materiály budou případně doplněny na webových stránkách předmětu. iří vorský (VŠ TUO) Úvodní přednáška 47 / 458 iří vorský (VŠ TUO) Úvodní přednáška 48 / 458

atové struktury Lineární datové struktury doc. Mgr. iří vorský, Ph.. Katedra informatiky akulta elektrotechniky a informatiky VŠ TU Ostrava určitý způsob ukládání a organizace dat v počítači, cílem je efektivní manipulace s daty, specializace na různé úlohy, obsaženy v takřka každém programu, efektivní datová struktura je základem pro efektivní algoritmy, implementace datové struktury vyžaduje implementaci příslušných operací, abstraktní datový typ matematická abstrakce datové struktury. iří vorský (VŠ TUO) Lineární datové struktury 49 / 458 iří vorský (VŠ TUO) Lineární datové struktury 50 / 458 atové struktury specializace atové struktury význam datové struktury jsou přizpůsobeny pro odlišné druhy aplikací -stromy základ implementace SQL databází hašovací tabulky ukládání informací o identifikátorech při kompilaci zdrojového kódu zásobník volání funkcí, interpretace aritmetických výrazů základní stavební kámen softwarových systémů obvykle je efektivní datová struktura klíčem k efektivnímu algoritmu! klíčový faktor v softwarovém inženýrství iří vorský (VŠ TUO) Lineární datové struktury 51 / 458 iří vorský (VŠ TUO) Lineární datové struktury 52 / 458

atové struktury vs. bstraktní datové typy Zásobník (Stack) implementace datové struktury vede k implementaci operací, které vytváří a manipulují s instancemi dané struktury, efektivitu datové struktury nelze oddělit od efektivity implementovaných operací jak tedy datovou strukturu implementovat? co je rozhodující? jaké jsou limity možností? abstraktní datový typ (T) teoretická definice, plus popis operací datová struktura je konkrétní implementací T například T zásobník (stack) lze implementovat mnoha způsoby harakteristika princip last-in, first-out, LO prvek, který byl vložen poslední, je jako první ze zásobníku vyzvednut tributy prvky vkládáme na tzv. vrchol zásobníku (stack pointer). Ukazatel zásobníku není nutně ukazatel ve smyslu práce s dynamicky alokovanou pamětí, haldou. prvně vložený prvek se nazývá dno zásobníku (stack bottom) iří vorský (VŠ TUO) Lineární datové struktury 53 / 458 iří vorský (VŠ TUO) Lineární datové struktury 54 / 458 2. přednáška Zásobník, pokračování Zásobník operace Základní pojmy Řídící struktury atové typy Lineární datové struktury Zásobník, pokračování Operace Push vložení prvku na vrchol zásobníku Pop vyjmutí prvku z vrcholu zásobníku smpty test prázdnosti zásobníku Top vrátí prvek z vrcholu zásobníku bez jeho vyjmutí Operace mají konstantní časovou složitost. Push(15) Push(17) Pop() a) Push(15); Push(6); Push(3) Push(2); Push(9); b) Push(17); Push(2) Push(3); c) Pop(); Push(9) hybové stavy Pokud provedeme operaci Pop na prázdném zásobníku nastává tzv. podtečení (stack underflow). Pokud není možné přidat další prvek, nastává tzv. přetečení (stack overflow). Úvod do programování c2005 Michal Krátký, iří vorský 30/34 iří vorský (VŠ TUO) Lineární datové struktury 55 / 458 iří vorský (VŠ TUO) Lineární datové struktury 56 / 458

Zásobník, pokračování Zásobník, příklad Využití zásobníku volání funkcí (metod) vyhodnocování aritmetických výrazů odstranění rekurze zásobníkově orientované jazyky, například PostScript, P testování parity závorek, TML/XML značek Testování parity závorek testovat správnost uzávorkování různé typy závorek levé závorky vkládáme do zásobníku při nalezení pravé otestujeme, zda máme v zásobníku odpovídající závorku musíme končit s prázdným zásobníkem, jinak chyba iří vorský (VŠ TUO) Lineární datové struktury 57 / 458 iří vorský (VŠ TUO) Lineární datové struktury 58 / 458 Zásobník ronta (Queue) mplementační problémy ak mít v kódu (jedné funkci) více zásobníků? ak zabránit, aby mohl kdokoliv v zásobníku něco měnit? Ochrana vnitřních dat. Lze implementovat zásobník, který by se dynamicky zvětšoval? Nešlo by vyrobit zásobník jako součástku? Třeba udělat z něj datový typ s definovanými operacemi? Potřebuji mít v programu zásobník čísel a znaků. To ho musím naimplementovat dvakrát? Nešlo by mít zásobník jako šablonu? harakteristika princip first-in, first-out, O prvek, který byl vložen první, je také jako první z fronty vyzvednut tributy první prvek se nazývá hlava fronty (head), poslední prvek se nazývá ocas fronty (tail). iří vorský (VŠ TUO) Lineární datové struktury 59 / 458 iří vorský (VŠ TUO) Lineární datové struktury 60 / 458

ronta, pokračování ronta, pokračování Operace Put vložení prvku za ocas fronty, tato operace se někdy nazývá také nqueue, et vyjmutí prvku z hlavy fronty, tato operace se někdy nazývá také equeue, smpty test prázdnosti fronty. Operace mají konstantní časovou složitost. hybové stavy Pokud provedeme operaci et na prázdné frontě nastává tzv. podtečení (queue underflow). Pokud není možné přidat další prvek, nastává tzv. přetečení (queue overflow). Využití fronty tisková fronta u sdílené tiskárny, plánovač v operačním systému (více běžících procesů na jednoprocesorovém počítači procesy se musí střídat), obsluha uživatelů na serverech obecně iří vorský (VŠ TUO) Lineární datové struktury 61 / 458 iří vorský (VŠ TUO) Lineární datové struktury 62 / 458 ronta, příklad ronta implementace Plánovač operačního systému cyklická obsluha (round robin) Tato část OS přiděluje jednotlivým procesům sdílený procesor: vybere z fronty čekajících procesů první proces, obnoví registry procesoru, spustí obnovený proces, po uplynutí vymezeného časového kvanta, zahájí odebírání procesoru, uloží obsah registrů zařadí tento proces na konec fronty, vybere z fronty čekajících procesů první proces... Způsoby implementace pomocí dynamické alokace paměti, pomocí pole hlava fronty na prvním prvku v poli, jednoduché přidávání prostě na konec, odebírání z fronty posunovat všechny prvky dopředu?! řešení kruhový buffer (circular buffer)! iří vorský (VŠ TUO) Lineární datové struktury 63 / 458 iří vorský (VŠ TUO) Lineární datové struktury 64 / 458

ronta, implementace kruhovým bufferem ronta, implementace kruhovým bufferem harakteristika jeden index ukazuje na hlavu fronty, jeden index ukazuje na ocas fronty, při vložení a vyjmutí prvku se indexy posunují o jedničku dál, při překročení počtu prvků v bufferu se indexy vrací na první pozici tj. 0 modulární aritmetika Problém - jak se pozná plná a prázdná fronta? Ocas ukazuje vždy na první volnou pozici ve frontě. edna pozice je udržována volná tj. v poli o N prvcích lze implementovat frontu velikosti N 1. iří vorský (VŠ TUO) Lineární datové struktury 65 / 458 iří vorský (VŠ TUO) Lineární datové struktury 66 / 458 Seznam (List) Seznam jednosměrný seznam harakteristika obecná lineární datová struktura, tributy operace nejsou striktně určeny, lze implementovat množinu, mnoho variant. první prvek seznamu se nazývá hlava seznamu (head), další prvky závisí na konkrétní implementaci. složen z položek, položky obsahují data a odkaz na další položku, každá položka ví pouze o svém následovníku, k položkám lze přistupovat sekvenčně, přímý přístup k položkám jako v poli je problém, nutno projít cyklem, pohyb seznamem dozadu je také problém, jak poznáme konec seznamu speciální odkaz nikam, většinou pojmenován nil, NULL, Nothing. iří vorský (VŠ TUO) Lineární datové struktury 67 / 458 iří vorský (VŠ TUO) Lineární datové struktury 68 / 458

Seznam, varianty Seznam pokračování jednosměrný seznam nejjednodušší varianta obousměrný seznam položka obsahuje odkaz na předchůdce i následníka, kruhový seznam začátek a konec seznamu splývají, Využití seznamu obecná datová struktura, dynamicky se měnící kolekce prvků, čili kdekoliv, například velice primitivní databáze. iří vorský (VŠ TUO) Lineární datové struktury 69 / 458 iří vorský (VŠ TUO) Lineární datové struktury 70 / 458 Obousměrný seznam implementace Obousměrný seznam alokace paměti Způsoby implementace pomocí dynamické alokace paměti, pomocí pole otázka jak alokovat nové prvky? Položka seznamu 1 struct Listtem 2 { 3 int Value; 4 int Prev; 5 int Next; 6 }; Vlastní seznam 1 struct Listnrray 2 { 3 Listtem ata[listsize]; 4 int ead; 5 int ree; 6 int urrent; 7 }; arbagge ollector () mechanismus pro sběr nepoužívané paměti, volného místa, na první volnou pozici ukazuje index ree, v nepoužívaných položkách seznamu je využita složka Next, která odkazuje na další volný prvek, při alokaci položky si vezmeme první volnou pozici a ree posuneme přes Next na další volnou pozici, při dealokaci vložíme uvolňovanou pozici k ree, se tedy chová jako zásobník volného místa. iří vorský (VŠ TUO) Lineární datové struktury 71 / 458 iří vorský (VŠ TUO) Lineární datové struktury 72 / 458

Obousměrný seznam průchod seznamem Kontrolní otázky terátor obecný mechanismus pro průchod datovou strukturou, matematicky řečeno pro všechny prvky datové struktury proveď, funkce void Reset nastaví iterátor na první prvek, funkce bool MoveNext posune iterátor na další prvek. Vrací true, při úspěšném posunu, jinak vrací false, funkce T urrent vrací data z aktuálního prvku. 1. Vysvětlete co znamená, že zásobník představuje paměť typu LO. 2. o je to vrchol zásobníku? o je to dno zásobníku? 3. aká je teoreticky kapacita zásobníku? 4. o je to přetečení zásobníku? o je to podtečení zásobníku? 5. ak se typicky nazývá operace vložení prvku do zásobníku? Popište tuto operaci. 6. ak se typicky nazývá operace vyjmutí prvku ze zásobníku? Popište tuto operaci. 7. Závisí složitost operací na počtu prvků v zásobníku? no či ne? 8. Uveďte příklady použití zásobníku. 9. o zásobníku vložím prvky v pořadí,,,. Potom je budu ze zásobníku vyjímat. akou dostanu posloupnost? 10. Vysvětlete co znamená, že fronta představuje paměť typu O. iří vorský (VŠ TUO) Lineární datové struktury 73 / 458 iří vorský (VŠ TUO) Lineární datové struktury 74 / 458 Kontrolní otázky (pokrač.) 11. o je to hlava fronty? o je to ocas fronty? 12. Závisí složitost operací na počtu prvků ve frontě? no či ne? 13. o je to přetečení fronty? o je to podtečení fronty? 14. o fronty vložím prvky v pořadí,,,. Potom je budu z fronty vyjímat. akou dostanu posloupnost? 15. ak se typicky nazývá operace vložení prvku do fronty? Popište tuto operaci. 16. ak se typicky nazývá operace vyjmutí prvku ze fronty? Popište tuto operaci. 17. Uveďte příklady použití fronty. 18. Popište hlavní problémy při implementaci fronty v poli. ak je lze řešit pomocí kruhové reprezentace fronty? 19. aký je rozdíl mezi frontou, zásobníkem a seznamem? Zaměřte se na operace vkládání a vyjímání prvků z těchto struktur. Kontrolní otázky (pokrač.) 20. o je to hlava seznamu, ocas seznamu? 21. Rozdíl mezi jednosměrným, obousměrným a kruhovým seznamem. 22. Popište algoritmus vyhledávání daného prvku v seznamu? 23. Lze využít algoritmus půlení intervalu pro vyhledávání v seznamu? aký je tu hlavní problém? 24. o je to garbage collector? 25. o je to iterátor? iří vorský (VŠ TUO) Lineární datové struktury 75 / 458 iří vorský (VŠ TUO) Lineární datové struktury 76 / 458

ynamická alokace paměti ěkuji za pozornost doc. Mgr. iří vorský, Ph.. Katedra informatiky akulta elektrotechniky a informatiky VŠ TU Ostrava iří vorský (VŠ TUO) Lineární datové struktury 77 / 458 iří vorský (VŠ TUO) ynamická alokace paměti 78 / 458 Podobenství o žlutém lístečku a kastrolu s gulášem Podobenství o žlutém lístečku a kastrolu s gulášem Pravidla hry: žlutý nalepovací lísteček lísteček je volný nebo je na něm napsáno, kde je guláš nebo že guláš není psací stůl lísteček je nalepen na vašem psacím stole kastrolek s gulášem v lednici obsahuje lahodný pokrm, který lze konzumovat lednice na základě lístečku vydá guláš, bez lístečku není guláš, lednici nelze prohledávat ra samotná maminka uvaří guláš, uschová jej do lednice a synáčkovi napíše na lísteček, kde se guláš ukrývá. o můžeme říci o žlutém lístečku: žlutý lísteček určitě není guláš samotný žlutý lísteček udává nepřímo polohu guláše žlutý lísteček existuje sám o sobě, zabírá jakési malé množství paměti žlutý lísteček není v lednici, je jinde obsah žlutého lístečku prázdný, uláš je v lednici nebo uláš není! obsah žlutého lístečku si můžu opsat na jiný dva lístečky odkazují na totožný guláš na jiný oranžový lísteček si můžu napsat kde leží žlutý lísteček na zelený lísteček si můžu napsat, kde leží oranžový lísteček iří vorský (VŠ TUO) ynamická alokace paměti 79 / 458 iří vorský (VŠ TUO) ynamická alokace paměti 80 / 458

Podobenství o žlutém lístečku a kastrolu s gulášem Podobenství o žlutém lístečku a kastrolu s gulášem Lednice a kastrol s gulášem: na základě žlutého lístečku lednice vydá guláš, s gulášem lze manipulovat, například přiostřit; co se stane když si guláš vyzvednu se zeleným lístečkem? vydaný guláš můžu sníst; co když přijdu se zeleným lístečkem co když žlutý lísteček zahodím? guláš zůstane v lednici navěky na nový lísteček si můžu napsat že v lednici mám nový kastrol, na základě žlutého lístečku si vyzvednu kastrol s gulášem a naleji ho i do nového kastrolu a mám dva exempláře guláše (Tady dochází k porušení zákona zachování hmoty vytváříme guláš z ničeho) nformatický výklad podobenství: psací stůl paměťový prostor, datový segment, místo pro uložení proměnných vzniklých v době kompilace lednice paměťový prostor, halda, prostor pro dynamickou alokaci paměti kastrol s gulášem dynamicky alokovaná data žlutý lísteček ukazatel nebo-li pointer. Smyslem pointeru je nepřímá adresace. Pointer není objektem samotným (objekt ne nutně ve smyslu OOP), ale je informací, kde se objekt nalézá. iří vorský (VŠ TUO) ynamická alokace paměti 81 / 458 iří vorský (VŠ TUO) ynamická alokace paměti 82 / 458 Podobenství o žlutém lístečku a kastrolu s gulášem Podobenství o žlutém lístečku a kastrolu s gulášem Možné stavy žlutého lístečku: čistý lísteček neinicializovaný pointer, pointer se teď chová jako bežná proměnná uláš je v lednici platný odkaz na guláš, lze provést dereferenci uláš není! zvláštní, vyhrazená, hodnota. Pointer ukazuje nikam. Nelze zaměňovat s čistým lístečkem. Pointer nikam lze testovat ale nelze provést dereferenci. 1 atovytyp *ZlutyListecek; 2 int *p; 3 int *q = NULL; 4 int *r = nullptr; Uvaření nového guláše: uvaření guláše lze chápat jako dynamickou alokaci objektu v paměti alokaci provedeme operátorem new 1 struct Kastrol 2 { 3 // gulas 4 }; 5 Kastrol *ZlutyListecek = new Kastrol; iří vorský (VŠ TUO) ynamická alokace paměti 83 / 458 iří vorský (VŠ TUO) ynamická alokace paměti 84 / 458

Podobenství o žlutém lístečku a kastrolu s gulášem Podobenství o žlutém lístečku a kastrolu s gulášem Manipulace s gulášem: na základě žlutého lístečku lze získat z lednice kastrol s gulášem a s tímto gulášem manipulovat operace získání guláše se nazývá dereference, odpointrování 1 Kastrol K = *ZlutyListecek; 2 K += LzicePapriky; nebo přímo 1 *ZlutyListecek += LzicePapriky; ereference neinicializovaného pointeru nebo nullptr Neexistující objekty nelze dereferencovat! atální chyba. Likvidace guláše: likvidaci guláše (snězení, vylití) lze chápat jako delokaci objektu v paměti delokaci provedeme pomocí operátoru delete 1 delete ZlutyListecek; Memory leak Každý dynamicky alokovaný objekt musí být uvolněn z paměti! inak dojde k úniku paměti. Nepoužívané objekty za vás nikdo neuklízí. iří vorský (VŠ TUO) ynamická alokace paměti 85 / 458 iří vorský (VŠ TUO) ynamická alokace paměti 86 / 458 Podobenství o žlutém lístečku a kastrolu s gulášem Podobenství o žlutém lístečku a kastrolu s gulášem Operace s pointery: derefence na základě žlutého lístečku dostanu kastrol s gulášem, odpointrování reference získání umístění objektu, poloha guláše v lednici, výsledek lze zapsat na žlutý lísteček reference a dereference jsou inverzní operace 1 struct Kastrol 2 { 3 // nejaka data 4 }; 5 Kastrol inyotovyulas; 6 Kastrol *ZlutyListecek = &inyotovyulas; Operace s pointery: 1 Kastrol *ZlutyListecek; 2 Kastrol *ZelenyListecek; přiřazení pointerů ZelenyListecek = ZlutyListecek, ve výsledku oba lístečky ukazují na tentýž kastrol, nebo na nic, nebo mají shodnou neinicializovanou hodnotu přiřazení objektů na které pointery ukazují *ZelenyListecek = *ZlutyListecek, ve výsledku se obsah guláše přelil do dašího kastrolu iří vorský (VŠ TUO) ynamická alokace paměti 87 / 458 iří vorský (VŠ TUO) ynamická alokace paměti 88 / 458

o pointer není Pointer není adresa v paměti. no pointer musí nutně skončit jako nějaká binární hodnota, kterou lze interpretovat jako číslo. Nelze si ale představovat, že na daném bajtu v paměti bychom nějakým přístojem našli binární ekvivalent odkazovaných dat. NULL není nula ani jiné přirozené číslo. Možná konverze na int je vražedným dědictvím NS. uj! Nebrat! azyk ++ nově (od verze ++ 11) obsahuje nullptr. iří vorský (VŠ TUO) ynamická alokace paměti 89 / 458 Podobenství o kabátu v šatně na plese Situace: Vesnický hasičský, sokolský či jiný ples. Šatna, kde odevzdáváte kabáty je vybavena pojízdnými věšáky. Odevzdáte kabát a dostanete papírový lísteček s číslem napříkad 118. Po plese si na základě lístečku vyzvednete kabát. estliže se na jeden věšák vejde 20 kabátů a začaly se věšáky plnit zleva, tak by šlo usuzovat, že váš kabát 118 je na šestém věšáku osmnáctý v pořadí. Vzhledem k tomu, že si šatnářky mohou věšáky přerovnávat, tak se nedá říci, kde se věšák v vašim kabátem v šatně nachází. le víme, že na základě lístečku kabát dostanu. Zbytek je záležitost šatnářky. Šatna plní roli paměti, šatnářka je memory manager, heap manager. Přesuny věšáků stránkování paměti, virtuální paměť atd. iří vorský (VŠ TUO) ynamická alokace paměti 90 / 458 Konstantní pointery ynamická alokace pole v ++ o lze označit za konstantní: polohu a obsah. elkem mohou nastat 4 možnosti: int* p; vše proměnné const int* p; konstantní obsah int* const p; konstantní poloha const int* const p; konstantní obsah i poloha. dentifikátor pole je pointer na první prvek tohoto pole. ednorozměrné pole 1 int * = new int[5]; 2 delete []; vourozměrné pole 1 double **M = new double*[r]; 2 for (int i = 0; i < R; i++) 3 M[i] = new double[]; 4 5 for (int i = 0; i < R; i++) 6 delete[]m[i]; 7 delete []M; iří vorský (VŠ TUO) ynamická alokace paměti 91 / 458 iří vorský (VŠ TUO) ynamická alokace paměti 92 / 458

ynamická alokace dvourozměrného pole v ++ ynamická alokace dvourozměrného pole v ++ (pokrač.) M M M[0] M[1] M[2] M[3] M[4] iří vorský (VŠ TUO) ynamická alokace paměti 93 / 458 iří vorský (VŠ TUO) ynamická alokace paměti 94 / 458 ynamická alokace dvourozměrného pole v ++ (pokrač.) ynamická alokace dvourozměrného pole v ++ (pokrač.) M M M[0] M[0][0] M[0][1] M[0][2] M[0] M[0][0] M[0][1] M[0][2] M[1] M[1] M[1][0] M[1][1] M[1][2] M[2] M[2] M[3] M[3] M[4] M[4] iří vorský (VŠ TUO) ynamická alokace paměti 95 / 458 iří vorský (VŠ TUO) ynamická alokace paměti 96 / 458

ynamická alokace dvourozměrného pole v ++ (pokrač.) ynamická alokace dvourozměrného pole v ++ (pokrač.) M M M[0] M[0][0] M[0][1] M[0][2] M[0] M[0][0] M[0][1] M[0][2] M[1] M[1][0] M[1][1] M[1][2] M[1] M[1][0] M[1][1] M[1][2] M[2] M[2][0] M[2][1] M[2][2] M[2] M[2][0] M[2][1] M[2][2] M[3] M[3] M[3][0] M[3][1] M[3][2] M[4] M[4] iří vorský (VŠ TUO) ynamická alokace paměti 97 / 458 iří vorský (VŠ TUO) ynamická alokace paměti 98 / 458 ynamická alokace dvourozměrného pole v ++ (pokrač.) Možnosti předávání parametrů funkcím M M[0] M[0][0] M[0][1] M[0][2] M[1] M[1][0] M[1][1] M[1][2] M[2] M[2][0] M[2][1] M[2][2] M[3] M[3][0] M[3][1] M[3][2] M[4] M[4][0] M[4][1] M[4][2] Rozlišujeme tyto způsoby předávání parametrů: hodnotou vznik lokální kopie parametru pointerem předáváno, kopírováno, umístění objektu odkazem předáváno, kopírováno, umístění objektu. Obdoba volání pomocí pointeru, pointer samotný je před programátorem utajen kompilátorem. Předávání polí: Pole jsou vždy předávána jako pointer. void (int []) nebo void (int* ) Pozor na chování operátoru sizeof iří vorský (VŠ TUO) ynamická alokace paměti 99 / 458 iří vorský (VŠ TUO) ynamická alokace paměti 100 / 458

Možnosti předávání parametrů funkcím (pokrač.) Pointerová artimetika 1 void (int* ) 2 { 3 cout << sizeof(); 4 } 5 6 int [5]; 7 cout << sizeof(); 8 (); 1 void opyrray1(int* Sourcerray, int* estinationrray, const int N) 2 { 3 for (int i = 0; i < N; i++) 4 { 5 estinationrray[i] = Sourcerray[i]; 6 } 7 } iří vorský (VŠ TUO) ynamická alokace paměti 101 / 458 iří vorský (VŠ TUO) ynamická alokace paměti 102 / 458 Pointerová artimetika Pointerová artimetika 1 void opyrray2(int* Sourcerray, int* estinationrray, const int N) 2 { 3 int* SPtr = Sourcerray; 4 int* Ptr = estinationrray; 5 int* ndptr = Sourcerray + N; 6 while (SPtr!= ndptr) 7 { 8 *Ptr = *SPtr; 9 SPtr += 1; 10 Ptr += 1; 11 } 12 } 1 void opyrray2a(int* Sourcerray, int* estinationrray, const int N) 2 { 3 for (int *SPtr = Sourcerray, *Ptr = estinationrray; SPtr!= Sourcerray + N; *Ptr++ = *SPtr++); 4 } iří vorský (VŠ TUO) ynamická alokace paměti 103 / 458 iří vorský (VŠ TUO) ynamická alokace paměti 104 / 458

Kontrolní otázky 1. o je to pointer? aký je význam dat obsažených v pointeru? Nápověda: zaměřte se na vysvětlení pojmu nepřímého adresování. 2. ak deklarujeme pointer p na typ int? 3. ak se nazývá pointer ukazující nikam? 4. o je to operátor reference? Uveďte příklad použití. 5. o je to operátor dereference? Uveďte příklad použití. 6. Předpokládejme, že máme dánu proměnnou int a = 8; a pointer int *p;. akým způsobem zařídíte, aby pointer p ukazoval na proměnnou a? 7. Předpokládejme, že máme deklarovány dva pointery int* p; a int* q;. o se stane po vyhodnocení výrazu p = q;? 8. Předpokládejme, že máme deklarovány dva pointery int* p; a int* q;. o se stane po vyhodnocení výrazu *p = *q;? aké zde můžou nastat problémy? iří vorský (VŠ TUO) ynamická alokace paměti 105 / 458 Kontrolní otázky (pokrač.) 9. eklarujte pointer d na typ double. Proveďte alokaci paměti a dealokaci paměti. aké operátory na to použijete? 10. Máte dynamicky alokovat pole a s prvky typu int, které bude mít 20 prvků. ak to provedete? Pomocí jakého operátoru? 11. e dáno dynamicky alokované pole a s prvky typu int, které má 20 prvků. Máte toto pole dealokovat. ak to provedete? Pomocí jakého operátoru? 12. Máte za úkol dynamicky alokovat dvourozměrné pole a, které bude bude mít R řádků a S sloupců. Prvky budou typu int. ak bude vypadat deklarace pointeru na takové pole? ak se provede jeho alokace v paměti? Lze to provést jednorázovou alokací? 13. Máte za úkol uvolnit z paměti, dealokovat, dvourozměrné pole a, které má R řádků a S sloupců. Prvky jsou typu int. ak to provedete? Lze to provést jednorázovou dealokací? iří vorský (VŠ TUO) ynamická alokace paměti 106 / 458 Kontrolní otázky (pokrač.) 14. Máte pointer daný následující deklarací int* p;. o je na tomto pointeru konstantního a co proměnného? 15. Máte pointer daný následující deklarací const int* p;. o je na tomto pointeru konstantního a co proměnného? 16. Máte pointer daný následující deklarací int* const p;. o je na tomto pointeru konstantního a co proměnného? 17. Máte pointer daný následující deklarací const int* const p;. o je na tomto pointeru konstantního a co proměnného? 18. Popište tři způsoby předávání parametru do funkce. 19. o funkce předáváte pole pomocí pointeru. Ve funkci na takto předané pole (na parametr z hlavičky funkce) aplikujete operátor sizeof? aký výsledek dostanete? Kontrolní otázky (pokrač.) 20. aké operace jsou povoleny provádět s pointery v pointerové aritmetice? Za jakého předpokladu mají tyto operace smysl? Nápověda: Mají tyto operace smysl pokud pointery ukazují na libovolné místo v paměti? Nebo musí být s něčím svázány? 21. ak je možné chápat pole z pohledu pointeru? o vlastně z tohoto pohledu představuje identifikátor pole? 22. Máte dáno pole int a[10]; a ukazatel int* p = a;. Čemu odpovídá výraz *(p+3)? 23. Máte dáno pole int a[10]; a ukazatel int* p = a;. Kam bude ukazovat pointer p po vyhodnocení výrazu p+=2;? 24. Máte dva pointery int *p, *q;. aký je smysl výrazu p == q? 25. Máte dáno pole int a[10]; a dva ukazatele int *p, *q;. Oba tyto ukazatele ukazují na některý prvek v poli a;. aký je smysl výrazů p-q a *p-*q? iří vorský (VŠ TUO) ynamická alokace paměti 107 / 458 iří vorský (VŠ TUO) ynamická alokace paměti 108 / 458

Spojová implementace lineárních datových struktur ěkuji za pozornost doc. Mgr. iří vorský, Ph.. Katedra informatiky akulta elektrotechniky a informatiky VŠ TU Ostrava iří vorský (VŠ TUO) ynamická alokace paměti 109 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 110 / 458 Položka seznamu atová reprezentace seznamu 8 struct Listtem 9 { 10 string Value; 11 Listtem* Prev; 12 Listtem* Next; 13 }; Prev Value Next 15 struct List 16 { 17 Listtem* ead; 18 Listtem* Tail; ead 19 }; Tail iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 111 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 112 / 458

nicializace prázdného seznamu nicializace seznamu jedním prvkem 3 void nit(list& L) 4 { 5 L.ead = nullptr; 6 L.Tail = nullptr; 7 } ead Tail 9 void nit(list& L, const string& nitvalue) 10 { 11 nternalreatesinglelementlist(l, nitvalue); 12 } nicializaci převedeme na volání další, interní, funkce vytvoření seznamu s jediným prvkem se totiž v kódu několikrát opakuje. iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 113 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 114 / 458 Vytvoření seznamu s jediným prvkem Vložení položky do seznamu 225 void nternalreatesinglelementlist(list& L, const string& NewValue) 226 { 227 L.ead = L.Tail = new Listtem; 228 L.ead->Value = NewValue; 229 L.ead->Prev = nullptr; 230 L.ead->Next = nullptr; 231 } T 25 Vložení položky do seznamu můžeme rozdělit na dvě fáze: 1. alokace nové položky v paměti a 2. zapojení nové položky do struktury seznamu navázání vazeb mezi stávajícími položkami a novou položkou. Zde mohou nastat celkem čtyři situace, podle toho kam novou položku vkládáme: 2.1 před hlavu seznamu funkce Prepend, 2.2 za ocas fronty funkce ppend, 2.3 před danou položku funkce nsertefore a 2.4 za danou položku funkce nsertfter. iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 115 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 116 / 458

Vložení položky do seznamu před hlavu seznamu Zde mohou nastat dvě situace: 1. seznam je prázdný vytváříme seznam s jediným prvkem a 2. seznam není prázdný. 32 void Prepend(List& L, const string& NewValue) 33 { 34 if (smpty(l)) 35 { 36 nternalreatesinglelementlist(l, NewValue); 37 } 38 else 39 { 40 Listtem* Newtem = new Listtem; 41 Newtem->Value = NewValue; 42 Newtem->Prev = nullptr; 43 Newtem->Next = L.ead; 44 L.ead->Prev = Newtem; 45 L.ead = Newtem; Vložení položky do seznamu před hlavu seznamu (pokrač.) 46 } 47 } iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 117 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 118 / 458 Vložení položky před hlavu seznamu neprázdný seznam Vložení položky před hlavu seznamu neprázdný seznam 40 Listtem* Newtem = new Listtem; 41 Newtem->Value = NewValue; 42 Newtem->Prev = nullptr; 43 Newtem->Next = L.ead; 44 L.ead->Prev = Newtem; 45 L.ead = Newtem; 40 Listtem* Newtem = new Listtem; 41 Newtem->Value = NewValue; 42 Newtem->Prev = nullptr; 43 Newtem->Next = L.ead; 44 L.ead->Prev = Newtem; 45 L.ead = Newtem; T? T? 4? Newtem 4? iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 119 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 120 / 458

Vložení položky před hlavu seznamu neprázdný seznam Vložení položky před hlavu seznamu neprázdný seznam 40 Listtem* Newtem = new Listtem; 41 Newtem->Value = NewValue; 42 Newtem->Prev = nullptr; 43 Newtem->Next = L.ead; 44 L.ead->Prev = Newtem; 45 L.ead = Newtem; 40 Listtem* Newtem = new Listtem; 41 Newtem->Value = NewValue; 42 Newtem->Prev = nullptr; 43 Newtem->Next = L.ead; 44 L.ead->Prev = Newtem; 45 L.ead = Newtem; T? 25 T? 25 Newtem 4? Newtem 4? iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 121 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 122 / 458 Vložení položky před hlavu seznamu neprázdný seznam Vložení položky před hlavu seznamu neprázdný seznam 40 Listtem* Newtem = new Listtem; 41 Newtem->Value = NewValue; 42 Newtem->Prev = nullptr; 43 Newtem->Next = L.ead; 44 L.ead->Prev = Newtem; 45 L.ead = Newtem; 40 Listtem* Newtem = new Listtem; 41 Newtem->Value = NewValue; 42 Newtem->Prev = nullptr; 43 Newtem->Next = L.ead; 44 L.ead->Prev = Newtem; 45 L.ead = Newtem; T? 25 T? 25 Newtem 4? Newtem 4? iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 123 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 124 / 458

Vložení položky před hlavu seznamu neprázdný seznam Vložení položky před hlavu seznamu neprázdný seznam 40 Listtem* Newtem = new Listtem; 41 Newtem->Value = NewValue; 42 Newtem->Prev = nullptr; 43 Newtem->Next = L.ead; 44 L.ead->Prev = Newtem; 45 L.ead = Newtem; 40 Listtem* Newtem = new Listtem; 41 Newtem->Value = NewValue; 42 Newtem->Prev = nullptr; 43 Newtem->Next = L.ead; 44 L.ead->Prev = Newtem; 45 L.ead = Newtem; T? 25 T? 25 Newtem 4? 4? iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 125 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 126 / 458 Vložení položky do seznamu na konec seznamu Vložení položky do seznamu na konec seznamu (pokrač.) Zde mohou nastat dvě situace: 1. seznam je prázdný vytváříme seznam s jediným prvkem a 2. seznam není prázdný. 49 void ppend(list& L, const string& NewValue) 50 { 51 if (smpty(l)) 52 { 53 nternalreatesinglelementlist(l, NewValue); 54 } 55 else 56 { 57 Listtem* Newtem = new Listtem; 58 Newtem->Value = NewValue; 59 Newtem->Next = nullptr; 60 L.Tail->Next = Newtem; 61 Newtem->Prev = L.Tail; 62 L.Tail = Newtem; 63 } 64 } iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 127 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 128 / 458

Vložení položky na konec seznamu neprázdný seznam Vložení položky na konec seznamu neprázdný seznam 57 Listtem* Newtem = new Listtem; 58 Newtem->Value = NewValue; 59 Newtem->Next = nullptr; 60 L.Tail->Next = Newtem; 61 Newtem->Prev = L.Tail; 62 L.Tail = Newtem; 57 Listtem* Newtem = new Listtem; 58 Newtem->Value = NewValue; 59 Newtem->Next = nullptr; 60 L.Tail->Next = Newtem; 61 Newtem->Prev = L.Tail; 62 L.Tail = Newtem;? 25? 25 Newtem?? T T iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 129 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 130 / 458 Vložení položky na konec seznamu neprázdný seznam Vložení položky na konec seznamu neprázdný seznam 57 Listtem* Newtem = new Listtem; 58 Newtem->Value = NewValue; 59 Newtem->Next = nullptr; 60 L.Tail->Next = Newtem; 61 Newtem->Prev = L.Tail; 62 L.Tail = Newtem; 57 Listtem* Newtem = new Listtem; 58 Newtem->Value = NewValue; 59 Newtem->Next = nullptr; 60 L.Tail->Next = Newtem; 61 Newtem->Prev = L.Tail; 62 L.Tail = Newtem;? 25? 25 Newtem Newtem? 4? 4 T T iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 131 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 132 / 458

Vložení položky na konec seznamu neprázdný seznam Vložení položky na konec seznamu neprázdný seznam 57 Listtem* Newtem = new Listtem; 58 Newtem->Value = NewValue; 59 Newtem->Next = nullptr; 60 L.Tail->Next = Newtem; 61 Newtem->Prev = L.Tail; 62 L.Tail = Newtem; 57 Listtem* Newtem = new Listtem; 58 Newtem->Value = NewValue; 59 Newtem->Next = nullptr; 60 L.Tail->Next = Newtem; 61 Newtem->Prev = L.Tail; 62 L.Tail = Newtem;? 25? 25 Newtem Newtem? 4? 4 T T iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 133 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 134 / 458 Vložení položky na konec seznamu neprázdný seznam Vložení položky na konec seznamu neprázdný seznam 57 Listtem* Newtem = new Listtem; 58 Newtem->Value = NewValue; 59 Newtem->Next = nullptr; 60 L.Tail->Next = Newtem; 61 Newtem->Prev = L.Tail; 62 L.Tail = Newtem; 57 Listtem* Newtem = new Listtem; 58 Newtem->Value = NewValue; 59 Newtem->Next = nullptr; 60 L.Tail->Next = Newtem; 61 Newtem->Prev = L.Tail; 62 L.Tail = Newtem;? 25? 25 Newtem? 4? 4 T T iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 135 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 136 / 458

Vložení položky do seznamu před danou položku Zde mohou nastat dvě situace: 1. daná položka je hlavou seznamu využijeme funkci Prepend a 2. daná položka je obecně uvnitř seznamu. 66 void nsertefore(list& L, Listtem* urrenttem, const string& NewValue) 67 { 68 if (urrenttem!= nullptr) 69 { 70 if (urrenttem == L.ead) 71 { 72 Prepend(L, NewValue); 73 } 74 else 75 { 76 Listtem* Newtem = new Listtem; 77 Newtem->Value = NewValue; 78 Listtem* P = urrenttem->prev; Vložení položky do seznamu před danou položku (pokrač.) 79 P->Next = Newtem; 80 Newtem->Prev = P; 81 urrenttem->prev = Newtem; 82 Newtem->Next = urrenttem; 83 } 84 } 85 } iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 137 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 138 / 458 Vložení položky do seznamu před danou položku obecně Vložení položky do seznamu před danou položku obecně 76 Listtem* Newtem = new Listtem; 77 Newtem->Value = NewValue; 78 Listtem* P = urrenttem->prev; 79 P->Next = Newtem; 80 Newtem->Prev = P; 81 urrenttem->prev = Newtem; 82 Newtem->Next = urrenttem; 76 Listtem* Newtem = new Listtem; 77 Newtem->Value = NewValue; 78 Listtem* P = urrenttem->prev; 79 P->Next = Newtem; 80 Newtem->Prev = P; 81 urrenttem->prev = Newtem; 82 Newtem->Next = urrenttem;? 25? 25 Newtem urrenttem urrenttem 9? 9? iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 139 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 140 / 458

Vložení položky do seznamu před danou položku obecně Vložení položky do seznamu před danou položku obecně 76 Listtem* Newtem = new Listtem; 77 Newtem->Value = NewValue; 78 Listtem* P = urrenttem->prev; 79 P->Next = Newtem; 80 Newtem->Prev = P; 81 urrenttem->prev = Newtem; 82 Newtem->Next = urrenttem; 76 Listtem* Newtem = new Listtem; 77 Newtem->Value = NewValue; 78 Listtem* P = urrenttem->prev; 79 P->Next = Newtem; 80 Newtem->Prev = P; 81 urrenttem->prev = Newtem; 82 Newtem->Next = urrenttem;? 25 Newtem? 25 Newtem urrenttem urrenttem 4 4 P 9? 9? iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 141 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 142 / 458 Vložení položky do seznamu před danou položku obecně Vložení položky do seznamu před danou položku obecně 76 Listtem* Newtem = new Listtem; 77 Newtem->Value = NewValue; 78 Listtem* P = urrenttem->prev; 79 P->Next = Newtem; 80 Newtem->Prev = P; 81 urrenttem->prev = Newtem; 82 Newtem->Next = urrenttem; 76 Listtem* Newtem = new Listtem; 77 Newtem->Value = NewValue; 78 Listtem* P = urrenttem->prev; 79 P->Next = Newtem; 80 Newtem->Prev = P; 81 urrenttem->prev = Newtem; 82 Newtem->Next = urrenttem;? 25 Newtem? 25 Newtem urrenttem urrenttem 4 4 P P 9? 9? iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 143 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 144 / 458

Vložení položky do seznamu před danou položku obecně Vložení položky do seznamu před danou položku obecně 76 Listtem* Newtem = new Listtem; 77 Newtem->Value = NewValue; 78 Listtem* P = urrenttem->prev; 79 P->Next = Newtem; 80 Newtem->Prev = P; 81 urrenttem->prev = Newtem; 82 Newtem->Next = urrenttem; 76 Listtem* Newtem = new Listtem; 77 Newtem->Value = NewValue; 78 Listtem* P = urrenttem->prev; 79 P->Next = Newtem; 80 Newtem->Prev = P; 81 urrenttem->prev = Newtem; 82 Newtem->Next = urrenttem;? 25 Newtem? 25 Newtem urrenttem urrenttem 4 4 P P 9? 9? iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 145 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 146 / 458 Vložení položky do seznamu před danou položku obecně Vložení položky do seznamu za danou položku 76 Listtem* Newtem = new Listtem; 77 Newtem->Value = NewValue; 78 Listtem* P = urrenttem->prev; 79 P->Next = Newtem; 80 Newtem->Prev = P; 81 urrenttem->prev = Newtem; 82 Newtem->Next = urrenttem;? 25 4 9? urrenttem Zde mohou nastat dvě situace: 1. daná položka je ocasem seznamu využijeme funkci ppend a 2. daná položka je obecně uvnitř seznamu. 87 void nsertfter(list& L, Listtem* urrenttem, const string& NewValue ) 88 { 89 if (urrenttem!= nullptr) 90 { 91 if (urrenttem == L.Tail) 92 { 93 ppend(l, NewValue); 94 } 95 else 96 { 97 Listtem* Newtem = new Listtem; 98 Newtem->Value = NewValue; 99 Listtem* N = urrenttem->next; iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 147 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 148 / 458

Vložení položky do seznamu za danou položku (pokrač.) Vložení položky do seznamu za danou položku obecně 100 N->Prev = Newtem; 101 Newtem->Next = N; 102 urrenttem->next = Newtem; 103 Newtem->Prev = urrenttem; 104 } 105 } 106 } 97 Listtem* Newtem = new Listtem; 98 Newtem->Value = NewValue; 99 Listtem* N = urrenttem->next; 100 N->Prev = Newtem; 101 Newtem->Next = N; 102 urrenttem->next = Newtem; 103 Newtem->Prev = urrenttem;? 25 urrenttem 9? iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 149 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 150 / 458 Vložení položky do seznamu za danou položku obecně Vložení položky do seznamu za danou položku obecně 97 Listtem* Newtem = new Listtem; 98 Newtem->Value = NewValue; 99 Listtem* N = urrenttem->next; 100 N->Prev = Newtem; 101 Newtem->Next = N; 102 urrenttem->next = Newtem; 103 Newtem->Prev = urrenttem; 97 Listtem* Newtem = new Listtem; 98 Newtem->Value = NewValue; 99 Listtem* N = urrenttem->next; 100 N->Prev = Newtem; 101 Newtem->Next = N; 102 urrenttem->next = Newtem; 103 Newtem->Prev = urrenttem;? 25 Newtem? 25 Newtem 4 urrenttem 9? urrenttem 9? iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 151 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 152 / 458

Vložení položky do seznamu za danou položku obecně Vložení položky do seznamu za danou položku obecně 97 Listtem* Newtem = new Listtem; 98 Newtem->Value = NewValue; 99 Listtem* N = urrenttem->next; 100 N->Prev = Newtem; 101 Newtem->Next = N; 102 urrenttem->next = Newtem; 103 Newtem->Prev = urrenttem; 97 Listtem* Newtem = new Listtem; 98 Newtem->Value = NewValue; 99 Listtem* N = urrenttem->next; 100 N->Prev = Newtem; 101 Newtem->Next = N; 102 urrenttem->next = Newtem; 103 Newtem->Prev = urrenttem;? 25 Newtem? 25 Newtem N N 4 4 urrenttem 9? urrenttem 9? iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 153 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 154 / 458 Vložení položky do seznamu za danou položku obecně Vložení položky do seznamu za danou položku obecně 97 Listtem* Newtem = new Listtem; 98 Newtem->Value = NewValue; 99 Listtem* N = urrenttem->next; 100 N->Prev = Newtem; 101 Newtem->Next = N; 102 urrenttem->next = Newtem; 103 Newtem->Prev = urrenttem; 97 Listtem* Newtem = new Listtem; 98 Newtem->Value = NewValue; 99 Listtem* N = urrenttem->next; 100 N->Prev = Newtem; 101 Newtem->Next = N; 102 urrenttem->next = Newtem; 103 Newtem->Prev = urrenttem;? 25 Newtem? 25 Newtem N N 4 4 urrenttem 9? urrenttem 9? iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 155 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 156 / 458

Vložení položky do seznamu za danou položku obecně Vložení položky do seznamu za danou položku obecně 97 Listtem* Newtem = new Listtem; 98 Newtem->Value = NewValue; 99 Listtem* N = urrenttem->next; 100 N->Prev = Newtem; 101 Newtem->Next = N; 102 urrenttem->next = Newtem; 103 Newtem->Prev = urrenttem; 97 Listtem* Newtem = new Listtem; 98 Newtem->Value = NewValue; 99 Listtem* N = urrenttem->next; 100 N->Prev = Newtem; 101 Newtem->Next = N; 102 urrenttem->next = Newtem; 103 Newtem->Prev = urrenttem;? 25 Newtem? 25 N 4 4 urrenttem 9? urrenttem 9? iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 157 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 158 / 458 Odebrání položky ze seznamu Odebrání položky ze seznamu (pokrač.) Odebrání položky ze seznamu můžeme rozdělit na dvě fáze: 1. vlastní odebrání položky ze seznamu odstranění vazeb mezi ostatními položkami seznamu a odebíranou položkou. Zde mohou nastat celkem čtyři situace: 1.1 seznam obsahuje jedinou položku řádky 235 až 239, 1.2 odebíraná položka je hlavou seznamu řádky 242 až 246, 1.3 odebíraná položka je ocasem seznamu řádky 249 až 253 nebo 1.4 odebíraná položka leží obecně uvnitř seznamu řádky 256 až 259. 2. uvolnění položky z paměti řádek 263 233 void nternalremove(list& L, const Listtem* temtoelete) 234 { 235 if (temtoelete == L.ead && temtoelete == L.Tail) 236 { 237 L.ead = nullptr; 238 L.Tail = nullptr; 239 } 240 else 241 { 242 if (temtoelete == L.ead) 243 { 244 L.ead = L.ead->Next; 245 L.ead->Prev = nullptr; 246 } 247 else 248 { 249 if (temtoelete == L.Tail) 250 { 251 L.Tail = L.Tail->Prev; iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 159 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 160 / 458

Odebrání položky ze seznamu (pokrač.) Odebrání položky ze seznamu jediná položka 252 L.Tail->Next = nullptr; 253 } 254 else 255 { 256 Listtem* P = temtoelete->prev; 257 Listtem* N = temtoelete->next; 258 P->Next = N; 259 N->Prev = P; 260 } 261 } 262 } 263 delete temtoelete; 264 } 235 if (temtoelete == L.ead && temtoelete == L.Tail) 236 { 237 L.ead = nullptr; 238 L.Tail = nullptr; 239 } T 25 temtoelete iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 161 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 162 / 458 Odebrání položky ze seznamu jediná položka Odebrání položky ze seznamu jediná položka 235 if (temtoelete == L.ead && temtoelete == L.Tail) 236 { 237 L.ead = nullptr; 238 L.Tail = nullptr; 239 } 235 if (temtoelete == L.ead && temtoelete == L.Tail) 236 { 237 L.ead = nullptr; 238 L.Tail = nullptr; 239 } temtoelete temtoelete T 25 T 25 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 163 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 164 / 458

Odebrání položky ze seznamu hlava Odebrání položky ze seznamu hlava 242 if (temtoelete == L.ead) 243 { 244 L.ead = L.ead->Next; 245 L.ead->Prev = nullptr; 246 } 242 if (temtoelete == L.ead) 243 { 244 L.ead = L.ead->Next; 245 L.ead->Prev = nullptr; 246 } T? 25 T? 25 temtoelete 4? temtoelete 4? iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 165 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 166 / 458 Odebrání položky ze seznamu hlava Odebrání položky ze seznamu ocas 242 if (temtoelete == L.ead) 243 { 244 L.ead = L.ead->Next; 245 L.ead->Prev = nullptr; 246 } 249 if (temtoelete == L.Tail) 250 { 251 L.Tail = L.Tail->Prev; 252 L.Tail->Next = nullptr; 253 } temtoelete T? 25?? 25 T 4 temtoelete 4? iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 167 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 168 / 458

Odebrání položky ze seznamu ocas Odebrání položky ze seznamu ocas 249 if (temtoelete == L.Tail) 250 { 251 L.Tail = L.Tail->Prev; 252 L.Tail->Next = nullptr; 253 } 249 if (temtoelete == L.Tail) 250 { 251 L.Tail = L.Tail->Prev; 252 L.Tail->Next = nullptr; 253 } temtoelete temtoelete?? 25?? 25 T 4 T 4 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 169 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 170 / 458 Odebrání položky ze seznamu obecná pozice Odebrání položky ze seznamu obecná pozice 256 Listtem* P = temtoelete->prev; 257 Listtem* N = temtoelete->next; 258 P->Next = N; 259 N->Prev = P; 256 Listtem* P = temtoelete->prev; 257 Listtem* N = temtoelete->next; 258 P->Next = N; 259 N->Prev = P;? 25 temtoelete? 25 temtoelete 4 4 9? P 9? iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 171 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 172 / 458

Odebrání položky ze seznamu obecná pozice Obousměrný seznam deklarace 256 Listtem* P = temtoelete->prev; 257 Listtem* N = temtoelete->next; 258 P->Next = N; 259 N->Prev = P; 1 #pragma once 2 3 #include <iostream> 4 #include <string> 5 6 using namespace std;? 25 4 temtoelete N 7 8 struct Listtem 9 { 10 string Value; 11 Listtem* Prev; 12 Listtem* Next; 13 }; P 9? 14 15 struct List 16 { 17 Listtem* ead; 18 Listtem* Tail; 19 }; iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 173 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 174 / 458 Obousměrný seznam deklarace (pokrač.) Obousměrný seznam deklarace (pokrač.) 20 21 void nit(list& L); 22 void nit(list& L, const string& nitvalue); 23 void nit(list& L, const string nitvalues[], const int N); 24 void nit(list& L, const List& Other); 25 26 void Prepend(List& L, const string& NewValue); 27 void ppend(list& L, const string& NewValue); 28 void nsertefore(list& L, Listtem* urrenttem, const string& NewValue); 29 void nsertfter(list& L, Listtem* urrenttem, const string& NewValue ); 30 31 void Removeirst(List& L); 32 void RemoveLast(List& L); 33 void Remove(List& L, const string& ValueToRemove); 34 void Removell(List& L, const string& ValueToRemove); 35 void Remove(List& L, const Listtem* temtoremove); 36 void lear(list& L); 37 38 Listtem* Search(const List& L, const string& Value); 39 Listtem* ReverseSearch(const List& L, const string& Value); 40 41 bool ontains(const List& L, const string& Value); 42 43 bool smpty(const List& L); 44 int ount(const List& L); 45 46 void Report(const List& L); 47 void ReportStructure(const List& L); 48 49 void nternalreatesinglelementlist(list& L, const string& NewValue); 50 void nternalremove(list& L, const Listtem* temtoelete); iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 175 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 176 / 458

Obousměrný seznam implementace 1 #include "List.h" 2 3 void nit(list& L) 4 { 5 L.ead = nullptr; 6 L.Tail = nullptr; 7 } 8 9 void nit(list& L, const string& nitvalue) 10 { 11 nternalreatesinglelementlist(l, nitvalue); 12 } 13 14 void nit(list& L, const string nitvalues[], const int N) 15 { 16 nit(l); 17 for (int i = 0; i < N; i++) 18 { 19 ppend(l, nitvalues[i]); Obousměrný seznam implementace (pokrač.) 20 } 21 } 22 23 void nit(list& L, const List& Other) 24 { 25 nit(l); 26 for (Listtem* p = Other.ead; p!= nullptr; p = p->next) 27 { 28 ppend(l, p->value); 29 } 30 } 31 32 void Prepend(List& L, const string& NewValue) 33 { 34 if (smpty(l)) 35 { 36 nternalreatesinglelementlist(l, NewValue); 37 } 38 else iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 177 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 178 / 458 Obousměrný seznam implementace (pokrač.) Obousměrný seznam implementace (pokrač.) 39 { 40 Listtem* Newtem = new Listtem; 41 Newtem->Value = NewValue; 42 Newtem->Prev = nullptr; 43 Newtem->Next = L.ead; 44 L.ead->Prev = Newtem; 45 L.ead = Newtem; 46 } 47 } 48 49 void ppend(list& L, const string& NewValue) 50 { 51 if (smpty(l)) 52 { 53 nternalreatesinglelementlist(l, NewValue); 54 } 55 else 56 { 57 Listtem* Newtem = new Listtem; 58 Newtem->Value = NewValue; 59 Newtem->Next = nullptr; 60 L.Tail->Next = Newtem; 61 Newtem->Prev = L.Tail; 62 L.Tail = Newtem; 63 } 64 } 65 66 void nsertefore(list& L, Listtem* urrenttem, const string& NewValue) 67 { 68 if (urrenttem!= nullptr) 69 { 70 if (urrenttem == L.ead) 71 { 72 Prepend(L, NewValue); 73 } 74 else 75 { iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 179 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 180 / 458

Obousměrný seznam implementace (pokrač.) 76 Listtem* Newtem = new Listtem; 77 Newtem->Value = NewValue; 78 Listtem* P = urrenttem->prev; 79 P->Next = Newtem; 80 Newtem->Prev = P; 81 urrenttem->prev = Newtem; 82 Newtem->Next = urrenttem; 83 } 84 } 85 } 86 87 void nsertfter(list& L, Listtem* urrenttem, const string& NewValue ) 88 { 89 if (urrenttem!= nullptr) 90 { 91 if (urrenttem == L.Tail) 92 { 93 ppend(l, NewValue); Obousměrný seznam implementace (pokrač.) 94 } 95 else 96 { 97 Listtem* Newtem = new Listtem; 98 Newtem->Value = NewValue; 99 Listtem* N = urrenttem->next; 100 N->Prev = Newtem; 101 Newtem->Next = N; 102 urrenttem->next = Newtem; 103 Newtem->Prev = urrenttem; 104 } 105 } 106 } 107 108 void Removeirst(List& L) 109 { 110 if (!smpty(l)) 111 { 112 nternalremove(l, L.ead); iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 181 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 182 / 458 Obousměrný seznam implementace (pokrač.) Obousměrný seznam implementace (pokrač.) 113 } 114 } 115 116 void RemoveLast(List& L) 117 { 118 if (!smpty(l)) 119 { 120 nternalremove(l, L.Tail); 121 } 122 } 123 124 void Remove(List& L, const string& ValueToRemove) 125 { 126 Listtem* p = Search(L, ValueToRemove); 127 if (p!= nullptr) 128 { 129 nternalremove(l, p); 130 } 131 } 132 133 void Removell(List& L, const string& ValueToRemove) 134 { 135 Listtem* p; 136 while ((p = Search(L, ValueToRemove))!= nullptr) 137 { 138 nternalremove(l, p); 139 } 140 } 141 142 void Remove(List& L, const Listtem* temtoremove) 143 { 144 if (temtoremove!= nullptr) 145 { 146 nternalremove(l, temtoremove); 147 } 148 } 149 150 void lear(list& L) iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 183 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 184 / 458

Obousměrný seznam implementace (pokrač.) Obousměrný seznam implementace (pokrač.) 151 { 152 while (!smpty(l)) 153 { 154 nternalremove(l, L.ead); 155 } 156 } 157 158 Listtem* Search(const List& L, const string& Value) 159 { 160 for (Listtem* p = L.ead; p!= nullptr; p = p->next) 161 { 162 if (p->value == Value) 163 { 164 return p; 165 } 166 } 167 return nullptr; 168 } 169 170 Listtem* ReverseSearch(const List& L, const string& Value) 171 { 172 for (Listtem* p = L.Tail; p!= nullptr; p = p->prev) 173 { 174 if (p->value == Value) 175 { 176 return p; 177 } 178 } 179 return nullptr; 180 } 181 182 bool ontains(const List& L, const string& Value) 183 { 184 return Search(L, Value)!= nullptr; 185 } 186 187 bool smpty(const List& L) 188 { iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 185 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 186 / 458 Obousměrný seznam implementace (pokrač.) 189 return L.ead == nullptr; 190 } 191 192 int ount(const List& L) 193 { 194 int counter = 0; 195 for (Listtem* p = L.ead; p!= nullptr; p = p->next) 196 { 197 counter += 1; 198 } 199 return counter; 200 } 201 202 void Report(const List& L) 203 { 204 for (Listtem* p = L.ead; p!= nullptr; p = p->next) 205 { 206 cout << p->value << "\t"; 207 } Obousměrný seznam implementace (pokrač.) 208 cout << endl; 209 } 210 211 void ReportStructure(const List& L) 212 { 213 cout << "L.ead: " << L.ead << endl; 214 cout << "L.Tail: " << L.Tail << endl; 215 for (Listtem* p = L.ead; p!= nullptr; p = p->next) 216 { 217 cout << "tem address: " << p << endl; 218 cout << "Value: " << p->value << endl; 219 cout << "Prev: " << p->prev << endl; 220 cout << "Next: " << p->next << endl; 221 cout << endl; 222 } 223 } 224 225 void nternalreatesinglelementlist(list& L, const string& NewValue) 226 { iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 187 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 188 / 458

Obousměrný seznam implementace (pokrač.) 227 L.ead = L.Tail = new Listtem; 228 L.ead->Value = NewValue; 229 L.ead->Prev = nullptr; 230 L.ead->Next = nullptr; 231 } 232 233 void nternalremove(list& L, const Listtem* temtoelete) 234 { 235 if (temtoelete == L.ead && temtoelete == L.Tail) 236 { 237 L.ead = nullptr; 238 L.Tail = nullptr; 239 } 240 else 241 { 242 if (temtoelete == L.ead) 243 { 244 L.ead = L.ead->Next; 245 L.ead->Prev = nullptr; Obousměrný seznam implementace (pokrač.) 246 } 247 else 248 { 249 if (temtoelete == L.Tail) 250 { 251 L.Tail = L.Tail->Prev; 252 L.Tail->Next = nullptr; 253 } 254 else 255 { 256 Listtem* P = temtoelete->prev; 257 Listtem* N = temtoelete->next; 258 P->Next = N; 259 N->Prev = P; 260 } 261 } 262 } 263 delete temtoelete; 264 } iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 189 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 190 / 458 Kontrolní otázky 1. Máme danou strukturu a čtyři proměnné: 1 struct MyStruct 2 { 3 int d; 4 double Value; 5 }; 6 7 MyStruct a, b; 8 MyStruct *p, *q; o se stane pokud provedu a = b;? co pokud provedu p = q;? 2. ak alokuji dynamicky strukturu z předchozí otázky? Pomocí jakého operátoru? 3. ak uvolním z paměti dynamicky alokovanou strukturu, kterou jsem vytvořil v předchozí otázce? Kontrolní otázky (pokrač.) 4. Mám deklarovanou proměnnou MyStruct a;. ak se dostanu k položce Value v proměnné a? 5. Mám deklarovanou proměnnou MyStruct *p;. ak se dostanu k položce Value v proměnné p pomocí jediného operátoru (bez dereference)? 6. Mám deklarovanou proměnnou MyStruct *p;. ak se dostanu k položce Value v proměnné p pomocí operátoru dereference? 7. Mám následující kód: 1 double *p = new double; 2 delete p; 3 *p = 15; o tento kód způsobí? 8. Mám následující kód: 1 double *p = new double; 2 p = NULL; iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 191 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 192 / 458

Kontrolní otázky (pokrač.) o tento kód způsobí? K čemu v paměti dojde? 9. Mám následující kód: 1 double *p = new double; 2 p = NULL; 3 *p = 15; o tento kód způsobí? K čemu v paměti dojde? 10. Mám seznam implementovaný pomocí pole. Musím tento seznam (především to pole) explicitně uvolňovat z paměti pomocí operátoru delete? 11. Mám seznam implementovaný pomocí dynamicky alokovaných struktur. Musím tento seznam explicitně uvolňovat z paměti pomocí operátoru delete? 12. o je to zarážka (angl. sentinel)? o nahrazuje? 13. K čemu slouží zarážka? iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 193 / 458 Kontrolní otázky (pokrač.) 14. ak se změní algoritmus vkládání prvku na začátek obousměrného seznamu, pokud využijeme zarážku? 15. ak se změní algoritmus smazání prvku z obousměrného seznamu, pokud využijeme zarážku? 16. Kdy je vhodné využít zarážku? Zaměřte se na spotřebovanou paměť a počet prvků v uvažovaném seznamu. 17. Kdy je vhodné použít seznam implementovaný v poli a kdy pomocí dynamických struktur? Zaměřte se na rychlost operací vložení (s tím spojené alokování položky), operací mazání (s tím spojené dealokovaní položky). ále se zaměřte na možnou změnu kapacity seznamu. 18. estliže budu k seznamu přistupovat pouze pomocí funkcí nsert, elete nebo Search a změním implementaci seznamu. Musím měnit i okolní kód, kde se seznam využívá? 19. Pokud implementuji frontu pomocí dynamických struktur, potřebuji kruhový buffer a podobné triky s polem? iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 194 / 458 Kontrolní otázky (pokrač.) 20. Zkuste navrhnout efektivní algoritmus pro třídění seznamu. Uvědomte si, že k položkám seznamu můžeme přistupovat pouze sekvenčně, jako například k datům v souboru. aký Vám známý algoritmus pro třídění lze na tento problém aplikovat? 21. Zkuste navrhnout rekurzívní algoritmus pro vyhledání prvku v obousměrném seznamu. 22. ak spočítáte počet položek v seznamu? Má na tento algoritmus vliv zda je seznam obousměrný nebo jednosměrný? 23. ak byste v obousměrném seznamu implementovali mazání k-té položky. 24. Popište algoritmus mazání položky z obousměrného seznamu. Položka určená ke smazání se musí nejprve vyhledat podle dat uložených v položce. 25. Popište algoritmus vkládání na začátek obousměrného seznamu. ěkuji za pozornost iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 195 / 458 iří vorský (VŠ TUO) Spojová implementace lineárních datových struktur 196 / 458

rafy motivace rafy doc. Mgr. iří vorský, Ph.. Katedra informatiky akulta elektrotechniky a informatiky VŠ TU Ostrava edná se o reprezentaci množiny objektů, u které chceme znázornit, že některé prvky jsou propojeny. Objektům se přiřadí vrcholy a jejich propojení značí hrany mezi nimi. rafy slouží jako abstrakce mnoha různých problémů. Často se jedná o zjednodušený model nějaké skutečné sítě (například dopravní), který zdůrazňuje topologické vlastnosti objektů (vrcholů) a zanedbává geometrické vlastnosti, například přesnou polohu. iří vorský (VŠ TUO) rafy 197 / 458 iří vorský (VŠ TUO) rafy 198 / 458 rafy motivace Neorientovaný graf Příklady abstrakce 1. kousek železniční sítě Č, graf jako mapa, reálné názvy stanic, zachován fyzický tvar tratí, 2. zachováme topografické rozložení stanic a jejich názvy, tratě překreslíme úsečkami, 3. zachováme pouze názvy stanic, jejich rozložení můžeme libovolně měnit, u některých nakreslení grafu se budou hrany křížit u jiných ne, některá nakreslení grafu jsou pro lidské oko přehlednější 4. vynecháme názvy stanic a použijeme místo nich přirozená čísla. alší možné abstrakce Vcholy grafu nemusí být nutně stanice. raf můžeme chápat i tak, že vrcholy jsou jednotlivé tratě (čísla tratí). vě tratě spojíme hranou, pokud tyto dvě tratě na sebe navazují. V tomto případě hrany v grafu vyjadřují logický vztah, binární relaci být propojen. iří vorský (VŠ TUO) rafy 199 / 458 efinice Neorientovaným grafem nazýváme dvojici = (V, ), kde V je množina uzlů, je množina jednoprvkových nebo dvouprvkových podmnožin V. Prvky množiny se nazývají hrany grafu a prvky množiny V se nazývají uzly. Literatura iří emel: rafy a jejich aplikace, cademia, Praha, 2002 iří vorský (VŠ TUO) rafy 200 / 458

Neorientovaný graf, pokračování Neorientovaný graf, pokračování rany grafu Mějme hranu e, kde e = {u, v}. Uzlům u a v říkáme krajní uzly hrany e. Říkáme také, že jsou incidentní (nebo že incidují) s hranou e. O hraně e pak říkáme, že je incidentní s těmito uzly nebo také že spojuje tyto uzly. efinice ranu spojující uzel se sebou samým nazýváme smyčkou. udeme uvažovat pouze konečné grafy, tedy grafy s konečnou množinou uzlů V. Nekonečné grafy necháme stranou. Vzhledem k tomu, že jiné než neorientované grafy nebudeme definovat, můžeme označení neorientovaný vynechávat. iří vorský (VŠ TUO) rafy 201 / 458 iří vorský (VŠ TUO) rafy 202 / 458 Neorientovaný graf, pokračování Sled efinice Stupeň uzlu je počet hran s uzlem incidentních, tj. Věta s(v) = {e v e}. Součet stupňů uzlů libovolného grafu = (V, ) je roven dvojnásobku počtu jeho hran. s(v) = 2 ůkaz. v V Zřejmý (v sumě se každá hrana počítá dvakrát). efinice Posloupnost navazujících uzlů a hran v 1, e 1, v 2,..., v n, e n, v n+1, kde e i = {v i, v i+1 } pro 1 i n nazýváme (neorientovaným) sledem. efinice Sled, v němž se neopakuje žádný uzel nazýváme cestou. Tedy v i v j, 1 i j n. Číslo n pak nazýváme délkou cesty. Z faktu, že se v cestě neopakují uzly, vyplývá, že se v ní neopakují ani hrany. Každá cesta je tedy zároveň i sledem. iří vorský (VŠ TUO) rafy 203 / 458 iří vorský (VŠ TUO) rafy 204 / 458

Kružnice cyklický graf efinice Sled, který má alespoň jednu hranu a jehož počáteční a koncový uzel splývají, nazýváme uzavřeným sledem. efinice Uzavřená cesta je uzavřený sled, v němž se neopakují uzly ani hrany. Uzavřená cesta se nazývá také kružnice. efinice raf se nazývá acyklický, jestliže neobsahuje kružnici. V definici kružnice jsme museli zakázat kromě opakování uzlů i opakování hran proto, aby posloupnost v 1, e 1, v 2, e 1, v 1 nemohla být považována za kružnici. iří vorský (VŠ TUO) rafy 205 / 458 iří vorský (VŠ TUO) rafy 206 / 458 Souvislý graf rafy příklady Vizualizace grafu efinice raf se nazývá souvislý, jestliže mezi každými dvěma uzly existuje cesta. Matematický zápis 2 Věta Nechť = (V, ) je souvislý graf. Pak platí V 1. ůkaz. Zřejmý. = (V, ) V = {1, 2, 3, 4, 5, 6} = {{1, 2}, {1, 3}, {1, 5}, {1, 6}, {2, 3}, {2, 4}, {3, 4}, {4, 5}, {4, 6}}. 1 3 5 4 6 iří vorský (VŠ TUO) rafy 207 / 458 iří vorský (VŠ TUO) rafy 208 / 458

rafy příklady Způsoby zadání grafu Vizualizace grafu esta Uzly {1, 2, 3, 4} spolu s hranami {1, 2}, {2, 3}, {3, 4} tvoří cestu. Kružnice rany {1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 1} tvoří kružnici. 1 2 3 5 4 grafickou formou: prostě obrázkem, asi nejsrozumitelnější forma pro člověka, vhodné pro grafy s malým počtem vrcholů prakticky nemožnost zpracování počítačem. výčtem vrcholů a hran nebo maticí. 6 iří vorský (VŠ TUO) rafy 209 / 458 iří vorský (VŠ TUO) rafy 210 / 458 Matice sousednosti ynamicky alokované datové struktury Vizualizace grafu 2 Matice sousednosti 1 3 5 4 0 1 1 0 1 1 1 0 1 1 0 0 1 1 0 1 0 0 0 1 1 0 1 1 1 0 0 1 0 0 1 0 0 1 0 0 6 iří vorský (VŠ TUO) rafy 211 / 458 iří vorský (VŠ TUO) rafy 212 / 458