Föreläsning 12. Länkade listor

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

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

Länkade strukturer. (del 2)

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

Datastrukturer. föreläsning 3. Stacks 1

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

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Länkade strukturer, parametriserade typer och undantag

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

Programmering för språkteknologer II, HT2014. Rum

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

Lösningsförslag till exempeltenta 2

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

DAT043 - föreläsning 8

Föreläsning 3. Stack

Föreläsning 4 Innehåll

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

Föreläsning 2. Länkad lista och iterator

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

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

Föreläsning 15: Repetition DVGA02

Föreläsning 2. Länkad lista och iterator

Kurskod D0010E Datum Skrivtid 5tim

OOP Objekt-orienterad programmering

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

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 9 Innehåll

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

Repetition av OOP- och Javabegrepp

Tentamen. Programmeringsmetodik, KV: Java och OOP. 17 januari 2002

Föreläsning 8: Exempel och problemlösning

Föreläsning 3. Stack

Repetition av OOP- och Javabegrepp

Tommy Färnqvist, IDA, Linköpings universitet

Stackar, köer, iteratorer och paket

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

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

TENTAMEN I DATAVETENSKAP

Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering!

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

Föreläsning 14 Innehåll

Kapitel 6. Kapitel 6. Hakparenteser fšr att ange index float[] priser = new float[500]; frekvens[4] boolean[] flaggor;

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

Lösningsförslag till exempeltenta 1

Kapitel 6. Hakparenteser fšr att ange index MŒnga všrden av samma typ

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

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

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

Saker du ska kunna Föreläsning 13 & 14

Samlingar Collection classes

Arrayer. results

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

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

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

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

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

OOP Objekt-orienterad programmering

Classes och Interfaces, Objects och References, Initialization

TENTAMEN OOP

Tentamen i Objektorienterad modellering och design

TDDD78 Viktiga begrepp, del 2

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

Föreläsning 11 Innehåll

Tentamen i Algoritmer & Datastrukturer i Java

Introduktion till Datalogi DD1339. Föreläsning 5 13 okt 2014

public interface Skrivbar { void skriv(); } public class Punkt implements Skrivbar { public double x; public double y;

CHALMERS TENTAMEN. 2018/2019, lp 1 DAT050. Uno Holmer

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

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

Föreläsning Innehåll. Hantera många element. Exempel: polygon Godtyckligt antal element. Exempel: polygon forts

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Java-syntax (arv) Exempel: public class Crow extends Bird {... } Jämför med Lab 1: public class FirstApp extends Frame {... }

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

Seminarium 2 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

Kopiering av objekt i Java

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Objektorienterad programmering i Java

Interfacen Set och Map, hashtabeller

Tentamen Objekt-orienterad programmering i Java, 5p distanskurs

Generiska klasser och funktioner

Objektorienterad Programmering (TDDC77)

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

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

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

Tentamen. Programmeringsmetodik, KV: Java och OOP. 20 januari 2005

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

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

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Transkript:

Föreläsning 12 Länkade listor

Jämför en array med en länkad lista m in n e t Array (med 5 element): + effektiv vid hämtning - ineffektiv vid insättning och borttagning Länkad lista (med 5 element): + effektiv vid insättning och borttagning - ineffektiv vid hämtning 2

Nod-klass (med plats för både ett listelement och en minnesreferens) Alternativ 1 (generisk klass): public class Node<ElementType> { private ElementType _element; private Node<ElementType> _next;... Alternativ 2 (klass med Object): public class Node { private Object _element; private Node _next;... 3

Figurer För att lättare handskas med noderna i en länkad lista är det bra att rita figurer. Figur Kod enligt alternativ 2 n Node n; //deklaration n n = null; //initialisering new Node(...); n Node n = new Node(...); 4

Figurer Varje gång en nod skapas (new Node(...);) så skapas det två platser i minnet, dels för ett dataelement och dels för en minnesreferens till en nod så att man kan koppla samman flera noder till en lång kedja. dataelement minnesreferens till en nod 5

Nod-klassen (alternativ 1) public class Node<E> { private E _element; //dataelementet private Node<E> _next; //minnesreferens till en nod public Node(E element) { //konstruktor _element = element; //dataelementet initialiseras _next = null; //minnesreferensen //initialiseras till null public E getelement() { //get-metod för dataelementet return _element; public void setnext(node<e> anode) { //set-metod för minnesreferensen _next = anode; public Node<E> getnext() { //get-metod för minnesreferensen return _next; 6

Hur skapar man noder? Skapa några noder med heltalselement: Node<Integer> n1 = new Node<Integer>(new Integer(1)); Node<Integer> n2 = new Node<Integer>(new Integer(2)); Node<Integer> n3 = new Node<Integer>(new Integer(3)); n1 n2 n3 Integer-objekt med värde 1 Integer-objekt med värde 2 Integer-objekt med värde 3 7

Hur kopplar man ihop noder? Länka ihop noderna n1, n2 och n3 till en kedja: n1.setnext(n2); n2.setnext(n3); n1 n2 Integer-objekt med värde 1 Integer-objekt med värde 2 Integer-objekt med värde 3 n3 Man kan nu komma åt Integer-objektet med värde 3 på flera sätt: n3.getelement(); n1.getnext().getnext().getelement(); 8

Nodimplementation av ADT:n Stack _top Elementen i stacken lagras som länkade noder. Insättning och borttagning görs i början av kedjan av effektivitetsskäl. Den blir då toppen av stacken. Vi får skapa en Node-klass för noderna där man kan spara ett stackelement och en pil till nästa nod (länk). I Stack-klassen måste man ha en instansvariabel, _top, för att spara minnesreferensen till första noden (toppen på stacken). 9

Nodimplementation av ADT:n Stack public class Stack<E> { private Node<E> _top; public Stack() { _top = null; public boolean isempty() { return _top == null; _top _top newnode public void push(e element) { Node<E> newnode = new Node<E>(element); newnode.setnext(_top); _top = newnode; public E pop() { E top = _top.getelement(); _top = _top.getnext(); return top; { top _top _top... { {...... newnode _top newnode _top...... 10

Lab 5: Nodimplementation av ADT:n Lista Syftet med denna laboration är att - ge övning i att implementera en länkad lista, - ge övning i testning I laboration 4 använde vi listor av typen DefaultList- Model för att lagra personerna. I laboration 5 är det meningen att vi ska göra en egen listklass som bygger på länkade noder. Tanken är att denna nya lista ska ersätta listorna av typen DefaultListModel i lab 4 och att allt ska fungera som tidigare. Eftersom vi vill att den nya listan ska fungera tillsammans med Swing-komponenten JList måste den implementera gränssnittet ListModel (se Java API). 11

Klassdiagram I gränssnittet ListModel finns fyra metoder, dessa metoder måste List-klassen implementera för att fungera tillsammans med Jlist. Två av metoderna finns i den abstrakta klassen AbstractListModel och DefaultListModel ärver denna klass och dessa två metoder därifrån. De andra två metoderna (getelementat och getsize) måste DefaultListModelklassen implementera. Låt den nya List-klassen ärva och implementera på samma sätt som DefaultList- Model-klassen. 12

Gränssnittet ListADT För att göra bytet av listor så smidigt som möjligt är det lämpligt att låta Listklassen implementera följande gränssnitt (som finns på kurshemsidan): public interface ListADT { public void insertelementat(int index, Object anobject); public void addelement(object anobject); public void removeelementat(int index); public boolean removeelement(object anobject); public void removeallelements(); public void sort(); public boolean contains(object anobject); public int indexof(object anobject); public boolean isempty(); public int getsize(); public int size(); public Object getelementat(int index); public Object get(int index); I detta gränssnitt finns förhoppningsvis alla de listmetoder med som använts i laboration 4. Saknas någon lägg till metoden i gränssnittet, men ta inte bort något från gränssnittet. Observera att vissa av metoderna i gränssnittet är "dubletter", de ska göra samma sak men de har olika namn. 13

Den nya listan och JList För att listklassen ska fungera tillsammans med JList måste listans lyssnare underrättas varje gång en ändring görs av listan. Detta gör man med metoder som finns i klassen AbstractListModel. Följande tre metoder är användbara: - void fireintervaladded(object source, int index0, int index1) (AbstractListModel subclasses must call this method after one or more elements are added to the model) - void fireintervalremoved(object source, int index0, int index1) (AbstractListModel subclasses must call this method after one or more elements are removed from the model) - void firecontentschanged(object source, int index0, int index1) (AbstractListModel subclasses must call this method after one or more elements of the list change) Se nodimplementationen av Stack-klassen för ett exempel på hur metoderna används. 14

Alternativ 1: Alternativ 2: List-klass public class Lista extends.. implements.. { private Node<Object> _head; private int _size;... public class Lista extends.. implements.. { private Node _head; private int _size;... _head 15

getnodeat-metoden (en användbar hjälpmetod i list-klassen) Till skillnad från stackimplementationen vill vi med listan kunna besöka noder lite var som helst i kedjan (inte bara i början). Då är följande metod användbar: //pre: 0<= index < size() //post: resultat = nod med index // index i listan private Node getnodeat(int index) { Node n = _head; for (int i = 0; i < index; i++) n = n.getnext(); return n; första varvet index 0 1 2... _head n n......... 16

index i!= 0: Insättning i listan index 0 1 2... i-1 i _head......... 1) Hitta rätt plats för insättning: Node prev = getnode(i-1); 2) Skapa en ny nod och lägg ny data i den: Node newnode = new Node(...); 3) Koppla in den nya noden i listan genom att koppla om pilar: (a) newnode.setnext(prev.getnext()); (b) prev.setnext(newnode);............ prev newnode (a) (b)... 17

Insättning i listan index i = 0: index 0 1 2... _head............ newnode (a) (b)... 1) Skapa en ny nod och lägg ny data i den: Node newnode = new Node(...); 2) Koppla in den nya noden i listan genom att koppla om pilar: (a) newnode.setnext(_head); (b) _head = newnode; Detta ska göras i metoden insertelementat. Hur ska man göra i metoden addelement? Tänk på att använda de metoder som finns. Glöm ej _size! 18

index i!= 0: _head Borttagning ur listan index 0 1 2... i-1 i i+1........................ prev 1) Hitta noden som ligger före den som ska tas bort: Node prev = getnode(i-1); 2) Koppla bort noden genom att koppla om pilar: prev.setnext(prev.getnext().getnext()); 19

Borttagning ur listan index i = 0: index 0 1 2... _head............ 1) Koppla bort noden genom att koppla om pilar: _head = _head.getnext(); Detta ska göras i metoden removeelementat. Hur ska man göra i metoden removeelement? Tänk på att använda de metoder som finns (indexof). Vad ska göras i metoden removeallelements? Glöm ej _size! 20

Sortering Använd någon av sorteringsalgoritmerna - Bubble sort (bubbelsortering) - Insertion sort (instickssortering) tag ett element stick in på rätt plats - Selection sort (urvalssortering) välj ut nästa element och sätt in sist Det finns Objekt-objekt i listan. Hur jämför man dessa? Använd objektens tostring-metoder och använd String-klassens compareto-metod: string1.compareto(string2) = { +1, string1 och string2 ej i alf. ordn. 0, string1 och string2 är lika -1, string1 och string2 i alf. ordn. 21

Övriga metoder i ListADT contains: använd indexof indexof: returnerar -1 om objektet ej i listan, använd equals-metoden när objekt jämförs isempty, size, getsize: uppenbara getelementat, get: använd getnode 22