2.6 KiB
2.6 KiB
Seznam
- abstraktní datová struktura
- umožňuje vložení i odebrání prvku z jakékoliv pozice
Jak specifikovat pozici?
- indexem
- aktuální pozice
Ukazovátko
- ukazuje na aktuální pozici v seznamu
- posun dopředu i na začátek
- operace v
\Theta(1)
- možné interpretace:
- ukazuje na prvek
- některé operace problematické (např. vložení - před nebo za prvek?)
- ukazuje mezi prvky
- jednoznačné vkládání: sem
- vybírání/odebírání dohodou - třeba prvek napravo
- ukazuje na prvek
Implementace spojovou strukturou
- opět spojovací dílek - data a následující prvek
- reference na první (
first
) a aktuální prvek (current
) - ukazovátko míří na
current
acurrent.next
- je-li
current = null
, míří se před první prvek seznamu - pohyb ukazovátka:
moveToFirst
- na začáteknext
- na další prvek- potřeba myslet na posun z
null
a neexistující další prvek
- potřeba myslet na posun z
- přidávání mezi dva prvky:
- přepíše se odkaz
current.next
na vložený prvek - vloženému prvku se nastaví původní
current.next
- přepíše se odkaz
- mazání prvku
- vyřešení speciálních případů (na začátku, na konci)
current.next = current.next.next
, prvek se přeskočí
- vybrání prvku na zadané pozici
- projdeme seznam od začátku
\Omega(n)
složitost!
Iterátor
- seznam neumožňuje prácí na více místech
- vznik odděleného ukazovátka od dat - iterátoru (návrhový vzor)
- třída, která má aktuální index
current
a referencilist
- stejná implementace jako u seznamu (místo
first
se použijelist.first
)`
Operace
- vybrání dat napravo (
get()
) - posunutí doprava (
next()
) - vrácení na začátek (
moveToFirst()
) - přidání prvku na pozici (
insert(...)
) - odstranění prvku napravo (
remove()
) - vytvoření klonu (
clone()
), který ukazuje na stejný prvek
Problémy
- iterátory o sobě nevědí
- jeden smaže prvek, na který odkazuje jiný iterátor
- řešení
- používat více iterátorů pouze pro čtení
- při editaci zajistit, aby nebyl zasažen jiný iterátor
- pohyb pouze dopředu
- řešení: obousměrně zřetězený seznam
- spojovací prvek s
next
iprevious
- v iterátoru nová metoda
previous()
- složitější konzistence struktury
- 2x více režijní paměti
Implementace paralelními poli
- jen dopředné zřetězení
- dvě stejně dlouhá pole
- pro data
- pro index následovníka (
next
) - prázdného či obsazeného prvku
- index začátku
first
- index volného pole
empty
- index aktuálního prvku
current