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