Lista jednokierunkowa to ciąg elementów (obiektów) w którym każdy element
zawiera atrybut wartość oraz nast. Atrybut nast wskazuje na
kolejny element w liście. Jeśli x wskazuje pewien element listy to jego
wartość odczytujemy przez wartość[x], natomiast wartość następnego
elementu listy odczytujemy przez wartość[nast[x]]. Jak widać w naszej
notacji utożsamiamy zmienną obiektową i wskazanie na zmienną obiektową.
Listę
reprezentujemy przez obiekt L, który zawiera atrybuty głowa i
ogon wskazujące pierwszy i ostatni element listy.
Przyjmujemy zasadę że ostatni element listy ma wartość nil w atrybucie nast.
Zarówno lista jak i tablica służą do przechowywania elementów ... czym się więc
różnią ?
tabela | lista |
dostęp do elementu przez indeks, np można się łatwo dostać do środkowego elementu tabeli (co jest używane w "wyszukiwaniu binarnym") | dostęp do elementów przez wskazania; mając wsk na pewien element listy, mam bezpośredni dostęp tylko do następnego elementu listy |
trudno wstawić nowy element w środek tabeli (trzeba przesuwać wiele elementów) | łatwo wstawić element do listy |
tablica zabiera stałą ilość miejsca w pamięci komputera | ilość miejsca w pamięci zależy od liczby elementów listy (to jest bardziej ekonomiczne rozwiązanie) |
Przykładowy kod wypisujący elementy listy L:
procedura WypiszElementy(L) x <- głowa[L] while x<>nil do pisz wartość[x] x <- nast[x]
.......................................................................................................
Zadanie 110
Zaimplementuj następujące operacje na listach jednokierunkowych:
Założenia dodatkowe i wskazówki: Zakładamy że parametry "listowe" czyli L, L1 itp są przekazywane przez zmienną, tj procedura może modyfikować ich atrybuty. Podczas wykonywania operacji na liście pamiętaj o tym że czasami trzeba modyfikować atrybuty L (np podczas usuwania pierwszego elementu listy).
W liście dwukierunkowej element x listy ma bezpośredni dostęp do
następnego i poprzedniego elementu listy poprzez atrybuty pop i nast
...
Przyjmujemy zasadę że pierwszy element ma nil w atrybucie pop, a ostatni element listy ma nil w atrybucie nast.
Zadanie 111
Zaimplementuj następujące operacje na listach dwukierunkowych:
Wygodnie jest programować operacje na listach dwukierunkowych jeśli
wprowadzimy tzw wartownika ...
Pierwszy element listy to następnik wartownika; ostatni element listy to poprzednik wartownika; lista pusta składa się tylko z wartownika.
Zadanie 112
Zaimplementuj następujące operacje na listach dwukierunkowych z
wartownikiem: