Jednosměrně vázaný seznam



Vytvořte modul programu, který bude schopen uložit větší množství hodnot do pole. Předpokládejte, že pole může být i velice řídké (a mělo by tedy docházet i k jisté „kompresi“ při ukládání dat). Vyřešte odebírání prvků (se současným rušením těchto prvků – bude-li to nutné). Předpokládá se i požadavek na řazení prvků v poli podle velikosti.



Pro danou úlohu se hodí tzv. jednosměrně vázaný (lineární) seznam. Umožňuje rychlé vložení a vypuštění prvku (zvláště výhodné v setříděné variantě) bez nutnosti provádět posuvy prvků (vytvoření místa pro vkládaný prvek a posun prvků po odebrání prvku). Za to platíme paměťovým místem pro uložení „režijní“ proměnné, kterou je ukazatel na další prvek.

Napište tedy program pracující s jednosměrně vázaným seznamem (základem seznamu je struktura, která obsahuje v datové části „užitečné“ hodnoty a ukazatel na prvek stejného typu (strukturu). Tento ukazatel ukazuje na následující prvek seznamu, nebo nabývá hodnotu NULL je-li posledním prvkem.) V programu (nejlépe ve funkci) vytvořte pěti prvkový lineární seznam, hodnoty jehož prvků budou indexy pořadí v seznamu. Napište funkci, která má jeden parametr (počátek seznamu) a vytiskne indexy všech prvků v seznamu.

Nezapomeňte, že naalokované prvky musí být odalokovány.

Realizujte funkce:

Vytvoření seznamu – ve funkci, dynamicky (pomocí alokací)

Tisk seznamu – ve funkci

Zrušení seznamu – ve funkci (odalokování)

Seřazení seznamu – ve funkci podle indexů (od největšího)



Pro inspiraci jedna z možných „koster“ programu

struct LinSeznam {
// vlastní data
// ukazatel na další prvek LinSeznam
};

int Vytvor(LinSeznam ** UkNaPrvni, int počet)
{
// vytvorte pocet prvku LinSeznamu
// jako hodnoty naplňte číslem vytvoření 1 až počet
return 1; // uspech
}

void TiskniSeznam(LinSeznam *UkNaPrvni)
{
// vytisknout seznam
}



void SetridSeznam(LinSeznam **UkNaPrvni)
{

}



int ZrusSeznam(LinSeznam **UkNaPrvni)
{
// zrusi seznam
int pocet = 0;
return pocet ; // vrati pocet zrusenych
}

int main(int argc, char* argv[])
{
LinSeznam *Prvni;
Vytvor( ,5); // pokusime se vytvořit pětiprvkový seznam
TiskniSeznam( ); // předáme seznam a vytiskneme
SetridSeznam( ); // předáme seznam k seřazení
TiskniSeznam( ); // předáme seznam a vytiskneme
ZrusSeznam( ); // předáme seznam a zrušíme jeho prvky
SetridSeznam( ); // předáme seznam k seřazení
TiskniSeznam( ); // předáme seznam a vytiskneme
ZrusSeznam( ); // předáme seznam a zrušíme jeho prvky
return 0;
}





poslední úpravy 2008-10-24