Projekt třídy jednosměrně vázaný seznam

Jedná se o složitější projekt návrhu třídy, který je rozložen do pěti kroků. První dva kroky slouží k pochopení činnosti vázaného seznamu a k zápisu kódu základních funkcí a proto se realizuje v jazyce C. V dalších cvičeních se tyto základy využijí při postupném tvoření třídy.

Jednosměrně vázaným seznamem rozumíme množinu prvků (typu struktura), které kromě informací o hodnotách vážících se k jednotlivým strukturám, nesou i informaci o následujícím prvku – realizovanou ukazatelem na typ stejný jako je prvek (tedy na strukturu stejného typu). Poslední prvek seznamu je takový, který nemá následující prvek – jeho ukazatel na další prvek je „NULL“.





Úkol 1 – úvod (pro KPPC zadáno na 3-tím tutoriálu – XX.XX.2011 odevzdáno do XX/XX.XX.2011

Napište program, který bude realizovat jednosměrně vázaný seznam. Program bude obsahovat dva moduly (tři soubory) – main a modul s kódem realizujícím vázaný seznam (implementaci seznamu). Dále bude v projektu hlavičkový soubor definic a prototypů funkcí doplňující soubor seznamu.
Navrhněte strukturu SPrvek vhodnou pro prvek seznamu. Struktura (prvek seznamu) obsahuje index, hodnotu, ukazatel pro propojování seznamu. Prvek seznamu bude tedy obsahovat index, který značí pořadí vkládaného prvku od počátku běhu programu (první vkládaný bude mít index jedna, každý další vkládaný prvek index o jedno větší než minulý vkládaný, nezávisle na tom, zda-li byl některý prvek smazán). Nezaměňovat s indexem, který je parametrem funkcí a který značí prostou pozici v seznamu (udávající, na kolikáté pozici je prvek od počátku seznamu v dané chvíli, nezávisle na tom zda byly již nějaké prvky odstraněny nebo přidány). Dále struktura obsahuje ukazatel na hodnotu, ve které jsou uložena „užitečná“ data, které budou realizovány náhodně naplněnou proměnnou typu double. Ukazatel pro propojení seznamu bude ukazovat na následující prvek.

Algoritmy funkcí by měly fungovat i pro prázdný seznam (ve funkcích testujte na začátku, zda mají smysl).
Napište funkci (VlozPrvek), která vloží nový prvek do seznamu na danou pozici – není-li možné vložit na tuto pozici (pozice mimo rozsah) vložte prvek na konec seznamu – ukažte několik volání pro obě možnosti.
Napište funkci (ZrusPrvek), která zruší celý seznam. Ukažte volání na prázdný i naplněný seznam.
Napište funkci (OdeberMisto), která odebere prvek na dané pozici – existuje-li tato pozice.
Napište funkci (OdeberHodnota), která odebere prvky s danou hodnotou, pokud takové existují.
Ukažte volání obou možností odebrání prvků a také volání pro neexistující prvek.



Úkol 2 – pokračování (pro KPPC zadáno na 4-tém tutoriálu XX.XX.2011 odevzdáno do XX./XX.XX.2011

(Úkol 2 je pokračováním/rozšířením úkolu 1 – předpokládá se tedy, že budou odstraněny nedostatky z minulé úlohy).
Napište funkci (Pocet), která zjistí počet prvků v seznamu a hodnotu maximálního indexu.
Napište funkci (VlozSeznam) pro vkládání jednoho seznamu do druhého seznamu (tj. Předávaný prvek bude prvním prvkem vkládaného (=druhého) seznamu) a vloží se na danou pozici seznamu druhého. Navrhněte tak, aby se vložený seznam stal „majetkem“ prvního seznamu (tj. aby došlo pouze ke vložení, a ne k vytváření kopie druhého seznamu).
Napište funkci (Tisk), která vytiskne seznam ve formátu index, hodnota, ukazatel na aktuální prvek, ukazatel na následující prvek (jeden prvek seznamu se tiskne na řádek). Seznam bude vytištěn tak, že prvním vytištěným prvkem bude poslední prvek seznamu.
Napište funkci (Setrid), která seřadí prvky podle indexu nebo hodnoty (řazení provede na základě nastavení globální proměnné, která se bude měnit příslušnou funkcí (NastavTrideni)). Řadit bude sestupně.

Ukažte volání všech navržených funkcí (demonstrující různé varianty volání).





Úkol 3 – základy třídy (pro KPPC zadáno na 5-tém tutoriálu XX.XX.2011 odevzdáno do XX/X.XX.2011

Na základě minulých dvou úkolů realizujte třídu, která bude obstarávat práci se seznamem.

Vytvořte třídu CSeznam, která bude obsahovat jednosměrně vázaný seznam a bude zprostředkovávat práci s ním. Tato třída bude obsahovat i případné další proměnné vhodné pro fungování třídy. Vlastní vázaný seznam bude implementováván pomocí struktury SPrvek, která bude obsahovat datové prvky („hodnoty“ daného uzlu a ukazatel na další prvek).
Napište konstruktor implicitní (vytvoří prázdný seznam),
kopykonstruktor (vytvoří objekt s vlastními prvky shodnými se seznamem, který je předán jako parametr),
konstruktor, který na základě celočíselné hodnoty (unsigned int) vytvoří seznam s tímto počtem prvků (a vyplní proměnnou index hodnotami od jedné s inkrementací o jedna pro další prvky, a datový člen (ve struktuře ho zastupuje ukazatel na double) naplní tak, že jeho hodnoty budou nulované, nebude-li druhý parametr uveden. Bude-li uveden, naplní se předanou hodnotou),
konstruktor, který vytvoří seznam na základě pole intů (první hodnota značí počet dvojic, další hodnoty jsou index a hodnota prvku s tímto indexem [pocetdvojic, indexA, hodnotaA, indexC, hodnotaC, ... ]).
Napište destruktor, který zruší daný seznam.

Ukažte použití navržených metod.
Funkce z minulých úkolů, které nejsou potřebné, se v tomto bodě ještě do třídy nezahrnují – nezařazujte je zatím do tohoto projektu. Potřebné pomocné funkce budou – vytvoření seznamu, možná tisk. Třída bude realizovat „manažera“ obsluhujícího vlastní seznam – druhá struktura pro vlastní seznam.

Výsledný projekt bude obsahovat pět souborů - hlavičkový a zdrojový soubor pro třídu CSeznam, jejichž součástí bude i struktura SPrvek, další soubor bude zdrojový soubor s funkcí main, která bude volat demonstrační funkci Test, ve které bude ukázána činnost třídy.
Odevzdávané soubory budou mít jména - dumainprj.cpp, duseznam.cpp, duseznam.h. Dodržujte uvedená jména funkcí a proměnných.
Zbývající soubory jsou soubory knihovny pro kontrolu správnosti alokací - check (viz literatura). Návod je přiložen a je též součástí souborů. Hlavičkový soubor je třeba načíst do každého zdrojového souboru projektu. Soubory knihovny nemusíte odevzdávat.



Úkol 4 – pokračování třída(zadáno na 6-tém tutoriálu – XX.XX.2011 odevzdáno do XX/XX.XX.2011

pokračujte rozšířením příkladu z minulého úkolu – opravte chyby. Nezapomínejte, že jedna třída („manažer“) řídí práci se seznamem, který je realizován pomocí druhé třídy/struktury. Splňte požadované názvy a počet souborů - jinak nedojde ke kontrole projektu a bude ohodnocen jako nepřeložitelný. V main ukázat volání všech metod, které byly vytvořeny, privátní metody volat v rámci jiných metod.

Napište do třídy metodu Pridej, která přidá prvek seznamu.
Napište metody OdeberPozice a OdeberHodnotu, které odeberou prvky (jako v úkolu 1).
Přidejte do třídy proměnnou, která bude držet informaci o aktuálním prvku seznamu, se kterým se pracuje (např. ukazatel aktual).
Napište metody Pocatek, Konec, Další, Minuly, které budou provádět operace s tímto aktuálním prvkem (příslušně ho přemístí, nastaví tak aby ukazoval na).
Napište funkci (ne metodu) Otoc, která vrátí (nový) seznam (CSeznam), který bude mít prvky seřazené v opačném pořadí oproti prvkům původního seznamu. Původní seznam/prvek zůstane nezměněn.
Napište metodu Otoc, která změní proměnnou tak, že přeskládá prvky seznamu v opačném pořadí (a vrátí tento nový seznam=přeskládaný starý).
Napište operátor „!“, který vrátí true lze-li pracovat se seznamem tj. obsahuje alespoň jeden prvek (vracené true je vlastně negace false, které značí, že aktuální seznam není použitelný)

Ukažte použití navržených metod. U dvojice Otoc to bude např.
S1 = Otoc(S2); S2 se nezmění
S3 = S2.Otoc(); S2 se změní, S1, S2 i S3 budou tedy mít stejné hodnoty

operátor ! by měl patřit ke třídě a je bez parametrů (unární, má pouze implicitní parametr prvku, který ho vyvolal).
if (!Seznam) printf(“seznam prázdný - nepracujem“); else printf(“aktuální seznam je použitelný“);



Úkol 5 – dokončení třída(zadáno na 7-mém tutoriálu – XX.XX.2011, odevzdáno XX.XX.2011

Napište pro strukturu prvku seznamu operátor „==“, který porovná prvky podle hodnoty nebo indexu, na základě statické proměnné této strukury.
Napište metody (ve třídě i struktuře), které příslušně nastaví tuto statickou proměnnou pro porovnávání.
Ve třídě napište metodu pro seřazení prvků.
Napište operátor = pro přiřazení seznamů.
Napište unární operátor + (který se chová k proměnným jako (tentýž) operátor u standardních typů)
Napište binární operátor - s parametrem int pro odstranění prvních prvků (počet dán int-em). Tento operátor by měl mít obdobné vlastnosti jako pro standardní typy (nemění ani jeden operand ...)
Napište metodu pro tisk prvků seznamu.

Ukažte použití navržených metod.


U metod (zvláště u operátorů +) preferujte předávání pomocí referencí (pokud je to možné).
Při trasování příkazu d = c = a - b ; si prověřte znalosti z volání metod, konstruktorů a destruktorů.









Poslední změna 2011-11-1