33
DVG2 - 05 1 Verkettete Listen

DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

Embed Size (px)

Citation preview

Page 1: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 1

Verkettete Listen

Page 2: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 2

Primitive Datentypen

Vorteile:– werden direkt vom Prozessor unterstützt– schneller Zugriff– schnelle Verarbeitung

Nachteile:– kleine Datenmenge– feste Struktur– unflexibel

Page 3: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 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

Page 4: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 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

Page 5: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 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

Page 6: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 6

Organisation von Listen

next Daten

next Daten

next Daten

null Daten

next Daten

first

actual

last

Page 7: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 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;

ListenElement(Object data, ListenElement nextElement){ this.data=data; this.nextElement=nextElement;}

Page 8: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 8

void setNext (ListenElement nextElement){ this.nextElement=nextElement;}

Object getData(){ return data;}

ListenElement getNext(){ return nextElement;}}

Page 9: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 9

Attribute

Interne Referenzen

private ListenElement firstElement = null;private ListenElement lastElement = null;private ListenElement actualElement = null;

Interne Zählerspeichert die Anzahl der Elemente der Liste

private int numberOfElements = 0;

Page 10: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 10

Listenelemente hinzufügen

next Daten

next Daten

next Daten

next Daten

next Daten

null Daten

first

actual

last

firstElement=new ListenElement(data,firstElement)

Page 11: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 11

next Daten

next Daten

next Daten

next Daten

next Daten

null Daten

first

actual

last

at.setNext(

new ListenElement(

data,at.getNext())

)

Page 12: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 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++;}

Page 13: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 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);}

Page 14: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 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);}

Page 15: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 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(); }}

Page 16: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 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]);}

Page 17: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 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(); }}

Page 18: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 18

Konstruktoren

Leerer Konstruktor erzeugt eine leere ListeListe()

{

} Konstruktor mit einem Datenobjekt erzeugt Liste mit einem

ElementListe(Object data)

{

append(data);

}

Page 19: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 19

Konstruktor mit mehreren Daten erzeugt Liste mit mehreren Elementen

Liste(Object [] data)

{

append(data);

}

Page 20: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 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);

}

Page 21: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 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

Page 22: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

22DVG2 - 05

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();}

Page 23: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

23DVG2 - 05

Object [] toArray(){ if (numberOfElements==0) return null; Object [] data = new Object [numberOfElements]; ListenElement l = firstElement; for (int i=0;i<numberOfElements;i++) { data[i]=l.getData(); l=l.getNext(); } return data;}

Page 24: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

24DVG2 - 05

public String toString(){ String s = ""; ListenElement le = firstElement; while (le != null) { s+=le.getData(); le=le.getNext(); if (le!=null) s+="\n"; } return s;}public int length(){ return numberOfElements;}

Page 25: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 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]);

Page 26: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 26

Entfernen von Listenelementen

next Daten

next Daten

next Daten

next Daten

null Daten

first

actual

last

Page 27: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 27

next Daten

next Daten

next Daten

next Daten

null Daten

first

actual

last

Page 28: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

28DVG2 - 05

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--;}

Page 29: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 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());}

Page 30: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 30

Beispiell.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);

Page 31: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 31

doppelt verkettete Listen

next prev

next null

next prev

null prev

next prev

first

actual

last

Daten

Daten

Daten

Daten

Daten

Page 32: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 32

zyklisch verkettete Listen

next

next

next

next

next

first

actual

last

Daten

Daten

Daten

Daten

Daten

Page 33: DVG2 - 051 Verkettete Listen. DVG2 - 052 Primitive Datentypen 4 Vorteile: –werden direkt vom Prozessor unterstützt –schneller Zugriff –schnelle Verarbeitung

DVG2 - 05 33

doppelt zyklisch verkettete Listen

next prev

next prev

next prev

next prev

next prev

first

actual

last

Daten

Daten

Daten

Daten

Daten