Lista
Datastrukturer och
algoritmer
• Modell
– Pärm
• Bläddra, inspektera, lägga till, ta bort
• Konstruktion
Föreläsning 3
– Dynamiskt med hjälp av länkade celler
– Statiskt med hjälp av fält/arrayer
58
59
Lista
•
•
•
•
Lista
Ändligt antal linjärt ordnade element
Första / sista element
Före / efter relation
Dynamisk datatyp
• Generisk datatyp (polytyp)
– Lista av typ
• Typ kan vara av vilken typ som helst
• Homogen datatyp
– Struktur och storlek förändras under datatypens
livslängd
– Alla element har samma typ
60
61
Lista
Gränsyta till Lista
abstract datatype List(val)
• Element
auxiliary pos
– Värde och position
! Empty() -> List(val)
Insert(v:val,p:pos,l:List(val))->(List(val),pos)
Isempty (l:List(val)) -> Bool
Inspect (p:pos,l:List(val)) -> val
First (l:List(val)) -> pos
End (l:List(val)) -> pos
Next(p:pos,l:List(val)) -> pos
Previous(p:pos,l:List(val)) -> pos
Remove((p:pos,l:List(val))
->(List(val),pos)
• Struktur
– Bortser från elementvärden
• Position
– Plats i strukturen
62
63
Länk till Cell kan används för
positioner
Tänkbar gränsyta i C
typedef void * Data;
list list_empty(void);
bool list_isEmpty(List l);
Pos list_insert(List l, Data v, Pos p);
Data list_inspect(List l,Pos p);
Pos list_first(List l);
Pos list_end(List l);
Pos list_next(List l, Pos p);
Pos list_previous(List l, Pos p);
Pos list_remove(List l, Pos p);
• I C:
– typedef Cell * Position;
• I Python kan Cell användas direkt då vi
alltid har referenser till värden
64
65
Algoritmmönster
Algoritmmönster
• Traversering
• Reduktion
– Beräknar en funktion av objektets elementvärden
– Besöker systematiskt alla element
• Ex. Summera alla tal i en lista
• Sökning
– Söker det första elementet som uppfyller ett
bestämt villkor
• Filtrering
• Mappning
– Transformera varje elementvärde i en datastruktur
• Ex. multiplicera alla talen i
! en lista med 4
– Filtrerar ut alla element som uppfyller ett
bestämt villkor
66
Lista som Fält
67
Länkade strukturer
• + Snabb inspektion av element
• - Fast reserverat utrymme
• - Kostsamt sätta in / ta bort element
+ Insättning / borttagning går snabbt
+ Minnesutrymmet är proportionellt mot
storleken
+ Allokerar minne när det behövs
- Länkarna behöver också minnesutrymme
- Kommer bara åt listelement genom att
traversera från listans början
68
69
Dubbellänkad Lista
Dubbellänkad lista
• Länkar mellan elementen
• Elementen är en cell som består av länkar
och värde
• Före insättning
70
-Dubbellänkad lista
Dubbellänkad lista
newNode skapas
nodeAfter = noden som ska vara
efter den nya noden
• Skapa ny nod för insättning nodeBefore
nodeBefore
nodeAfter
71
= nodeAfter:s
• Efter insättning och före borttagning
”bakåt” länk
newNode:s ”framåt” länk =
nodeAfter
newNode:s ”bakåt” länk =
nodeBefore
nodeBefore:s ”framåt” länk =
newNode
newNode
nodeAfter:s ”bakåt” länk =
newNode
72
Dubbellänkad lista
• Ta bort ett element
Dubbellänkad lista
• Efter borttagning
nodeToRemove
nodeBefore
73
nodeAfter
nodeBefore = nodeToRemove:s ”bakåt” länk
nodeAfter = nodeToRemove:s ”framåt” länk
nodeBefore:s ”framåt” länk = nodeAfter
nodeAfter:s ”bakåt” länk = nodeBefore
74
75
Riktad Lista
Riktad Lista
• Modell
• Previous och end behövs ej
• Isend lagts till
– Slalombana
• Kan bara flytta sig framåt
• Specialisering av Lista
76
77
Gränsyta till Riktad Lista
Riktad Lista
abstract datatype DList(val)
auxiliary pos
! Empty() -> DList(val)
Insert(v:val,p:pos,l:DList(val))
->(DList(val),pos)
Isempty (l:DList(val)) -> Bool
Inspect (p:pos,l:DList(val)) -> val
First (l:DList(val)) -> pos
Isend (p:pos,l:DList(val)) -> Bool
Next(p:pos,l:DList(val)) -> pos
Remove((p:pos,l:DList(val))
->(DList(val),pos)
• Konstruerad som
– Fält
– Dubbellänkad Lista
– Enkellänkad Lista
• Enkellänkad Lista
– Mer ekonomisk
78
79
Enkellänkad Lista
Enkellänkad Lista
• Problem vid insättning
• Lösning:
• Konstruktion utan huvud
– Stopplänkvärde (nil, null)
– Insättning före elementet X
– Representera position mha en länk till
föregångarelementet
– Listhuvud
•
•
•
•
• Tomma objekt
• Gränspositioner
80
Skapa en ny cell
Sätt in den efter X
Kopiera X:s värde till den nya cellen
Sätt X:s värde till v
81