DVG2 - 03 - Verkettete Listen1 Verkettete Listen.

Post on 05-Apr-2015

114 views 2 download

Transcript of DVG2 - 03 - Verkettete Listen1 Verkettete Listen.

DVG2 - 03 - Verkettete Listen 1

Verkettete Listen

DVG2 - 03 - Verkettete Listen 2

Primitive Datentypen Vorteile:

werden direkt vom Prozessor unterstützt schneller Zugriff schnelle Verarbeitung

Nachteile: kleine Datenmenge feste Struktur unflexibel

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

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

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

DVG2 - 03 - Verkettete Listen 6

Organisation von Listen

next Daten

next Daten

next Daten

null Daten

next Daten

first

actual

last

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

DVG2 - 03 - Verkettete Listen 8

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

private Object getData(){ return data;}

private ListenElement getNext(){ return nextElement;}}

DVG2 - 03 - Verkettete Listen 9

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

DVG2 - 03 - Verkettete Listen 10

Listenelemente hinzufügen

next Daten

next Daten

next Daten

next Daten

next Daten

null Daten

first

actual

last

firstElement=new ListenElement(data,firstElement)

DVG2 - 03 - Verkettete Listen 11

next Daten

next Daten

next Daten

next Daten

next Daten

null Daten

first

actual

last

at.setNext(

new ListenElement(

data,at.getNext())

)

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

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

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

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

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

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

DVG2 - 03 - Verkettete Listen 18

Konstruktoren Leerer Konstruktor erzeugt eine leere Listepublic Liste()

{

} Konstruktor mit einem Datenobjekt erzeugt Liste mit einem Elementpublic Liste(Object data)

{

append(data);

}

DVG2 - 03 - Verkettete Listen 19

Konstruktor mit mehreren Daten erzeugt Liste mit mehreren Elementen

public Liste(Object [] data)

{

append(data);

}

DVG2 - 03 - Verkettete Listen 20

BeispielListe 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);

}

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

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

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

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

DVG2 - 03 - Verkettete Listen 25

BeispielListe 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]);

DVG2 - 03 - Verkettete Listen 26

Entfernen von Listenelementen

next Daten

next Daten

next Daten

next Daten

null Daten

first

actual

last

DVG2 - 03 - Verkettete Listen 27

next Daten

next Daten

next Daten

next Daten

null Daten

first

actual

last

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

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

DVG2 - 03 - Verkettete Listen 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);

DVG2 - 03 - Verkettete Listen 31

doppelt verkettete Listen

next prev

next null

next prev

null prev

next prev

first

actual

last

Daten

Daten

Daten

Daten

Daten

DVG2 - 03 - Verkettete Listen 32

zyklisch verkettete Listen

next

next

next

next

next

first

actual

last

Daten

Daten

Daten

Daten

Daten

DVG2 - 03 - Verkettete Listen 33

doppelt zyklisch verkettete Listen

next prev

next prev

next prev

next prev

next prev

first

actual

last

Daten

Daten

Daten

Daten

Daten