Vázané seznamy
Jednosměrně vázaný seznam
Vytvořte knihovnu pro práci s jesnosměrně vázaným seznamem.
Knihovna bude obsahovat:
- funkci Push pro vložení
prvku na první pozici seznamu
- funkci Pop pro odebrání
prvku, který je na první pozici seznamu
- funci Print pro
vytištění hodnot prvků v seznamu
- funkci Destroy pro
zrušení seznamu.
Pro uzel vázaného seznamu nadefinujte strukturu
struct
TNode {
TYP iValue; // hodnota pro kterou je lineární seznam
vytvořen
TNode* iNext; }; // ukazatel na následující uzel seznamu
Pro práci se seznamem vytvořte strukturu
struct
TLinSeznam
{
TNode *iHead; // ukazatel na první prvek
seznamu
size_t iCount; // počet prvků v seznamu
TNode *iTail;
// ukazatel na poslední prvek seznamu
};
Krok 0: založte si nový projekt – zdrojový soubor
projektu mainseznam.c, zdrojový a hlavičkový soubor seznamu
seznam.h a seznam.c. Do projektu přidejte check.c
a check.h.
TYP definujte pomocí #define na typ double.
Při
psaní funkcí se soustřeďte na funkčnost. Testy vstupních parametrů
doplňte až v závěru práce (z programátorského hlediska není dobře,
ale funkčnost je nyní důležitější).
Krok 1: Definujte
strukturu uzlu seznamu TNode. Dále definujte strukturu seznamu
TLinSeznam a vytvořte její proměnnou ve funkci main a
inicializujte ji. Definice struktur budou v *.h souboru.
Krok
2: Napište funkci Push, která vloží prvek na začátek
seznamu.
void Push(TLinSeznam *Seznam, TNode *aVal);
Ve
funkci main vytvořte postupně dvě dynamické proměnné typu
TNode. Jejich hodnoty iValue nastavte na 1 a 2.
Proměnné vložte pomocí funkce Push do seznamu. Prvky se
stávají součástí seznamu, který provede jejich odalokaci.
Krok 3: Napište funkci
Pop,
která odebere prvek ze začátku seznamu. Prvek odalokuje a příslušně
upraví seznam.
void Pop(TLinSeznam
*Seznam);
Ve funkci
main vytvořte
postupně dvě dynamické proměnné typu TNode.
Jejich hodnoty iValue
nastavte na 3 a 4. Proměnné vložte
pomocí funkce Push
do seznamu. Proveďte jednu operaci
Pop.
Krok 4: napište funkci Print pro tisk seznamu na
konzolu (vytiskněte seznam).
void Print(TLinSeznam *aSeznam)
Ve
funkci main vytiskněte
seznam vytvořený v předchozích bodech.
Krok 5: Napište funkci Destroy pro zrušení seznamu.
Proveďte odalokování všech prvků seznamu a vynulování všech
proměnných struktury TLinSeznam.
void Destroy(TLinSeznam
*aSeznam)
Ve funkci main
zavolejte funkci Destroy
dvakrát po sobě, poté opět proveďte
přidání prvků jako v kroku 2. (Tím se zjistí, zda je ošetřeno
vícenásobné odalokování, a zda po odalokování je možné seznam znovu
použít)
Lineární seznam - pokračování
Krok 6: Napište
funkci Top, která
vrátí ukazatel na prvek TNode seznamu
na první pozici. Bude-li seznam prázdný, vrátí NULL.
Při úspěchu funkce vrátí ukazatel na prvek na udané pozici. Prvek
ponechá v seznamu.
TNode* Top(TLinSeznam *aSeznam);
Ve
funkci main s využitím
funkce Top nastavte
hodnotu v prvním prvku seznamu na hodnotu 100. Seznam vytiskněte.
Krok 7: Napište
funkci Remove pro
odebrání prvku z dané pozice seznamu TLinSeznam
(odeberte prvek na dané pozici
počítáno od počátku seznamu) – prvek je odebrán ze seznamu a
vrácen volající funkci. Ta ho musí odalokovat.
Funkce prvek vyjme
z dané pozice s upravením návazností. Dále provede příslušné změny v
TLinSeznam. Pokud bude
seznam kratší než udává index, vrátí NULL. Při úspěchu funkce vrátí
prvek na udané pozici.
TNode* Remove(TLinSeznam
*aSeznam, size_t aIndex);
Ve
funkci main postupně
vložte do seznamu deset prvkůl TNode s
hodnotami iValue 10 až
19. Následně pomocí funkce Remove vyberte
prvky od pozice 10 až 5 a ihned je uložte na počtáek seznamu funkcí
Push. Seznam
vytiskněte.
Krok 8: napište funkci Sort pro
seřazení prvků seznamu od nejmenšího po největší. Řazení provádějte
výměnou celých TNode.
void Sort(TLinSeznam
*aSeznami);
Krok 9: Doplňte program tak aby pracoval
korektně při volání s nevhodnými parametry.
Lineární seznam – pokračovávní:
Krok
7: Napište
funkci Insert
pro
přidání prvku na danou pozici seznamu TLinSeznam
(vložte
prvek na dané pozici počítáno od počátku seznamu).
Pokud bude
seznam kratší než udává index, vrátí hodnotu 1 a prvek nezařadí. Při
úspěchu funkce vrátí hodnotu nula.
int
Insert(TLinSeznam *aSeznam,
TNode* aVal, size_t aIndex);
Ve
funkci main postupně vložte do seznamu deset prvků TNode s hodnotami
iValue 100 s krokem 10 na sudé pozice počínaje pozicí 4. Seznam
vytiskněte.
Krok 9: Vytvořte nový projekt. Zkopírujte do něj soubory
vytvořené v předchozích bodech projektu.
Upravte struktury a
funkce pro práci s obousměrně vázaným seznamem.
Do struktury TNode
přidejte ukazatel na předchozí prvek
TNode*
iPred; // ukazatel na předchozí uzel seznamu
poslední úpravy 2019-02-12