DVG Verkettete Listen Verkettete Listen
DVG Verkettete Listen 2 Primitive Datentypen Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung Nachteile: –kleine Datenmenge –feste Struktur –unflexibel
DVG Verkettete Listen 3 Objekte Zusammenfassung einfacher Objekte bzw. primitiver Daten zu komplexen Datentypen Vorteile: –flexibel, da beliebige Strukturen definiert werden können –schneller Zugriff, da Adressen der Komponenten vom Compiler berechnet werden können Nachteile: –relativ kleine Datenmenge –feste Datenmenge
DVG Verkettete Listen 4 Felder Zusammenfassung einer beliebigen aber festen Anzahl von Elementen gleichen Typs (primitive Datentypen oder Referenzen) Vorteile: –einfache Handhabung –große Datenmenge –alle Elemente werden zusammenhängend gespeichert –schneller Zugriff : Addr[i]=Addr[0]+ i*Elementlänge –Feldelement können Referenzen auf beliebige Objekte sein Nachteile: –feste Datenmenge –Feldelemente können nicht hinzugefügt bzw. entfernt werden
DVG Verkettete Listen 5 Listen Ziele: –Zusammenfassung verschiedener Objekte –flexible Datenstruktur –einfaches Einfügen, Hinzufügen, Entfernen und Umsortieren von Elementen –einfacher Zugriff für den Nutzer Eigenschaften: –Elemente können nicht zusammenhängend gespeichert werden –Auf Elemente kann nicht über einen Index zugegriffen werden. –Es ist keine schnelle Berechnung der Adressen möglich
DVG Verkettete Listen 6 Organisation von Listen nextDatennextDatennextDatennullDatennextDatenfirstactuallast
DVG Verkettete Listen 7 Listenelemente Listenelement besteht aus –Referenz auf Daten –Verkettungsinformation (Referenz auf das nächste Element) Definition des Listenelements enthält das interne Wissen über die Struktur der Liste. Dieses sollte nicht allgemein zugänglich sein. ==> interne private Klasse, private Attribute private class ListenElement { private Object data = null; private ListenElement nextElement = null; private ListenElement(Object data, ListenElement nextElement) { this.data=data; this.nextElement=nextElement; }
DVG Verkettete Listen 8 private void setNext (ListenElement nextElement) { this.nextElement=nextElement; } private Object getData() { return data; } private ListenElement getNext() { return nextElement; } }
DVG Verkettete Listen 9 Attribute Interne Referenzen private ListenElement firstElement = null; private ListenElement lastElement = null; private ListenElement actualElement = null; Interne Zähler speichert die Anzahl der Elemente der Liste private int numberOfElements = 0;
DVG Verkettete Listen 10 Listenelemente hinzufügen nextDatennextDaten nextDaten nextDaten nextDaten nullDaten first actual last firstElement= new ListenElement (data,firstElement)
DVG Verkettete Listen 11 nextDatennextDaten nextDaten nextDaten nextDaten nullDaten first actual last at.setNext( new ListenElement( data,at.getNext()) )
DVG Verkettete Listen 12 Einfügen eines Listenelementes nach einem vorgegebenen Wenn at==null ist, wird das Listenelement am Anfang der Liste eingefügt. private void insertAt(ListenElement at, Object data) { if (at==null) { firstElement=new ListenElement(data,firstElement); if (lastElement==null) lastElement=firstElement; } else { at.setNext(new ListenElement(data,at.getNext())); if (lastElement==at) lastElement=at.getNext(); } numberOfElements++; }
DVG Verkettete Listen 13 Die Methode insertAt benutzt internes Wissen: –ListenElement Methode ist private Zur Nutzung durch den Anwender werden Methoden angeboten, die dieses Wissen nicht benötigen. public void insertFirst(Object data) { insertAt(null, data); } public void insert(Object data) { insertAt(actualElement, data); } public void append(Object data) { insertAt(lastElement, data); }
DVG Verkettete Listen 14 public void insertBefore(Object data) { if ( (actualElement == null) || (actualElement == firstElement) ) { insertAt(null, data); return; } ListenElement le = firstElement; while ( le.getNext() != actualElement) le=le.getNext(); insertAt(le, data); }
DVG Verkettete Listen 15 Mehrere Listenelemente hinzufügen public void insertFirst(Object [] data) { if (data==null) return; insertAt(null,data[0]); ListenElement le = firstElement; for (int i=1;i<data.length;i++) { insertAt(le, data[i]); le=le.getNext(); } }
DVG Verkettete Listen 16 public void insert(Object [] data) { if (data==null) return; ListenElement le = actualElement; for (int i=0;i<data.length;i++) { insertAt(le, data[i]); le=le.getNext(); } } public void append(Object [] data) { if (data != null) for (int i=0;i<data.length;i++) append(data[i]); }
DVG Verkettete Listen 17 public void insertBefore(Object [] data) { if (data==null) return; if ( (actualElement == null) || (actualElement == firstElement) ) { insertFirst(data); return; } ListenElement le = firstElement; while ( le.getNext() != actualElement) le=le.getNext(); for (int i=0;i<data.length;i++) { insertAt(le, data[i]); le=le.getNext(); } }
DVG Verkettete Listen 18 Konstruktoren Leerer Konstruktor erzeugt eine leere Liste public Liste() { } Konstruktor mit einem Datenobjekt erzeugt Liste mit einem Element public Liste(Object data) { append(data); }
DVG Verkettete Listen 19 Konstruktor mit mehreren Daten erzeugt Liste mit mehreren Elementen public Liste(Object [] data) { append(data); }
DVG Verkettete Listen 20 Beispiel Liste l = new Liste("Element 0"); String [] s = {"Element 1","Element 2","Element 3","Element 4"}; l.append(s); l.append("Element 5"); System.out.println("first = "+ (String)l.getFirst()); System.out.println("last = "+ (String)l.getLast()); String element; l.reset(); while ( (element=(String)l.getNext()) != null) { System.out. println(element); }
DVG Verkettete Listen 21 Daten lesen Lesen des ersten Listenelements: getFirst Lesen des letzten Listenelements: getLast getLast und getFirst modifizieren nicht die Referenz auf das aktuelle Element Lesen des aktuellen Elementes: getNext getNext positioniert vor dem Lesen der Daten auf das nach dem aktuellen Element liegende Element, d.h. actualElement zeigt auf das zuletzt gelesene Listenelement toArray gibt alle Elemente der Liste als Array von Objekten aus toString gibt eine Zeichenkette aus, die toString von jedem Objekt der Liste enthält length gibt die Anzahl der Listenelemente aus
DVG Verkettete Listen 22 public Object getFirst() { if ( firstElement == null ) return null; return firstElement.getData(); } public Object getLast() { if ( lastElement == null ) return null; return lastElement.getData(); } public void reset() { actualElement = null; } public Object getNext() { if (actualElement==null) actualElement = firstElement; else actualElement = actualElement.getNext(); if (actualElement==null) return null; return actualElement.getData(); }
DVG Verkettete Listen 23 public Object [] toArray() { Object [] data = new Object [numberOfElements]; ListenElement l = firstElement; for (int i=0;i<numberOfElements;i++) { data[i]=l.getData(); l=l.getNext(); } return data; }
DVG Verkettete Listen 24 public String toString() { String s = "Liste={"; ListenElement le = firstElement; while (le != null) { s+=le.getData(); le=le.getNext(); if (le!=null) s+=";"; } s+="}"; return s; } public int length() { return numberOfElements; }
DVG Verkettete Listen 25 Beispiel Liste l = new Liste("Element 0"); String [] s = {"Element 1","Element 2","Element 3","Element 4"}; l.append(s); l.append("Element 5"); System.out.println("first = "+ (String)l.getFirst()); System.out.println("last = "+ (String)l.getLast()); System.out.println( "Anzahl der Listenelemente = "+l.length()+ "\nInhalt der Liste\n"+l); Object [] o = l.toArray(); for (int i=0;i<o.length;i++)System.out.println(o[i]);
DVG Verkettete Listen 26 Entfernen von Listenelementen nextDaten nextDaten nextDaten nextDaten nullDaten first actual last
DVG Verkettete Listen 27 nextDaten nextDaten nextDaten nextDaten nullDaten first actual last
DVG Verkettete Listen 28 private void removeAt(ListenElement at) { if (at==null) return; if (at==firstElement) { if (at==actualElement) actualElement=null; firstElement=firstElement.getNext(); if (firstElement==null) lastElement=null; } else { ListenElement prev = firstElement; while (prev.getNext() != at) prev=prev.getNext(); if (at==actualElement) actualElement=prev; if (at==lastElement) lastElement=prev; prev.setNext(at.getNext()); } numberOfElements--; }
DVG Verkettete Listen 29 Wie beim Hinzufügen von Listenelementen wird Methode removeAt als private definiert. Dem Anwender werden spezialisierte Methode angeboten. public void remove() { removeAt(actualElement); } public void removeFirst() { removeAt(firstElement); } public void removeLast() { removeAt(lastElement); } public void removeTail() { removeAt(actualElement); if (actualElement != null) while (actualElement.getNext()!=null) removeAt(actualElement.getNext()); }
DVG Verkettete Listen 30 Beispiel l.removeFirst(); System.out.println("Liste nach Entfernung des ersten Elements"); System.out.println("Anzahl der Listenelemente = "+ l.length()+"\nInhalt der Liste\n"+l); l.removeLast(); System.out.println ("Liste nach Entfernung des letzten Elements"); System.out.println("Anzahl der Listenelemente = "+ l.length()+"\nInhalt der Liste\n"+l); l.reset();l.getNext();l.getNext();l.getNext(); l.remove(); System.out.println ("Liste nach Entfernung des dritten Elements"); System.out.println("Anzahl der Listenelemente = "+ l.length()+"\nInhalt der Liste\n"+l); l.reset();l.getNext();l.getNext(); l.removeTail(); System.out.println ("Liste nach Entfernung des Restes der Liste ab dem zweiten "+ "Element"); System.out.println("Anzahl der Listenelemente = "+ l.length()+"\nInhalt der Liste\n"+l);
DVG Verkettete Listen 31 doppelt verkettete Listen nextprev nextnull nextprev nullprev nextprev first actual last Daten
DVG Verkettete Listen 32 zyklisch verkettete Listen next first actual last Daten
DVG Verkettete Listen 33 doppelt zyklisch verkettete Listen nextprev nextprev nextprev nextprev nextprev first actual last Daten