Lineární spojový seznam
Z CHWiki
http://tutchek.igroup.cz/wiki/spojak-ico.gif (angl. Linked list)
Obsah |
[editovat] Popis
Lineární spojový seznam je datová struktura určená k ukládání dat předem neznámé délky. Program obsahuje ukazatel na první prvek seznamu (volitelně i na poslední prvek. V případě, že není ukazatel na poslední prvek seznamu neplatí složitosti u vkládání a mazání z konce). Každý prvek seznamu obsahuje data a ukazatel na další prvek seznamu. Je-li seznam obousměrný lineární spojový seznam obsahuje každý prvek i ukazatel na předchozí prvek. První a případně poslední prvek mají ukazatel na následovníka resp. předchůdce nastavený na NIL.
[editovat] Složitost
- Vložení prvku na konec - O(1)
- Vložení prvku X za prvek Y - O(n)
- Delete prvku na konci - O(1)
- Delete prvku X - O(n)
- Vyhledání prvku X - O(n)
[editovat] Implementace
Mnoha způsoby, my zde zavedeme tuto (jedná se o obousměrný lineární spojiový seznam):
struktura prvek:
- data: libovolný datový typ - informace ukládaná do seznamu
- dalsi: ukazatel na prvek
- predchozi: ukazatel na prvek
struktura seznam:
- prvni: ukazatel na prvek - výchozí hodnota NIL
- posledni: ukazatel na prvek - výchozí hodnota NIL
[editovat] Algoritmy
[editovat] Vložení prvku na konec
- Vytvoř objekt X typu prvek
- X.data = data, X.dalsi = NIL
- Pokud seznam.posledni = NIL: seznam.prvni = ukazatel(X), seznam.posledni = ukazatel(X), X.predchozi = NIL
[editovat] Vložení prvku X za prvek Y
- Vytvoř objekt X typu prvek
- uk = Find(Y)
- Pokud uk není NIL
- X.dalsi = uk.dalsi
- uk.dalsi = ukazatel(X)
- X.predchozi = uk
- Pokud seznam.posledni == uk, potom seznam.posledni = ukazatel(X)
[editovat] Smazání posledního prvku
- uk = seznam.posledni.predchozi
- Smaž seznam.posledni
- seznam.posledni = uk
- Pokud uk == NIL, potom seznam.prvni = NIL, jinak uk.dalsi = NIL
[editovat] Smazání prvku X
- uk = Find(X)
- Pokud uk není NIL
- Pokud seznam.posledni == uk, potom seznam.posledni = uk.predchozi
- Pokud seznam.prvni == uk, potom seznam.prvni = uk.dalsi
- Pokud uk.predchozi není NIL, potom uk.predchozi.dalsi = uk.dalsi
- Pokud uk.dalsi není NIL, potom uk.dalsi.predchozi = uk.predchozi
- Smaž uk
[editovat] Vyhledání prvku X
- uk = seznam.prvni
- Dokud platí: (uk není NIL) a zároveň (uk není X) opakuj:
- uk = uk.dalsi
- Návratová hodnota = uk
