Todo List I.

Práca so spojkovým zoznamom a základnými CRUD operáciami nad ním.

About

Aj vy zvyknete zabúdať? Neviem, ako vy, ale čo si nezapíšem, tak o tom veľmi neviem. V rámci tejto úlohy teda vytvoríte jednoduchú implementáciu todolist-u v jazyku C.

Objectives

  1. Osvojiť si problematiku dynamických štruktúrovaných údajov.
  2. Naučiť sa vytvárať a prehľadávať spájané zoznamy.

Content

Warmup

Na tejto úlohe budeme spolu pracovať v priebehu dvoch cvičení. Preto, aby ste nestratili stav svojho riešenia, svoje kódy nahráte do vášho študentského Git repozitára.

Úloha 1.1

Naklonujte si svoj študentský Git repozitár.

Úloha 1.2

Do koreňového priečinku vášho repozitára si vytvorte priečinok todolist/ a stiahnite si do neho hlavičkový súbor todo.h.

Súbor si stiahnite z adresy http://it4kt.cnl.sk/c/pvjc/2018/download/todo.h.

Úloha 1.3

Vytvorte si súbor todo.c, ktorý bude obsahovať implementáciu modulu todo a main.c, ktorý bude obsahovať hlavnú funkciu programu main().

Úloha 1.4

Vytvorte súbor Makefile, ktorý zabezpečí preklad a vyčistenie riešenia.

Súbor Makefile bude obsahovať tieto ciele:

Úloha 1.5

Otestujte správnosť vami vytvorené súboru Makefile spustením každého jedného cieľa.

Úloha 1.6

Všetky vytvorené súbory, ktoré sú riešením úlohy, pridajte do vášho Git repozitára.

New Task

Začneme vytvorením novej úlohy a pozrieme sa bližšie na to, z akých členov sa skladá štruktúra task, ktorá úlohu definuje.

Úloha 2.1

Implementujte funkciu create_task(), pomocou ktorej vytvoríte novú úlohu.

Úloha je definovaná pomocou štruktúry struct task, ktorej definíciu nájdete v súbore todo.h. Každá úloha má:

Funkcia pre vytvorenie úlohy má dva parametre:

Funkcia po úspešnom vytvorení úlohy vráti referenciu na ňu. Parameter description je povinný, čo znamená, že ak nebude zadaný (miesto parametra funkcia dostane prázdny reťazec alebo NULL), funkcia vráti NULL.

Poznámka

Parameter due_date nateraz nie je dôležitý. Vrátime sa ku nemu neskôr.

Úloha 2.2

Vytvorte pomocnú funkciu print_task(), ktorá vypíše úlohu na obrazovku.

Funkcia bude mať jeden parameter, ktorým bude referencia na existujúcu úlohu. Ak miesto existujúcej úlohy dostane NULL, nič na obrazovku nevypíše. V opačnom prípade zobrazí všetky informácie týkajúce sa úlohy.

Poznámka

Tvar výpisu nie je nijak predpísaný. Funkcia taktiež nie je definovaná v hlavičkovom súbore, pretože je pomocná. Zadefinujte si ju preto rovno v súbore main.c.

Todo List

Funkciu, ktorá vytvorí práve jednu úlohu do zoznamu úloh už máme pripravenú. V tomto kroku však vytvoríme funkciu, pomocou ktorej budeme vedieť zreťaziť úlohy do jedného zoznamu.

Úloha 3.1

Vytvorte funkciu add_task(), ktorá pridá k existujúcemu zoznamu úloh novú.

Funkcia má dva parametre:

Nová úloha sa vždy pridá na koniec zoznamu. Nezabudnite však ošetriť prípady, keď:

Funkcia vždy vráti referenciu na prvý prvok zoznamu. Ak však po zavolaní funkcie nedôjde k vytvoreniu žiadneho zoznamu, vráti hodnotu NULL.

Úloha 3.2

Otestujte vytvorenú funkciu vytvorením zoznamu, ktorý bude obsahovať aspoň tri položky a následne jeho vypísaním jeho obsahu od prvej až po poslednú položku.

Additional Tasks

  1. Vytvorte pomocnú funkciu is_active(), ktorá overí, či sa úloha stále rieši (je aktívna). Funkcia vracia hodnotu typu bool. Ak však referencia na úlohu v parametri funkcie je NULL, funkcia vráti automaticky hodnotu false. Funkcia vráti hodnotu true v prípade, ak je člen úlohy active nastavený na hodnotu true.

  2. Vytvorte pomocnú funkciu is_completed(), ktorá overí, či je už úloha hotová (neaktívna). Funkcia vráti hodnotu true v prípade, ak je člen úlohy active nastavený na hodnotu false.

  3. Vytvorte pomocnú funkciu make_task_active(), ktorá nastaví úlohu na aktívnu.

  4. Vytvorte pomocnú funkciu make_task_inactive(), ktorá nastaví úlohu na neaktívnu.