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