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 kodu 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 – 24.10.2009 odevzdáno do 4/07.11.2009

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í vázaný seznam (implementace seznamu). Hlavičkový soubor definic a prototypů funkcí doplňující soubor seznamu.
Navrhněte strukturu 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ěnovat 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
.
Algoritmy funkcí by měly fungovat i pro prázdný seznam.
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 (ZrusSeznam), která zruší celý seznam. Ukažte volání na prázdný i naplněný seznam.
Napište funkci (OdeberPozice), která odebere prvek na dané pozici – existuje-li tato pozice.
Napište funkci (OdeberHodnotu), 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 07.11.2009 odevzdáno do 18./21.11.2009

(Ú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 (Zjisti), 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í (demonstující různé varianty volání).





Úkol 3 – základy třídy (pro KPPC zadáno na 5-tém tutoriálu 21.11.2009 odevzdáno do 2.12/5.12.2009

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 implemtová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 long int) vytvoří seznam s tímto počtem prvků (a vyplní proměnnou index hodnotami od nuly s inkrementací o jedna pro další prvky, a datový člen (ve struktuře ho zastupuje ukazatel na double) naplní tak, že jeho hodnoty budou náhodné),
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).
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 a (totéž) pro strukturu SPrvek, poslední soubor bude zdrojový soubor s funkcí main, která bude volat demonstrační funkci Test, ve které bude ukázána činnost třídy.



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

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.

Napište do třídy metodu PridejPrvek, 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 aktualni).
Napište metody NaPrvní, NaPoslední, NaDalší, NaPředchozí, 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) Inv, která vrátí (nový) seznam, který bude mít prvky seřazené v opačném pořadí oproti prvkům původního seznamu. Původní prvek zůstane nezměněn.
Napište metodu Inv, která změní prvek tak, že přeskládá prvky seznamu v opačném pořadí (a vrátí tento nový prvek).
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 Inv to bude např.
S1 = Inv(S2); S2 se nezmění
S3 = S2.Inv(); 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 – 19.12.2009, odevzdáno 4.1.2010

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 + pro spojení dvou seznamů. 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 2009-11-27