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.

Relevanta dokument
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...

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

Funktioner, Procedurer och Parametrar. Funktioner, Procedurer och Parametrar... Funktioner, Procedurer och Parametrar procedurspecifikation

Standardfilerna Input och Output

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

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.

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

Sökning och sortering

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

Föreläsning 6: Introduktion av listor

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

Typsystem. DA2001 (Föreläsning 23) Datalogi 1 Hösten / 19

Typsystem. Typsystem... Typsystem... Typsystem... 2 *

Föreläsning 5: Introduktion av pekare

Minnestilldelning (allokering) och frigörande (avallokering) av minne

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Några saker till och lite om snabbare sortering

Föreläsning 5-6 Innehåll

Tommy Färnqvist, IDA, Linköpings universitet

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

Deklarationer/definitioner/specifikationer

Objektorienterad programmering Föreläsning 9. Copyright Mahmud Al Hakim Agenda (halvdag)

Datastrukturer och algoritmer

Lösningsförslag. TDDC74 Programmering: Abstraktion och modellering. Dugga 3 (provkod TEN1), Tid: kl 14-16, Datum:

Pascal. reserverade ord fördefinierade funktioner och procedurer egendefinierade funktioner, procedurer och objekt

Objektorienterad programmering i Java

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

Föreläsning REPETITION & EXTENTA

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Idag: Par och listor. Symboler. Symboler används för att uttrycka icke-numeriska data såsom namn, adress, bilregisternummer, boktitel, osv.

Pascal... Pascal. Pascal... Pascal...

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Idag: Par och listor. Scheme. DA2001 (Föreläsning 6) Datalogi 1 Hösten / 29

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

Datastrukturer. Erik Forslin. Rum 1445, plan 4 på Nada

F5: Högnivåprogrammering

F5: Högnivåprogrammering

Visual Basic, en snabbgenomgång

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Om att lära sig programmera. Föreläsning 1-2 Innehåll.

Tentamen Grundläggande programmering

Föreläsning 3.1: Datastrukturer, en översikt

2D1310 Programmeringsteknik Tentamen (1p) lördag 29 april 2000 kl 14-17

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

*Pekarvärden *Pekarvariabler & *

GRUNDER I VHDL. Innehåll. Komponentmodell Kodmodell Entity Architecture Identifierare och objekt Operationer för jämförelse

Repetition i Python 3. Exemplen fac. Exemplen fac motivering. Exemplen fac i Python

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Föreläsning 6 pekare och pekare tillsammans med arrayer

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

Repetition i Pascal. Exemplen fac. Exemplen fac i Pascal. Exemplen fac motivering. Orginalet

TDIU01 - Programmering i C++, grundkurs

Länkade strukturer. (del 2)

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

Datalogi I, grundkurs med Java 10p, 2D4112, Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera förs

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

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

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

Föreläsning 11. Arrayer. Arrayer. Arrayer. Lagrar flera värden av samma typ Kan vara primitiva typer eller objekt. Kan ha en array av t.

2 Pekare och dynamiska variabler.

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

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Typkonvertering. Java versus C

Funktionell programmering DD1361

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

TDDC77 Objektorienterad Programmering

Föreläsning 3-4 Innehåll

Agenda. Objektorienterad programmering Föreläsning 13

Abstraktion. procedurabstraktion. DA2001 (Föreläsning 26) Datalogi 1 Hösten / 27

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Java, klasser, objekt (Skansholm: Kapitel 2)

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Motivation. Programmeringsuppgift: En första ansats: Lagra info om anställda Håll reda på varje anställds närmaste chef. som också är en anställd!

[] Arrayer = Indexerad variabel

Enkla datatyper minne

Dagens föreläsning. Diverse Common Lisp. Konstanter, parametrar, globala variabler

Imperativ programmering. Föreläsning 2

Lektion 7. Datateknik A, Java I, 5 poäng

Datastrukturer och algoritmer

Föreläsning 10. Pekare (Pointers)

Dagens föreläsning Programmering i Lisp. - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning

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

TDDC74 Programmering: Abstraktion och modellering Datordugga 2 - exempel

Abstraktion. Abstraktion... Abstraktion... Abstraktion...

Datastrukturer. föreläsning 3. Stacks 1

Inledande programmering med C# (1DV402) 27+15=42 1 (22)

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 29 augusti 2015, kl 8 12

Datastrukturer och algoritmer

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

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

F7 - Arrayer. ID1004 Objektorienterad programmering Fredrik Kilander

Klasser och objekt, referenser Grundkurs i programmering med Python

Objekt och referenser

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Transkript:

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. TYPE car = RECORD model : 1900..2000; ndoors : 2..5; weight : 100..Maxint; cartype : (person, kombi, last); END; VAR mycar, yourcar : car; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 1 / 25

Poster... Enskilda fält kan nås med s.k. punktnotation BEGIN mycar.model := 2008; mycar.ndoors:= 3;... WriteLn(myCar.ndoors); IF yourcar.weight > mycar.weight THEN... yourcar := mycar; { alla fält kopieras } In och utmatning av hela poster kan INTE ske till/från terminalen. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 2 / 25

Poster... Representation av komplexa tal: Program complex(input,output); TYPE complexnumber = RECORD re,im : real; END; VAR z1 : complexnumber; FUNCTION impart(z : complexnumber):real; BEGIN impart:= z.im; END; BEGIN z1.im:=3; z1.re:=2; WriteLn( Den imaginära delen är:,impart(z1):0); END. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 3 / 25

Poster... När vi t.ex. adderar två komplexa tal får vi en ny post (RECORD) med resultatet i. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 4 / 25

Poster... När vi t.ex. adderar två komplexa tal får vi en ny post (RECORD) med resultatet i. För att konstruktorn skall kunna returnera resultatet måste det rymmas i ett ord. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 4 / 25

Poster... När vi t.ex. adderar två komplexa tal får vi en ny post (RECORD) med resultatet i. För att konstruktorn skall kunna returnera resultatet måste det rymmas i ett ord. Det är INTE tillåtet att returnera hela poster! DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 4 / 25

Poster... När vi t.ex. adderar två komplexa tal får vi en ny post (RECORD) med resultatet i. För att konstruktorn skall kunna returnera resultatet måste det rymmas i ett ord. Det är INTE tillåtet att returnera hela poster! En lösning på problemet är att lämna en adress till en post. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 4 / 25

Poster... När vi t.ex. adderar två komplexa tal får vi en ny post (RECORD) med resultatet i. För att konstruktorn skall kunna returnera resultatet måste det rymmas i ett ord. Det är INTE tillåtet att returnera hela poster! En lösning på problemet är att lämna en adress till en post. Hur representerar vi adresser? DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 4 / 25

Poster... När vi t.ex. adderar två komplexa tal får vi en ny post (RECORD) med resultatet i. För att konstruktorn skall kunna returnera resultatet måste det rymmas i ett ord. Det är INTE tillåtet att returnera hela poster! En lösning på problemet är att lämna en adress till en post. Hur representerar vi adresser? Program complex(input,output); TYPE complexpointer = ˆcomplexNumber; { complexpointer är adress till objekt av typen complexnumber } complexnumber = RECORD re,im : real; END; VAR z1,z2 : complexpointer; { variabler som innehåller } { adresser till objekt av typen complexnumber } DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 4 / 25

Poster... Program complex(input,output); TYPE complexpointer = ˆcomplexNumber; { complexpointer är adress till objekt av typen complexnumber } complexnumber = RECORD re,im : real; END; VAR z1,z2 : complexpointer; { variabler som innehåller } { adresser till objekt av typen complexnumber } BEGIN DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 5 / 25

Poster... Program complex(input,output); TYPE complexpointer = ˆcomplexNumber; { complexpointer är adress till objekt av typen complexnumber } complexnumber = RECORD re,im : real; END; VAR z1,z2 : complexpointer; { variabler som innehåller } { adresser till objekt av typen complexnumber } BEGIN New(z1); DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 5 / 25

Poster... Program complex(input,output); TYPE complexpointer = ˆcomplexNumber; { complexpointer är adress till objekt av typen complexnumber } complexnumber = RECORD re,im : real; END; VAR z1,z2 : complexpointer; { variabler som innehåller } { adresser till objekt av typen complexnumber } BEGIN New(z1); { skapa ett nytt objekt i minnet och } { låt z1 få dess adress } New(z2); DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 5 / 25

Poster... Program complex(input,output); TYPE complexpointer = ˆcomplexNumber; { complexpointer är adress till objekt av typen complexnumber } complexnumber = RECORD re,im : real; END; VAR z1,z2 : complexpointer; { variabler som innehåller } { adresser till objekt av typen complexnumber } BEGIN New(z1); { skapa ett nytt objekt i minnet och } { låt z1 få dess adress } New(z2); z1ˆ.im:=3; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 5 / 25

Poster... Program complex(input,output); TYPE complexpointer = ˆcomplexNumber; { complexpointer är adress till objekt av typen complexnumber } complexnumber = RECORD re,im : real; END; VAR z1,z2 : complexpointer; { variabler som innehåller } { adresser till objekt av typen complexnumber } BEGIN New(z1); { skapa ett nytt objekt i minnet och } { låt z1 få dess adress } New(z2); z1ˆ.im:=3; z1ˆ.re:=2; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 5 / 25

Poster... Program complex(input,output); TYPE complexpointer = ˆcomplexNumber; { complexpointer är adress till objekt av typen complexnumber } complexnumber = RECORD re,im : real; END; VAR z1,z2 : complexpointer; { variabler som innehåller } { adresser till objekt av typen complexnumber } BEGIN New(z1); { skapa ett nytt objekt i minnet och } { låt z1 få dess adress } New(z2); z1ˆ.im:=3; z1ˆ.re:=2; z2ˆ:=z1ˆ; { posten kopieras } DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 5 / 25

Poster... Program complex(input,output); TYPE complexpointer = ˆcomplexNumber; { complexpointer är adress till objekt av typen complexnumber } complexnumber = RECORD re,im : real; END; VAR z1,z2 : complexpointer; { variabler som innehåller } { adresser till objekt av typen complexnumber } BEGIN New(z1); { skapa ett nytt objekt i minnet och } { låt z1 få dess adress } New(z2); z1ˆ.im:=3; z1ˆ.re:=2; z2ˆ:=z1ˆ; { posten kopieras } IF z1 <> z2 THEN z2:=z1; { adressen kopieras } DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 5 / 25

Poster... Program complex(input,output); TYPE complexpointer = ˆcomplexNumber; { complexpointer är adress till objekt av typen complexnumber } complexnumber = RECORD re,im : real; END; VAR z1,z2 : complexpointer; { variabler som innehåller } { adresser till objekt av typen complexnumber } BEGIN New(z1); { skapa ett nytt objekt i minnet och } { låt z1 få dess adress } New(z2); z1ˆ.im:=3; z1ˆ.re:=2; z2ˆ:=z1ˆ; { posten kopieras } IF z1 <> z2 THEN z2:=z1; { adressen kopieras } Dispose(z2); { återlämna minnesutrymmet } END. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 5 / 25

Poster... Statisk variabel: DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 6 / 25

Poster... Statisk variabel: Den är deklarerad och har ett namn som används för att referera till variabeln. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 6 / 25

Poster... Statisk variabel: Den är deklarerad och har ett namn som används för att referera till variabeln. Det minnesutrymme som tilldelats vid ingången i ett block förblir reserverat under hela exekveringen av blocket. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 6 / 25

Poster... Statisk variabel: Den är deklarerad och har ett namn som används för att referera till variabeln. Det minnesutrymme som tilldelats vid ingången i ett block förblir reserverat under hela exekveringen av blocket. Ex. Heltalsvariabler, poster, osv. tal 2134 DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 6 / 25

Poster... Dynamisk variabel: DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 7 / 25

Poster... Dynamisk variabel: Kan skapas och dödas under exekveringen. Den dynamiska variabeln har inget namn utan man använder en referensvariabel för att referera till den. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 7 / 25

Poster... Dynamisk variabel: Kan skapas och dödas under exekveringen. Den dynamiska variabeln har inget namn utan man använder en referensvariabel för att referera till den. tal 2134 DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 7 / 25

Poster... Hur är de deklarerade? Statisk variabel: VAR tal: Integer; BEGIN tal:=2134;... DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 8 / 25

Poster... Dynamisk variabel: TYPE heltal = ˆheltalsTyp; heltalstyp = RECORD value:integer; END; VAR tal : heltal; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 9 / 25

Poster... Dynamisk variabel: TYPE heltal = ˆheltalsTyp; heltalstyp = RECORD value:integer; END; VAR tal : heltal; BEGIN New(tal); DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 9 / 25

Poster... Dynamisk variabel: TYPE heltal = ˆheltalsTyp; heltalstyp = RECORD value:integer; END; VAR tal : heltal; BEGIN New(tal); talˆ.value := 2134;... DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 9 / 25

Poster... Operationer: Skapa en ny dynamisk variabel DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 10 / 25

Poster... Operationer: Skapa en ny dynamisk variabel New(p); ny variabel av p:s typ, p sätts att referera till den nya variabeln. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 10 / 25

Poster... Operationer: Skapa en ny dynamisk variabel New(p); ny variabel av p:s typ, p sätts att referera till den nya variabeln. Utplåna en dynamisk variabel om p refererar till en dynamisk variabel så gör: Dispose(p); att minnesutrymmet, som p upptar, friställs för återanvändning och alla värden går förlorade. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 10 / 25

Poster... Operationer: Skapa en ny dynamisk variabel New(p); ny variabel av p:s typ, p sätts att referera till den nya variabeln. Utplåna en dynamisk variabel om p refererar till en dynamisk variabel så gör: Dispose(p); att minnesutrymmet, som p upptar, friställs för återanvändning och alla värden går förlorade. p har inget eget värde efter det att satsen exekverats. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 10 / 25

Poster... Tilldelning: p := tilldelning av referens. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 11 / 25

Poster... Tilldelning: p := tilldelning av referens. pˆ := tilldelning av värde. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 11 / 25

Poster... Tilldelning: p := tilldelning av referens. pˆ := tilldelning av värde. Det finns bara en referenskonstant: NIL = inget objekt DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 11 / 25

Poster... Tilldelning: p := tilldelning av referens. pˆ := tilldelning av värde. Det finns bara en referenskonstant: NIL = inget objekt NEW(p); p := NIL; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 11 / 25

Poster... Tilldelning: p := tilldelning av referens. pˆ := tilldelning av värde. Det finns bara en referenskonstant: NIL = inget objekt NEW(p); p := NIL; gör att en dynamisk variabel skapas i minnet. Då man sedan släpper referensen kan man aldrig mer komma åt objektet. Objektet tar så mycket minnesutrymme i anspråk som postdefinitionen föreskriver. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 11 / 25

Poster... PROGRAM complex(input,output); TYPE complexpointer = ˆcomplexNumber; complexnumber = RECORD re, im : Real END; VAR z,w: complexpointer; BEGIN END. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 12 / 25

Poster... PROGRAM complex(input,output); TYPE complexpointer = ˆcomplexNumber; complexnumber = RECORD re, im : Real END; VAR z,w: complexpointer; BEGIN New(z); END. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 12 / 25

Poster... PROGRAM complex(input,output); TYPE complexpointer = ˆcomplexNumber; complexnumber = RECORD re, im : Real END; VAR z,w: complexpointer; BEGIN New(z); New(w); END. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 12 / 25

Poster... PROGRAM complex(input,output); TYPE complexpointer = ˆcomplexNumber; complexnumber = RECORD re, im : Real END; VAR z,w: complexpointer; BEGIN New(z); New(w); Readln(zˆ.re, zˆ.im, wˆ.re, wˆ.im); END. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 12 / 25

Poster... PROGRAM complex(input,output); TYPE complexpointer = ˆcomplexNumber; complexnumber = RECORD re, im : Real END; VAR z,w: complexpointer; BEGIN New(z); New(w); Readln(zˆ.re, zˆ.im, wˆ.re, wˆ.im); z := add(z,w); END. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 12 / 25

Poster... PROGRAM complex(input,output); TYPE complexpointer = ˆcomplexNumber; complexnumber = RECORD re, im : Real END; VAR z,w: complexpointer; FUNCTION add(z1, z2: complexpointer): complexpointer; VAR w:complexpointer; BEGIN New(w); wˆ.re := z1ˆ.re + z2ˆ.re; wˆ.im := z1ˆ.im + z2ˆ.im; add := w END; BEGIN New(z); New(w); Readln(zˆ.re, zˆ.im, wˆ.re, wˆ.im); z := add(z,w); END. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 12 / 25

Poster... PROGRAM complex(input,output); TYPE complexpointer = ˆcomplexNumber; complexnumber = RECORD re, im : Real END; VAR z,w: complexpointer; FUNCTION add(z1, z2: complexpointer): complexpointer; VAR w:complexpointer; BEGIN New(w); wˆ.re := z1ˆ.re + z2ˆ.re; wˆ.im := z1ˆ.im + z2ˆ.im; add := w END; BEGIN New(z); New(w); Readln(zˆ.re, zˆ.im, wˆ.re, wˆ.im); z := add(z,w); Writeln(zˆ.re, zˆ.im) END. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 12 / 25

Poster... När vi i Scheme har gjort listor har vi använt oss av box-pekar diagram för att rita upp listorna. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 13 / 25

Poster... När vi i Scheme har gjort listor har vi använt oss av box-pekar diagram för att rita upp listorna. Exempelvis (define minlista (list 1 2 3)) 1 2 3 DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 13 / 25

Poster... När vi i Scheme har gjort listor har vi använt oss av box-pekar diagram för att rita upp listorna. Exempelvis (define minlista (list 1 2 3)) 1 2 3 Vi kan nu även i bygga upp en liknande struktur m.hj.a. pekare och poster. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 13 / 25

Poster... När vi i Scheme har gjort listor har vi använt oss av box-pekar diagram för att rita upp listorna. Exempelvis (define minlista (list 1 2 3)) 1 2 3 Vi kan nu även i bygga upp en liknande struktur m.hj.a. pekare och poster. Vi kan skapa minnesutrymme och länka samman dessa med pekare. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 13 / 25

Poster... När vi i Scheme har gjort listor har vi använt oss av box-pekar diagram för att rita upp listorna. Exempelvis (define minlista (list 1 2 3)) 1 2 3 Vi kan nu även i bygga upp en liknande struktur m.hj.a. pekare och poster. Vi kan skapa minnesutrymme och länka samman dessa med pekare. Det ger oss redskap för att bygga listor. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 13 / 25

Poster... När vi i Scheme har gjort listor har vi använt oss av box-pekar diagram för att rita upp listorna. Exempelvis (define minlista (list 1 2 3)) 1 2 3 Vi kan nu även i bygga upp en liknande struktur m.hj.a. pekare och poster. Vi kan skapa minnesutrymme och länka samman dessa med pekare. Det ger oss redskap för att bygga listor. Hur ska vi då lägga in data, arbeta med listor, ta bort element osv? DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 13 / 25

Pekare... PROGRAM ex; TYPE elementptr = ˆelement; element = RECORD entry: integer; next: elementptr END; VAR e1, e2 : elementptr; BEGIN { strukturen skapas för listan } DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 14 / 25

Pekare... PROGRAM ex; TYPE elementptr = ˆelement; element = RECORD entry: integer; next: elementptr END; VAR e1, e2 : elementptr; BEGIN { strukturen skapas för listan } NEW(e1); DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 14 / 25

Pekare... PROGRAM ex; TYPE elementptr = ˆelement; element = RECORD entry: integer; next: elementptr END; VAR e1, e2 : elementptr; BEGIN { strukturen skapas för listan } NEW(e1); NEW(e1ˆ.next); DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 14 / 25

Pekare... PROGRAM ex; TYPE elementptr = ˆelement; element = RECORD entry: integer; next: elementptr END; VAR e1, e2 : elementptr; BEGIN { strukturen skapas för listan } NEW(e1); NEW(e1ˆ.next); NEW(e1ˆ.nextˆ.next); DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 14 / 25

Pekare... PROGRAM ex; TYPE elementptr = ˆelement; element = RECORD entry: integer; next: elementptr END; VAR e1, e2 : elementptr; BEGIN { strukturen skapas för listan } NEW(e1); NEW(e1ˆ.next); NEW(e1ˆ.nextˆ.next); { tilldela värden i listan } e1ˆ.entry := 1; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 14 / 25

Pekare... PROGRAM ex; TYPE elementptr = ˆelement; element = RECORD entry: integer; next: elementptr END; VAR e1, e2 : elementptr; BEGIN { strukturen skapas för listan } NEW(e1); NEW(e1ˆ.next); NEW(e1ˆ.nextˆ.next); { tilldela värden i listan } e1ˆ.entry := 1; e1ˆ.nextˆ.entry := 2; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 14 / 25

Pekare... PROGRAM ex; TYPE elementptr = ˆelement; element = RECORD entry: integer; next: elementptr END; VAR e1, e2 : elementptr; BEGIN { strukturen skapas för listan } NEW(e1); NEW(e1ˆ.next); NEW(e1ˆ.nextˆ.next); { tilldela värden i listan } e1ˆ.entry := 1; e1ˆ.nextˆ.entry := 2; e1ˆ.nextˆ.nextˆ.entry := 3; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 14 / 25

Pekare... PROGRAM ex; TYPE elementptr = ˆelement; element = RECORD entry: integer; next: elementptr END; VAR e1, e2 : elementptr; BEGIN { strukturen skapas för listan } NEW(e1); NEW(e1ˆ.next); NEW(e1ˆ.nextˆ.next); { tilldela värden i listan } e1ˆ.entry := 1; e1ˆ.nextˆ.entry := 2; e1ˆ.nextˆ.nextˆ.entry := 3; e1ˆ.nextˆ.nextˆ.next := NIL; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 14 / 25

Pekare... PROGRAM ex; TYPE elementptr = ˆelement; element = RECORD entry: integer; next: elementptr END; VAR e1, e2 : elementptr; BEGIN { strukturen skapas för listan } NEW(e1); NEW(e1ˆ.next); NEW(e1ˆ.nextˆ.next); { tilldela värden i listan } e1ˆ.entry := 1; e1ˆ.nextˆ.entry := 2; e1ˆ.nextˆ.nextˆ.entry := 3; e1ˆ.nextˆ.nextˆ.next := NIL; { hjälppekare sätts att peka i listan } e2 := e1ˆ.nextˆ.next END. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 14 / 25

Pekare... NEW(e1); e1 entry next DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 15 / 25

Pekare... NEW(e1); e1 entry next NEW(e1ˆ.next); e1 entry next entry next DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 15 / 25

Pekare... NEW(e1); e1 entry next NEW(e1ˆ.next); e1 entry next entry next NEW(e1ˆ.nextˆ.next); e1 entry next entry next entry next DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 15 / 25

Pekare... NEW(e1); e1 entry next NEW(e1ˆ.next); e1 entry next entry next NEW(e1ˆ.nextˆ.next); e1 entry next entry next entry next { tilldela värden i listan, med bl.a.: } e1ˆ.nextˆ.nextˆ.next := NIL; e1 1 next 2 next 3 next NIL DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 15 / 25

Pekare... NEW(e1); e1 entry next NEW(e1ˆ.next); e1 entry next entry next NEW(e1ˆ.nextˆ.next); e1 entry next entry next entry next { tilldela värden i listan, med bl.a.: } e1ˆ.nextˆ.nextˆ.next := NIL; e1 1 next 2 next 3 next NIL { hjälppekare sätts att peka i listan } e2 := e1ˆ.nextˆ.next; e1 1 next 2 next 3 next NIL e2 DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 15 / 25

Listor kan (i princip) byggas på två sätt Kontinuerliga listor DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 16 / 25

Listor kan (i princip) byggas på två sätt Kontinuerliga listor Alla element ligger i en följd i datorns minne DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 16 / 25

Listor kan (i princip) byggas på två sätt Kontinuerliga listor Alla element ligger i en följd i datorns minne Index är ett offset från första komponenten DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 16 / 25

Listor kan (i princip) byggas på två sätt Kontinuerliga listor Alla element ligger i en följd i datorns minne Index är ett offset från första komponenten Kräver att utrymme kan reserveras då programmet startas DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 16 / 25

Listor kan (i princip) byggas på två sätt Kontinuerliga listor Alla element ligger i en följd i datorns minne Index är ett offset från första komponenten Kräver att utrymme kan reserveras då programmet startas Kan inte växa (eller krympa) dynamiskt DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 16 / 25

Listor kan (i princip) byggas på två sätt Kontinuerliga listor Alla element ligger i en följd i datorns minne Index är ett offset från första komponenten Kräver att utrymme kan reserveras då programmet startas Kan inte växa (eller krympa) dynamiskt (Den typ av listor jag inledningsvis diskuterade tillhör inte denna kategori) DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 16 / 25

Listor kan (i princip) byggas på två sätt Kontinuerliga listor Alla element ligger i en följd i datorns minne Index är ett offset från första komponenten Kräver att utrymme kan reserveras då programmet startas Kan inte växa (eller krympa) dynamiskt (Den typ av listor jag inledningsvis diskuterade tillhör inte denna kategori) Diskontinuerliga listor DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 16 / 25

Listor kan (i princip) byggas på två sätt Kontinuerliga listor Alla element ligger i en följd i datorns minne Index är ett offset från första komponenten Kräver att utrymme kan reserveras då programmet startas Kan inte växa (eller krympa) dynamiskt (Den typ av listor jag inledningsvis diskuterade tillhör inte denna kategori) Diskontinuerliga listor Elementen läggs där det finns plats i minnet, inte säkert i följd DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 16 / 25

Listor kan (i princip) byggas på två sätt Kontinuerliga listor Alla element ligger i en följd i datorns minne Index är ett offset från första komponenten Kräver att utrymme kan reserveras då programmet startas Kan inte växa (eller krympa) dynamiskt (Den typ av listor jag inledningsvis diskuterade tillhör inte denna kategori) Diskontinuerliga listor Elementen läggs där det finns plats i minnet, inte säkert i följd Man måste hålla reda på var nästa element finns så förutom elementet själv måste man lagra adressen till nästa element DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 16 / 25

Listor kan (i princip) byggas på två sätt Kontinuerliga listor Alla element ligger i en följd i datorns minne Index är ett offset från första komponenten Kräver att utrymme kan reserveras då programmet startas Kan inte växa (eller krympa) dynamiskt (Den typ av listor jag inledningsvis diskuterade tillhör inte denna kategori) Diskontinuerliga listor Elementen läggs där det finns plats i minnet, inte säkert i följd Man måste hålla reda på var nästa element finns så förutom elementet själv måste man lagra adressen till nästa element Fördelen är att listan kan växa och krympa dynamiskt DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 16 / 25

Listor kan (i princip) byggas på två sätt Kontinuerliga listor Alla element ligger i en följd i datorns minne Index är ett offset från första komponenten Kräver att utrymme kan reserveras då programmet startas Kan inte växa (eller krympa) dynamiskt (Den typ av listor jag inledningsvis diskuterade tillhör inte denna kategori) Diskontinuerliga listor Elementen läggs där det finns plats i minnet, inte säkert i följd Man måste hålla reda på var nästa element finns så förutom elementet själv måste man lagra adressen till nästa element Fördelen är att listan kan växa och krympa dynamiskt Man kan sedan ha homogena eller inhomogena listor: DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 16 / 25

Listor kan (i princip) byggas på två sätt Kontinuerliga listor Alla element ligger i en följd i datorns minne Index är ett offset från första komponenten Kräver att utrymme kan reserveras då programmet startas Kan inte växa (eller krympa) dynamiskt (Den typ av listor jag inledningsvis diskuterade tillhör inte denna kategori) Diskontinuerliga listor Elementen läggs där det finns plats i minnet, inte säkert i följd Man måste hålla reda på var nästa element finns så förutom elementet själv måste man lagra adressen till nästa element Fördelen är att listan kan växa och krympa dynamiskt Man kan sedan ha homogena eller inhomogena listor: I en homogen lista är alla element av samma typ. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 16 / 25

Listor kan (i princip) byggas på två sätt Kontinuerliga listor Alla element ligger i en följd i datorns minne Index är ett offset från första komponenten Kräver att utrymme kan reserveras då programmet startas Kan inte växa (eller krympa) dynamiskt (Den typ av listor jag inledningsvis diskuterade tillhör inte denna kategori) Diskontinuerliga listor Elementen läggs där det finns plats i minnet, inte säkert i följd Man måste hålla reda på var nästa element finns så förutom elementet själv måste man lagra adressen till nästa element Fördelen är att listan kan växa och krympa dynamiskt Man kan sedan ha homogena eller inhomogena listor: I en homogen lista är alla element av samma typ. I en inhomogen lista är elementen av olika typ. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 16 / 25

Listor kan (i princip) byggas på två sätt Kontinuerliga listor Alla element ligger i en följd i datorns minne Index är ett offset från första komponenten Kräver att utrymme kan reserveras då programmet startas Kan inte växa (eller krympa) dynamiskt (Den typ av listor jag inledningsvis diskuterade tillhör inte denna kategori) Diskontinuerliga listor Elementen läggs där det finns plats i minnet, inte säkert i följd Man måste hålla reda på var nästa element finns så förutom elementet själv måste man lagra adressen till nästa element Fördelen är att listan kan växa och krympa dynamiskt Man kan sedan ha homogena eller inhomogena listor: I en homogen lista är alla element av samma typ. I en inhomogen lista är elementen av olika typ. I Scheme kan man ha alla sorter DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 16 / 25

Listor kan (i princip) byggas på två sätt Kontinuerliga listor Alla element ligger i en följd i datorns minne Index är ett offset från första komponenten Kräver att utrymme kan reserveras då programmet startas Kan inte växa (eller krympa) dynamiskt (Den typ av listor jag inledningsvis diskuterade tillhör inte denna kategori) Diskontinuerliga listor Elementen läggs där det finns plats i minnet, inte säkert i följd Man måste hålla reda på var nästa element finns så förutom elementet själv måste man lagra adressen till nästa element Fördelen är att listan kan växa och krympa dynamiskt Man kan sedan ha homogena eller inhomogena listor: I en homogen lista är alla element av samma typ. I en inhomogen lista är elementen av olika typ. I Scheme kan man ha alla sorter I kan man bara ha homogena listor men både kontinuerliga och diskontinuerliga. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 16 / 25

Oordnad lista... Med de verktyg vi har kan vi konstruera en listhanterare som kan hantera oordnade element. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 17 / 25

Oordnad lista... Med de verktyg vi har kan vi konstruera en listhanterare som kan hantera oordnade element. Vi behöver kunna sätta in element, ta bort element och navigera i listan (vandra framåt och bakåt). DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 17 / 25

Oordnad lista... Med de verktyg vi har kan vi konstruera en listhanterare som kan hantera oordnade element. Vi behöver kunna sätta in element, ta bort element och navigera i listan (vandra framåt och bakåt). Därför ska vi skriva funktionerna DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 17 / 25

Oordnad lista... Med de verktyg vi har kan vi konstruera en listhanterare som kan hantera oordnade element. Vi behöver kunna sätta in element, ta bort element och navigera i listan (vandra framåt och bakåt). Därför ska vi skriva funktionerna insert, DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 17 / 25

Oordnad lista... Med de verktyg vi har kan vi konstruera en listhanterare som kan hantera oordnade element. Vi behöver kunna sätta in element, ta bort element och navigera i listan (vandra framåt och bakåt). Därför ska vi skriva funktionerna insert, delete, DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 17 / 25

Oordnad lista... Med de verktyg vi har kan vi konstruera en listhanterare som kan hantera oordnade element. Vi behöver kunna sätta in element, ta bort element och navigera i listan (vandra framåt och bakåt). Därför ska vi skriva funktionerna insert, delete, settofirst DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 17 / 25

Oordnad lista... Med de verktyg vi har kan vi konstruera en listhanterare som kan hantera oordnade element. Vi behöver kunna sätta in element, ta bort element och navigera i listan (vandra framåt och bakåt). Därför ska vi skriva funktionerna insert, delete, settofirst next och DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 17 / 25

Oordnad lista... Med de verktyg vi har kan vi konstruera en listhanterare som kan hantera oordnade element. Vi behöver kunna sätta in element, ta bort element och navigera i listan (vandra framåt och bakåt). Därför ska vi skriva funktionerna insert, delete, settofirst next och previous. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 17 / 25

Oordnad lista... Med de verktyg vi har kan vi konstruera en listhanterare som kan hantera oordnade element. Vi behöver kunna sätta in element, ta bort element och navigera i listan (vandra framåt och bakåt). Därför ska vi skriva funktionerna insert, delete, settofirst next och previous. Dessutom behöver vi kunna hämta element och testa om vi navigerar i listan. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 17 / 25

Oordnad lista... Med de verktyg vi har kan vi konstruera en listhanterare som kan hantera oordnade element. Vi behöver kunna sätta in element, ta bort element och navigera i listan (vandra framåt och bakåt). Därför ska vi skriva funktionerna insert, delete, settofirst next och previous. Dessutom behöver vi kunna hämta element och testa om vi navigerar i listan. Till det skriver vi funktionerna retrieve och DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 17 / 25

Oordnad lista... Med de verktyg vi har kan vi konstruera en listhanterare som kan hantera oordnade element. Vi behöver kunna sätta in element, ta bort element och navigera i listan (vandra framåt och bakåt). Därför ska vi skriva funktionerna insert, delete, settofirst next och previous. Dessutom behöver vi kunna hämta element och testa om vi navigerar i listan. Till det skriver vi funktionerna retrieve och isonlist? DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 17 / 25

Oordnad lista... Med de verktyg vi har kan vi konstruera en listhanterare som kan hantera oordnade element. Vi behöver kunna sätta in element, ta bort element och navigera i listan (vandra framåt och bakåt). Därför ska vi skriva funktionerna insert, delete, settofirst next och previous. Dessutom behöver vi kunna hämta element och testa om vi navigerar i listan. Till det skriver vi funktionerna retrieve och isonlist? Men vi börjar med typspecifikationerna: DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 17 / 25

Oordnad lista... TYPE itemptr = ˆitem; item = RECORD <user defined> END; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 18 / 25

Oordnad lista... TYPE itemptr = ˆitem; item = RECORD <user defined> END; elementptr = ˆelement; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 18 / 25

Oordnad lista... TYPE itemptr = ˆitem; item = RECORD <user defined> END; elementptr = ˆelement; element = RECORD entry : itemptr; next : elementptr END; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 18 / 25

Oordnad lista... TYPE itemptr = ˆitem; item = RECORD <user defined> END; elementptr = ˆelement; element = RECORD entry : itemptr; next : elementptr END; listptr = ˆlist; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 18 / 25

Oordnad lista... TYPE itemptr = ˆitem; item = RECORD <user defined> END; elementptr = ˆelement; element = RECORD entry : itemptr; next : elementptr END; listptr = ˆlist; list = RECORD first, cursor : elementptr END; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 18 / 25

Oordnad lista... TYPE itemptr = ˆitem; item = RECORD <user defined> END; elementptr = ˆelement; element = RECORD entry : itemptr; next : elementptr END; listptr = ˆlist; list = RECORD first, cursor : elementptr END; VAR L : listptr; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 18 / 25

Oordnad lista... Om man vill slippa skriva Lˆ. för varje fält (och dessutom snabbare komma åt fälten) kan man skriva: WITH Lˆ DO { här når man fälten i Lˆ utan punktnotation }; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 19 / 25

Oordnad lista... Om man vill slippa skriva Lˆ. för varje fält (och dessutom snabbare komma åt fälten) kan man skriva: WITH Lˆ DO { här når man fälten i Lˆ utan punktnotation }; WITH q1 DO WITH q2 DO { om q1 och q2 har överlappande fältnamn } { så kommer man åt q2:s fält } DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 19 / 25

Oordnad lista... Om man vill slippa skriva Lˆ. för varje fält (och dessutom snabbare komma åt fälten) kan man skriva: WITH Lˆ DO { här når man fälten i Lˆ utan punktnotation }; WITH q1 DO WITH q2 DO { om q1 och q2 har överlappande fältnamn } { så kommer man åt q2:s fält } WITH q1, q2 DO { fälten i q1 och q2 tillgängliga }; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 19 / 25

Oordnad lista... insert sätter in först i listan. Man skulle kunna tänka sig att sätta in på platsen för cursor eller sist. (Fundera över hur man gör då) FUNCTION insert(l: listptr; e: itemptr): listptr; VAR p : elementptr; BEGIN NEW(p); pˆ.entry := e; pˆ.next := Lˆ.first; Lˆ.first := p; insert := L END; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 20 / 25

Oordnad lista... Funktionen delete tar bort det element som cursor pekar på genom att sätta in listans första element på platsen för cursor och sedan ta bort listans första element. delete bevarar alltså inte listans ordning. FUNCTION delete(l: listptr): listptr; VAR tmp : elementptr; BEGIN delete := L; IF Lˆ.cursor <> NIL THEN WITH Lˆ DO BEGIN cursorˆ.entry := firstˆ.entry; tmp := first; first := firstˆ.next; Dispose(tmp) END ELSE error END; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 21 / 25

Oordnad lista... settofirst sätter cursor att peka på det första elementet i listan. OBS! att om listan är tom förblir värdet på cursor = NIL. FUNCTION settofirst(l: listptr): listptr; BEGIN Lˆ.cursor := Lˆ.first; settofirst := L; END; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 22 / 25

Oordnad lista... Funktionen next flyttar cursor ett steg framåt om cursor pekar på ett element i listan, annars händer ingenting. FUNCTION next(l:listptr): listptr; BEGIN IF Lˆ.cursor <> NIL THEN WITH Lˆ DO cursor := cursorˆ.next; next:=l; END; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 23 / 25

Oordnad lista... previous sätter cursor att peka på elementet före det som cursor just nu pekar på. Eftersom det inte finns pekare till föregående element måste man utgående från det första elementet i listan hitta det, vars next-pekare pekar på samma element som cursor gör. DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 24 / 25

Oordnad lista... previous sätter cursor att peka på elementet före det som cursor just nu pekar på. Eftersom det inte finns pekare till föregående element måste man utgående från det första elementet i listan hitta det, vars next-pekare pekar på samma element som cursor gör. FUNCTION previous(l: listptr): listptr; BEGIN WITH Lˆ DO IF (cursor = first) OR (cursor = NIL) THEN cursor := NIL ELSE cursor := findprev(first); previous := L END; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 24 / 25

Oordnad lista... previous sätter cursor att peka på elementet före det som cursor just nu pekar på. Eftersom det inte finns pekare till föregående element måste man utgående från det första elementet i listan hitta det, vars next-pekare pekar på samma element som cursor gör. FUNCTION previous(l: listptr): listptr; FUNCTION findprev(anelement: elementptr): elementptr; BEGIN WHILE anelementˆ.next <> Lˆ.cursor THEN anelement := anelementˆ.next; findprev := anelement END; BEGIN WITH Lˆ DO IF (cursor = first) OR (cursor = NIL) THEN cursor := NIL ELSE cursor := findprev(first); previous := L END; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 24 / 25

Oordnad lista... retrieve återsänder en pekare till den information som finns lagrad i det listelement som cursor pekar på, men om cursor inte pekar på något element återsänds NIL. FUNCTION retrieve( L:listPtr): itemptr; BEGIN WITH Lˆ DO IF cursor <> NIL THEN retrieve := cursorˆ.entry ELSE retrieve := NIL END; isonlist kontrollerar om cursor pekar på något element i listan eller inte. FUNCTION isonlist(l: listptr): Boolean; BEGIN isonlist := Lˆ.cursor <> NIL END; DA2001 (Föreläsning 14) Datalogi 1 Hösten 2010 25 / 25