Ordnad lista. Listor... Ordnad lista... Ordnad lista typer

Relevanta dokument
Funktioner, Procedurer och Parametrar. Funktioner, Procedurer och Parametrar... Funktioner, Procedurer och Parametrar procedurspecifikation

Pascal. Vi har ofta behov av att behandla klumpar av data som i sig är inhomogena men sett över ett helt register har klumparna lika struktur.

Poster... Poster. Poster... Poster...

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Poster. Vi har ofta behov av att behandla klumpar av data som i sig är inhomogena men sett över ett helt register har klumparna lika struktur.

Kontinuerliga listor. Fält (listor) Kontinuerliga listor... Kontinuerliga listor...

Sökning och sortering

Python. Vi har ofta behov av att behandla datastrukturer på ett enhetligt sätt så att vi kan göra samma sak i flera olika program.

Sökning och sortering. Sökning och sortering - definitioner. Sökning i oordnad lista. Sökning med vaktpost i oordnad lista

GOTO och lägen. Några saker till och lite om snabbare sortering. GOTO och lägen (3) GOTO och lägen (2)

Några saker till och lite om snabbare sortering

Datastrukturer och algoritmer. Föreläsning 4 Test, Stack och Kö

Datastrukturer och algoritmer

Datastrukturer och algoritmer

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

ADS : STACK ADT: STACK. Stack och Kö -Implementering - Tilllämpningar. Oftast förekommande metoder i Stack. TopOfStack

Länkade strukturer. (del 2)

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning 2. Stackar, köer och listor TDDC91,TDDE22,725G97: DALG. Innehåll. 1 ADT stack. 1.1 Tillämpningar

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning 6: Introduktion av listor

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

Föreläsning Datastrukturer (DAT036)

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning 2 Datastrukturer (DAT037)

Programmering i C++ EDA623 Dynamiska datastrukturer. EDA623 (Föreläsning 11) HT / 31

Tentamen'('Datastrukturer,'algoritmer'och'programkonstruktion.'

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Stack, specifikation. Stack och Kö. Y s t M A p. Stack. <== > Y s t M A p <== > Prioritetskö

Föreläsning Datastrukturer (DAT036)

Standardfilerna Input och Output

Standardfilerna Input och Output. Filer... Filer... vanlig utbyggnad för ökad dynamik. Filer... filtyper

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Föreläsning 3. Stack

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Programmering i C++ EDAF30 Dynamiska datastrukturer. EDAF30 (Föreläsning 11) HT / 34

Föreläsning 11. ADT:er och datastrukturer

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Föreläsning 3. Stack

Några svar till TDDC70/91 Datastrukturer och algoritmer

Sökning i ordnad lista. Sökning och sortering. Sökning med vaktpost i oordnad lista

Datalogi, grundkurs 1

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Föreläsning Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT036)

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Omgivningar. Omgivningar är viktiga eftersom de avgör vilka namn som är synliga och därmed dessas innebörd och de värden som är förknippade med dem.

Tentamen Datastrukturer (DAT036)

TDIU01 - Programmering i C++, grundkurs

Lösningsförslag för tentamen i Datastrukturer (DAT036) från

Objektorienterad programmering E. Back to Basics. En annan version av printtable. Ett enkelt exempel. Föreläsning 10

Föreläsning 4 Innehåll

Föreläsning 4 Datastrukturer (DAT037)

Datastrukturer och algoritmer

Datalogi, grundkurs 1 Övningsuppgifter i Pascal. Serafim Dahl, Carina Edlund, Kjell Lindqvist m.fl.

Föreläsning 3 Datastrukturer (DAT037)

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 7. Träd och binära sökträd

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Länkade listor, stackar och köer

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Tentamen Datastrukturer (DAT036)

Föreläsning 7. Träd och binära sökträd

FÖRELÄSNING 11 DATALOGI I

Tentamen Datastrukturer (DAT036)

Föreläsning 8 Datastrukturer (DAT037)

Datastrukturer i Haskell

Föreläsning 7 Datastrukturer (DAT037)

Algoritmer och datastrukturer TDA Fredrik Johansson

Föreläsning 6 Datastrukturer (DAT037)

Grundläggande datalogi - Övning 1

Föreläsning Datastrukturer (DAT036)

Tentamen TEN1 HI

Föreläsning Datastrukturer (DAT037)

Föreläsning 10 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Tommy Färnqvist, IDA, Linköpings universitet

Tentamen i Algoritmer & Datastrukturer i Java

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 5 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 3 Datastrukturer (DAT037)

Tentamen kl Uppgift 4. Uppgift 5

Föreläsning 12. Länkade listor

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Tentamen i Algoritmer & Datastrukturer i Java

Data- och programstrukturer

So far... For recursive and iterative programs. Bubble, insertion, selection, quick, merge, counting

Tentamen TEN1 HI

Föreläsning 6 Datastrukturer (DAT037)

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

Introduktion till algoritmer - Lektion 3 Matematikgymnasiet, Läsåret Lektion 3

Tommy Färnqvist, IDA, Linköpings universitet. 1 ADT Map/Dictionary Definitioner Implementation... 2

Grundläggande datalogi - Övning 4

Transkript:

Listor... Ordnad lista Hur blir det om man skall sätta in och ta ut mitt i listan? Hur blir det om vi förutom referenser framåt också har referenser bakåt? Kan vi tänka oss annan organisation än linjära oordnade listor? Kan vi också ha olika element i listorna? Här ges koden för en Lista som är ordnad, homogen och diskontinuerlig. Först gränssnittet: Create Skapa ny tom lista Empty Är listan tom? Insert Sätt in ny post på rätt plats (sorterat efter nyckelvärde) Delete Ta bort post med visst nyckelvärde Member Finns det en post med visst nyckelvärde? Retrieve Återvinn information om post med visst nyckelvärde DA2001 (Föreläsning 15) Datalogi 1 Hösten 2010 1 / 20 DA2001 (Föreläsning 15) Datalogi 1 Hösten 2010 2 / 20 Ordnad lista... Ordnad lista typer Det behövs funktioner som jämför två nyckelvärden. Det räcker med lessthan och equal. Ex: FUNCTION lessthan(key1, key2: keytype): Boolean; lessthan := <key1 < key2> { med lämplig metod } FUNCTION equal(key1, key2: keytype): Boolean; equal := <key1 = key2> { med lämplig metod } Med de funktionerna kan element med nycklar som inte går att jämföra med vanliga jämförlseoperatorer ordnas enligt något kriterium som användaren väljer. keytype = { användardefinierad } key: keytype; { fler fält som definieras av användaren } entry: itemptr; next: elementptr; listptr = ^list; list = RECORD firstelement: elementptr; DA2001 (Föreläsning 15) Datalogi 1 Hösten 2010 3 / 20 DA2001 (Föreläsning 15) Datalogi 1 Hösten 2010 4 / 20

Ordnad lista - createlist och empty Ordnad lista member FUNCTION createlist: listptr; VAR tmp : listptr; New(tmp); tmp^.firstelement:= NIL; createlist := tmp FUNCTION empty(l: listptr): Boolean; empty := L^.firstElement = NIL; FUNCTION member(l: listptr; key: keytype): Boolean; VAR el: elementptr; el := L^.firstElement; WHILE (el <> NIL) AND lessthan(el^.entry^.key, key) DO el := el^.next; member := equal(el^.entry^.key, key) Med fallanalys: FUNCTION member(l: listptr; key: keytype): Boolean; FUNCTION search(el:elementptr):boolean; IF el = NIL THEN search := FALSE ELSE IF equal(key, el^.entry^.key) THEN search := TRUE ELSE IF lessthan(key, el^.entry^.key) THEN search := FALSE ELSE search := search(el^.next) member := search(l^.firstelement) DA2001 (Föreläsning 15) Datalogi 1 Hösten 2010 5 / 20 DA2001 (Föreläsning 15) Datalogi 1 Hösten 2010 6 / 20 Ordnad lista retrieve med fallanalys Ordnad lista delete med fallanalys FUNCTION retrieve(l:listptr; k:keytype):itemptr; VAR tmp : elementptr; FUNCTION find(el: elementptr): elementptr; IF el = NIL THEN find := NIL ELSE IF equal(k, el^.entry^.key) THEN find := el ELSE IF lessthan(k, el^.entry^.key) THEN find := NIL ELSE find := find(el^.next) tmp := find(l^.firstelement); IF tmp <> NIL THEN retrieve := tmp^.entry ELSE retrieve:= NIL FUNCTION delete( L:listPtr; k: keytype): listptr; FUNCTION delel(e: elementptr): elementptr; IF e <> NIL THEN IF equal(e^.entry^.key, k) THEN delel := e^.next; Dispose(e^.entry); Dispose(e) ELSE IF lessthan(e^.entry^.key, k) THEN delel := e; e^.next := delel(e^.next); ELSE delel := e ELSE delel := NIL; L^.firstElement := delel(l^.firstelement); delete := L DA2001 (Föreläsning 15) Datalogi 1 Hösten 2010 7 / 20 DA2001 (Föreläsning 15) Datalogi 1 Hösten 2010 8 / 20

Ordnad lista insert med fallanalys Varför speciella listelement ( containerelement )? FUNCTION insert(l:listptr; e: itemptr):listptr; FUNCTION insertel( e: elementptr): elementptr; WITH tmp^.entry^ DO IF e = nil THEN insertel := tmp ELSE IF lessthan(e^.entry^.key, key) THEN insertel := e; e^.next := insertel(e^.next) ELSE insertel := tmp; tmp^.next := e NEW(tmp); tmp^.next := nil; tmp^.entry := e; L^.firstElement := insertel(l^.firstelement); insert := L Ex: Antag att vi vill skapa en telefonkatalog som skall ge oss möjlighet att söka både i namnordning och efter telefonnummer: Med containerelement blir strukturen: Namn Telnr ADA,23 BEDA,13 EVA,31 DA2001 (Föreläsning 15) Datalogi 1 Hösten 2010 9 / 20 DA2001 (Föreläsning 15) Datalogi 1 Hösten 2010 10 / 20 Dubbellänkad lista... Variationer på listor Utan containerelement blir strukturen: Namn Telnr ADA,23 BEDA,13 EVA,31 BEDA,13 ADA,23 EVA,31 I detta (och många andra) fall är containerelement att föredra. Jag använder containerelement för att separera liststrukturen från det jag lagrar. Vi kan också ha länkar bakåt i listan: entry: itemptr; next, prev: elementptr; Övriga typdefinitioner oförändrade. Då erhålls en lista som är dubbellänkad. Det är ibland enklare att arbeta i en dubbellänkad lista men det krävs extra plats för ytterligare en länk. Vissa tillämpningar använder endast enkellänkad lista: stack och kö är två specialfall man måste titta närmare på DA2001 (Föreläsning 15) Datalogi 1 Hösten 2010 11 / 20 DA2001 (Föreläsning 15) Datalogi 1 Hösten 2010 12 / 20

De två viktiga specialfallen: stack och kö Stack och kö... När man utnyttjar enbart ena änden av en lista för både insättning och uttagning av element säger man sig ha en stack. En stack arbetar alltså efter principen sist in först ut (LIFO) och är en grundläggande datastruktur för olika datalogiska sammanhang. En kö har däremot principen först in först ut(fifo). enqueue dequeue push top bottom Stackar används vid (rekursiva) proceduranrop, hantering av blockstrukturer, beräkning av uttryck och avbrottshantering då man ofta sparar undan information på en stack för att senare kunna hämta information för att återta bearbetningen på rätt ställe i programmet. pop rear front Köer används vid simulering t.ex. för studium av väntetider och för att representera tid. Andra viktiga användningsområden är symboltabelluppbyggnad där antalet symboler i förväg inte är exakt känt. Vanligen inför man namn på början respektive slutet av listan. Dessa benämner vi För stack: top för toppen bottom för botten För kö: front för början rear för bakänden DA2001 (Föreläsning 15) Datalogi 1 Hösten 2010 13 / 20 DA2001 (Föreläsning 15) Datalogi 1 Hösten 2010 14 / 20 Stack Stack... En stack kan byggas på nästan samma sätt som en lista. Enda skillnaden är att insättning och borttagning alltid sker först i listan. key : integer; < user defined > entry : itemptr; next : elementptr stackptr = ^stack; stack = RECORD top : elementptr FUNCTION empty(s: stackptr): Boolean; empty := s^.top = NIL FUNCTION push(s: stackptr; i: itemptr): stackptr; New(tmp); tmp^.entry := i; tmp^.next := s^.top; s^.top := tmp; push := s DA2001 (Föreläsning 15) Datalogi 1 Hösten 2010 15 / 20 DA2001 (Föreläsning 15) Datalogi 1 Hösten 2010 16 / 20

Stack... Kö En kö är ett specialfall av lista där insättning alltid sker sist och borttagning alltid först (OBS! inte ett komplett program): FUNCTION pop(s: stackptr): itemptr; pop := NIL; IF empty(s) THEN error ELSE WITH s^ DO tmp := top; top := top^.next; pop := tmp^.entry; Dispose(tmp) key : integer; <user defined> entry : itemptr; next : elementptr; queueptr = ^queue; queue = RECORD front, rear : elementptr; VAR q : queueptr; DA2001 (Föreläsning 15) Datalogi 1 Hösten 2010 17 / 20 DA2001 (Föreläsning 15) Datalogi 1 Hösten 2010 18 / 20 Kö... Kö... FUNCTION enqueue(q: queueptr; e: itemptr): queueptr; WITH Q^ DO IF empty(q) THEN New(rear); front := rear ELSE New(rear^.next); rear := rear^.next rear^.entry := e; rear^.next := NIL enqueue := Q FUNCTION dequeue(q: queueptr): itemptr; VAR p: elementptr; dequeue := NIL; IF empty(q) THEN error ELSE WITH Q^ DO p := front; front := front^.next; dequeue := p^.entry; Dispose(p) FUNCTION empty(q: queueptr): Boolean; empty := Q^.front = NIL DA2001 (Föreläsning 15) Datalogi 1 Hösten 2010 19 / 20 DA2001 (Föreläsning 15) Datalogi 1 Hösten 2010 20 / 20