LISTER Vanligste datastruktur Mange implementasjonsmåter (objektkjeder, array...) Operasjoner på listen definerer forskjellige typer lister (LIFO, FIFO,...) På norsk bruker vi vanligvis ordet «liste» for en oppramsing (gjerne vertikal) på et stykke papir e.l., jf. kandidatliste, handleliste, spillerliste, sensurliste, deltakerliste, gjesteliste, sjekkliste, ordliste,... en databehandling er lister den vanligst forekommende datastruktur. Alle sekvensielle data kan kalles en liste. F.eks. kan en fil ses på som en liste av tekststrenger (linjer). En tekststreng er igjen en liste av tegn. Dette er et sett lysark for en forelesning. Noen sider er ufullstendige og vil kun være nyttig som grunnlag for selvstudium påført studentens merknader fra forelesningen. Særlig gjelder dette en del eksempler og Vi har allerede programmert med lister i. Her skal vi se nærmere på forskjellige måter å implementere lister på, samt forskjellige metoder til å håndtere listen på. figurer. Ifi 12. april 2005 Ark 1 av 24 Ifi 12. april 2005 Ark 2 av 24 Pekerkjede (lenket liste) Sammenligning med array FIFO køer Foran Bak LIFO køer Listeelementer og listeoperasjoner Datastruktur En liste er en (usortert) sekvens eller kjede av elementer i sier vi helst objekter av hva som helst. Hvert objekt i kjeden er «forbundet med» to naboobjekter, forrige objekt og neste objekt. Objektene kan for eksempel være navn, personer, biler, tegn, tall, tekststrenger,.... Objektene i en liste er ofte av samme type (instanser av samme klasse), men ikke alltid. Algoritmer Typiske listeoperasjoner er å Legge til et element Søke etter et element Fjerne et element Skrive ut alle elementene Ifi 12. april 2005 Ark 3 av 24 Ifi 12. april 2005 Ark 4 av 24
Pekerkjede implementasjon En liste kan implementeres som en pekerkjede, der hvert element i listen har en peker til det neste elementet i listen. Eksempel: Liste av personer class son { String navn; son nesteson; // Neste person i listen I selve personregisteret er det tilstrekkelig å ha en peker til den første personen i listen: class sonregister { son ; // Første person i listen Skrive ut alle personene i listen: void skrivalle() { while (p!= null) { p.skriv(); p = p.nesteson; setting av ny person først: Ida void settførst(son p) { p.nesteson = ; = p; Ifi 12. april 2005 Ark 5 av 24 Ifi 12. april 2005 Ark 6 av 24 Fjerning av den første personen i listen: son fjernførste() { if ( == null) { else { = p.nesteson; return p; Oppgave: Lag en metode antall som finner (og returnerer) antall personer i listen. Finne person med gitt navn: son finn(string navn) { while (p!= null &&!p.navn.equals(navn)) { p = p.nesteson; return p; Ifi 12. april 2005 Ark 7 av 24 Ifi 12. april 2005 Ark 8 av 24
Fjerne person med gitt navn: son fjern(string navn) { son forrige = null; while (p!= null &&! p.navn.equals(navn)) { forrige = p; p = p.nesteson; Sette inn ny person sist: Ida // p er personen som skal fjernes, // forrige er personen FØR denne i listen if (p!= null) { if (p == ) { // Spesialtilfelle: // personen som skal fjernes står først =.nesteson; else { forrige.nesteson = p.nesteson; return p; Eksempel: fjern() void settsist(son pers) { if ( == null) { = pers; else { while (p.nesteson!= null) { p = p.nesteson; // p er nå siste person i listen p.nesteson = pers; Ifi 12. april 2005 Ark 9 av 24 Ifi 12. april 2005 Ark 10 av 24 Implementasjon med sistepeker Har nå også en peker til den siste personen i listen: class sonregister { son ; son sisteson; Generelle lister setting av person sist blir da lett: void settsist(son pers) { if ( == null) { = pers; sisteson = pers; else { sisteson.nesteson = pers; sisteson = pers; Ifi 12. april 2005 Ark 11 av 24 Ifi 12. april 2005 Ark 12 av 24
Pekerkjede implementasjon class LenketListe implements Liste { Node første; class Node { Node neste; Object data; Søking public Object finn(int indeks) { int i = 0; while (i < indeks && n!= null) { i++; if (n!= null) { return n.data; else { (Eventuelt med siste peker i tillegg.) public int finn(object elem) { int i = 0; while (n!= null &&!n.data.equals(elem)) { i++; if (n!= null) { return i; else { return 1; Ifi 12. april 2005 Ark 13 av 24 Ifi 12. april 2005 Ark 14 av 24 setting public void sett(int indeks, Object elem) { Node ny = new Node(elem); if (indeks == 0) { // setting først ny.neste = første; første = ny; else { int i = 0; // Finner noden FØR innsettingspunktet while (i < indeks 1) { i++; ny.neste = n.neste; n.neste = ny; Fjerning public void ta(object elem) { Node forrige = null; while (n!= null &&!n.data.equals(elem)) { forrige = n; if (n!= null) { if (n == første) { første = første.neste; else { forrige.neste = n.neste; Ifi 12. april 2005 Ark 15 av 24 Ifi 12. april 2005 Ark 16 av 24
Traversering public void skrivliste() { while (n!= null) { System.out.println(n.data); Array implementasjon class ArrayListe implements Liste { Object[] liste; int lengde; Tomme lister public boolean ertom() { return (første == null); public void tømliste() { første = null; Antall public int antall() { int antall = 0; while (n!= null) { antall++; return antall; setting: Må flytte alle elementene fra og med innsettings posisjonen. I verste fall er arrayen full, og elementene må kopieres til en ny, større array. Søking: Enkelt med indeks oppslag. Søking etter et gitt element må traversere arrayen fra begynnelsen. Fjerning: Må flytte alle elementene etter innsettings posisjonen. Ifi 12. april 2005 Ark 17 av 24 Ifi 12. april 2005 Ark 18 av 24 (FIFO )Køer En FIFO kø (First In, First Out) er en liste der vi stort sett setter inn elementer i den ene enden, og tar ut elementer fra den andre enden: Foran Bak FIFO kø: Pekerkjede implementasjon class FIFOLenketListe extends LenketListe { Node siste; public void sett(object elem) { Node ny = new Node(elem); if (første == null) { første = ny; siste = ny; else { siste.neste = ny; siste = ny; Vi kan da utvide den generelle pekerkjede implementasjonen med en siste peker metoden void sett(object elem) for innsetting sist metoden Object ta() for fjerning av første element public Object ta() { if (første == null) { else { første = første.neste; return n.data; // Eventuelle endringer i de andre metodene // på grunn av siste pekeren. Ifi 12. april 2005 Ark 19 av 24 Ifi 12. april 2005 Ark 20 av 24
LIFO køer (Stakker) En LIFO kø (Last In, First Out) er en liste der innsetting/uttak alltid skjer først i listen. Dette kan sammenlignes med en stabel tallerkner: LIFO kø: Pekerkjede implementasjon setting og sletting vil nå normalt skje på begynnelsen av listen: class LIFOLenketListe extends LenketListe { public void sett(object elem) { Node ny = new Node(elem); ny.neste = første; første = ny; Andre eksempler: Metodekall i Java En full buss public Object ta() { // Som for FIFO køer! if (første == null) { else { første = første.neste; return n.data; Ifi 12. april 2005 Ark 21 av 24 Ifi 12. april 2005 Ark 22 av 24 Eksempel: Palindromer Palindromer er ord/uttrykk/setninger som er like forlengs og baklengs. Kjente eksempler: Otto ABBA radar regninger norsk: Agnes i senga svensk: Ni talar bra latin dansk: En af dem der red med fane Mulig løsning ❶ Les tekst strengen inn i både en LIFO og en FIFO kø. ❷ Sammenlign innholdet i de to køene tegn for tegn. public boolean sjekkpalindrom(string setning) { FIFOLenketListe fifo = new FIFOLenketListe(); LIFOLenketListe lifo = new LIFOLenketListe(); for (int i = 0; i < setning.length(); i++) { char bokstav = Character.toLowerCase(setning.charAt(i)); if (! Character.isWhitespace(bokstav)) { fifo.sett(new Character(bokstav)); lifo.sett(new Character(bokstav)); norsk: Alle reisetrette skal ete laks etter te, sier Ella engelsk: Madam, I am ill. I ve nine men in evil Lima. I m Adam norsk: Rolf Are vurderer om Arons ni drag i gardinsnora morer edru Vera Flor while (! fifo.ertom()) { if (! fifo.ta().equals(lifo.ta())) { return false; return true; Ifi 12. april 2005 Ark 23 av 24 Ifi 12. april 2005 Ark 24 av 24