Lenkelister. Lister og køer. INF1010 Stein Michael Storleer 27. januar 2011
Dagens forelesning Lenkede lister Lenkede lister Eksempel på en lenket liste: personliste Operasjoner på lenkede lister (enkeltlenket) Lister og køer Hva er en liste? FIFO- og LIFO-lister Datastrukturer Grafer (lister og trær) Objektorientert programmering Hvordan jobbe med INF1010 Forskjellige Studieaktiviteter Pensum Øvelser til neste fellesøvelse michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 2
Pekervariable og variable av primitive typer class Heltall { int t a l l ; Heltall ( int t ) { t a l l = t ; } } int a=0, b=7; Heltall refa, refb ; refa = new Heltall ( 0 ) ; refb = new Heltall ( 7 ) ; a = b; refa = refb ; b = 8; refb. t a l l = 8; System. out. println ( a, b, refa. t a l l, refb. t a l l ) ; michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 3
0 7 0 7 a b refa refb a = b; refa = refb; 7 7 7 a b refa refb b = 8; refb.tall = 8; 7 8 8 a b refa refb michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 4
Hva er en lenket liste? Jonathan Susanne Imran Nikita Adnan personliste Alle disse begrepene betegner det samme sammensatte objektet: pekerkjedeliste enkeltlenket liste pekerliste lenket liste lenkeliste linked list (vanligst på engelsk) chained list Objektene i lista har pekere for å referere til neste (evt. forrige) objekt. Slik bygges lista opp som en sammenhengende lenke av objekter ved hjelp av pekere. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 5
En første skisse av personlista. Først klassen som beskriver objektene (personene) som skal lenkes sammen. Deretter en klasse som beskriver selve lista. class Person { String navn ; Person nesteperson ; // andre attributter } class Personer { Person personliste ; //... } Lage en ny liste med personer: Personer minevenner = new Personer ; michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 6
Personobjektet Samme objekt (instans) av klassen Person tegnet på tre måter. Pekeren nesteperson kan peke på et objekt (instans) av samme klasse (evt. NULL). "Taher"... navn Taher Taher type: String nesteperson navn: navn type: Person navn: nesteperson michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 7
Et listeobjekt En instans av klassen Personer og de objektene (instanser av klassen Person) som er tilgjengelige fra den, dvs som programmet kan nå ved å følge pekerne. Person Person Person Person Person nesteperson String navn nesteperson String nesteperson String nesteperson String Jonathan Susanne Imran Nikita Elisabeth navn navn navn navn Person nesteperson String Figur: Objektdiagram av en personliste med 5 personer null personliste Et objekt av klassen Personer michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 8
Forenklet listeobjekt En instans av klassen Personer (med metoder) og de objektene (instanser av klassen Person) som er tilgjengelige fra den, dvs som programmet kan nå ved å følge pekerne. Jonathan Susanne Imran Nikita Adnan personliste michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 9
Hvilke operasjoner trenger vi? sette inn en ny person finne en person fjerne en person bytte om to personer... class Personer { Person personliste ; } void setteinnperson ( Person inn ) { } ; void finneperson ( Person p ) { } ; void tautperson ( Person ut ) { } ; //... michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 10
Innsetting først sist sortert etter en attributtverdi prioritet tid i lista Før vi kan bestemme det, må vi vite hvordan lista skal administreres? F.eks. om den skal være FIFO eller LIFO. Hvis vi ikke vet det, kan vi lage flere innsettingsmetoder. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 11
Innsetting først (LIFO) void settinnpersonforst ( Person inn ) { \\ Hvis l i s t a er tom, sett inn objektet i f ( personliste == null ) personliste = inn ; else { \\ minst et objekt i l i s t a inn. nesteperson = personliste ; personliste = inn } } michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 12
Innsetting etter et bestemt objekt /* * Setter personobjektet i inn etter personobjektet e * Hverken i e l l e r e er NULL. * @param e Personobjektet som skal ha i som neste * @param i Personobjektet som skal inn etter e */ void settinnpersonetter ( Person e, Person i ) { i. nesteperson = e. nesteperson ; e. nesteperson = i ; } e i michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 13
Innsetting etter et bestemt objekt e i i. nesteperson = e. nesteperson ; e i michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 14
Innsetting etter et bestemt objekt e i e. nesteperson = i ; e i michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 15
Innsetting etter et bestemt objekt Strukturen etter at metoden er ferdig: Vi flytter litt på objektene: michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 16
Innsetting sist (FIFO) void settinnpersonsist ( Person inn ) { \\ Hvis l i s t a er tom, sett inn objektet først i f ( personliste == null ) personliste = inn ; else { \\ finne siste element i l i s t a Person p = personliste ; while ( p. nesteperson!= null ) p = p. nesteperson ; \\ her er p. nesteperson==null, altså er p siste p. nesteperson = inn } } michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 17
Peker til siste element i lista Person Person Person Person Person nesteperson String navn nesteperson String nesteperson String nesteperson String nesteperson String Jonathan Susanne Imran Nikita Elisabeth navn navn navn navn null Person personliste Person sisteperson Et objekt av klassen Personer Innsetting kan skje i to skritt. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 18
Tilleggskrav Eksempel på tilstandspåstander til lister: lista inneholder bare unike elementer lista er aldri tom lista har aldri mer enn k elementer objektene er alltid sortert Hjelper oss til å vite hvordan metodene som manipulerer lista skal virke, men kan også gjøre programmeringen mer omfattende. Kan være lurt å innføre ekstra struktur, tellere og pekere. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 19
Skrive ut alle personene i lista // I klassen Personer : void skrivalle ( ) { Person p = personliste ; while (p!= null ) { p. skriv ( ) ; p = p. nesteperson ; } } // I klassen Person : void skriv ( ) { System. out. println (... ) ; } michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 20
Eksempler på lister kandidatliste handleliste spillerliste sensurliste deltakerliste gjesteliste sjekkliste ordliste resultatliste... michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 21
Lister er en sekvensiell datastruktur Vi bruker liste om en struktur som har en sekvensiell form. I programmering er lister den vanligst forekommende datastruktur. Alle sekvensielle data (i en array f.eks.) kan kalles en liste. En fil kan ses på som en liste av tekststrenger (linjer). En tekststreng er igjen en liste av tegn. En fil kan derfor ses på som en liste av lister av tegn. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 22
Vi bruker flere ord for å betegne lister og mer bestemte typer av lister. Det viktigste ved en liste, er at det innebærer en ordning av objektene etter hverandre i sekvens, slik at man fra et element kan finne det neste (eller forrige). sequence list stack (LIFO) queue (FIFO) Med en kø forstår vi en liste hvor det også finnes regler for hvordan elementer kommer inn og tas ut av lista. På engelsk brukes ordet «queue» oftest om en FIFO-liste. («rettferdig kø») michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 23
Forskjellige implementasjoner av lister filer arrayer lenkede lister enkeltlenkede lister dobbeltlenkede lister med og uten listehode og -hale FIFO- og LIFO-køer (lister med regler) Du vil lære mer om de forskjellige implementasjonene ved å løse oppgavene som blir gitt til neste fellesøvelse. Programmeringseksemplene i denne forelesningen begrenser seg til enkeltlenkete lister. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 24
Lister er mer enn en mengde tellbarhet (endelig antall objekter) rekkefølge ikke nødvendigvis bare unike elementer hvor i lista kommer nye elementer (køregler) hvor tas elementer ut (køregler) Mengder implementeres likevel ofte som lister, men da slik at egenskapene over skjules. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 25
Lister med køregler køer inn ut ut FIFO (kø) Først inn først LIFO (stabel) Sist inn først ut michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 26 inn
FIFO First In First Out (kø) En FIFO-liste er en kø som har køregler som en «billettkø». Elementene rangeres etter hvor lang tid de har «stått i køen», slik at den står for tur som har stått lengst. En liste som administreres slik, kalles også «rettferdig kø». Eller bare «kø». (engelsk queue). Nyeste inn sist Eldste ligger først Eldste (første) er neste som betjenes (fjernes) Nyeste (siste) må vente lengst michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 27
LIFO Last In First Out (stabel) En LIFO-liste er en «kø» som har omvendte køregler i forhold til en FIFO-liste. Elementene rangeres etter hvor lang tid de har «stått i køen», slik at den står for tur som kom inn i køen sist. En liste som administreres slik, kan kalles en stabel (ref. tallerkenstabel), fordi elementet som kom sist ligger øverst og er det første til å tas ut. Muntlig brukes oftere det engelske stack. Nyeste inn først (øverst) Eldste ligger sist, bakerst (underst) Nyeste (øverste) er neste som betjenes (fjernes) Eldste (underste) må vente lengst michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 28
Algoritmer og datastrukturer Ethvert program har en datastruktur som data manipuleres og lagres i. Programmet (algoritmene) virker på datastrukturen og endrer den. Datastrukturen endrer seg under programutførelsen. Å lage «øyeblikksbilder» av datastrukturen i et program gir et godt bilde av hva programmet gjør. Java datastruktur-tegninger er deler av et slikt bilde. Jf. eget notat om Java datastruktur. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 29
Alle programmer har en datastruktur enkeltvariable arrayer HashMap grafer (lister og trær mm.) Som hjelpemiddel under programmeringen er en skisse av (deler av) datastrukturen meget nyttig. Stein Gjessings notat handler om dette. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 30
Beholdere, mengder, programmer med en «database» Mange programmer skal holde orden på en relativt omfattende mengde objekter. Ofte betyr det lite hvordan objektene er organisert, så lenge programmet holder orden på dem. Vi benytter gjerne gjerne ferdiglagede datastrukturer for dette formålet, jf. HashMap. I dag skal vi se på datastrukturen lenket liste som også kan benyttes for å holde orden på mange objekter. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 31
Lenkede strukturer Når vi har en datastruktur der (mange) objekter referer (peker på) andre objekter, får vi en graf. I hvert objekt kan vi ha mange pekere, og vi kan lage så komplekse grafer (nettverk) vi ønsker. En fordel med grafer sammenlignet med array og hashmap er at vi ikke trenger å ta stilling til antall objekter. I INF1010 skal vi nøye oss med å se på strukturene lister og binære trær som er de vanligste grafene i programmer. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 32
Valg av datastruktur array hashmap liste (fil) binærtre (søketre) annen grafstruktur Ethvert valg gir noen fordeler og noen ulemper. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 33
Objektorientering «alt» er objekter informasjonsskjuling innkapsling generiske typer arv og polymorfisme Husk at et objekt er en instans av en klasse michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 34
Perspektiv Husk perspektivet. Man kan ikke se alt med ett blikk. I en sammensatt datastruktur med mange objekter, er det fruktbart å skifte perspektiv fra det detaljerte, til det mer generelle, og tilbake. F.eks. vil vi noen ganger betrakte enkeltelementene i en liste som enkeltobjekter, andre ganger vil vi betrakte hele lista med tilhørende operasjoner som ett objekt. Begge måter er objektorienterte, men perspektivet skifter. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 35
Studieaktiviteter i INF1010 Programmering (oppgaveløsning) alene/kollokvier programmeringslab (plenums)øvelser forelesninger ekstragruppe puslegruppe blogg selvstudium Husk INF1010 dreier seg først og fremst om å programmere. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 36
Pensum i INF1010 lysark fra forelesningene egne notater og programmer oppgaver og løsningsforslsag Java-bøker Internett Husk INF1010 dreier seg først og fremst om å kunne lage javaprogrammer. Å nøye seg med å programmere obliger er for de fleste ikke tilstrekkelig. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 37
Norsk og engelsk I INF1010 prøver vi på forelesningene å bruke norske begreper og navn på variable. Også på klasser og metoder som vi lager selv. Da blir det lett å skjønne hva vi har programmert selv (norsk) og hva som hører til Java språket eller APIet. Ulempen er at programmet blir vanskeligere å forstå for personer som ikke kan norsk. Noen liker heller ikke at vi bruker norsk når vi skriver programmer. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 38
Oppgaver til plenumsøvelsen onsdag 1. skriv metodene finnperson(string navn), finnpersonfør(string navn), tautpersonetter(person p), tautnestsisteperson(),... 2. Utvid Personklassen med en int rang og innfør tilstandspåstanden at personene i lista er sortert etter rang i stigende rekkefølge. Skriv metoden settinnpersonetterrang. 3. Anta at personlista har listehode og hale. Gjør forenklinger i settinnpersonetterrang basert på denne antakelsen. 4. Lag en klasse LIFO-Personer etter modell av Personer-klassen med «LIFO-operasjonene»: settinnperson og tautperson. 5. Hvilken tilleggstruktur er nyttig hvis vi skal lage en tilsvarende FIFO-klasse? 6. Anta vi har en dobbeltlenket personliste. (Person er utvidet med en peker som peker på forrige Personobjekt i lista.) Gjør nødvendige forandringer i settinnpersonetterrang basert på dette. 7. Vi innfører arrayen personarray Person[400] i Personer. Lag en metode som overfører en FIFO-liste fra personliste til denne arrayen. Skriv metodene for å ta ut og sette personobjekter inn i personarrayen. Hint: Istedet for pekere bruker vi nå indekser i arrayen for første, neste, siste michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 39 etc.