Upload
luise-gerhardt
View
117
Download
0
Embed Size (px)
Citation preview
DVG2 - 03 - Verkettete Listen
Verkettete Listen
DV
G2 - 03 - V
erkettete Listen
2
Primitive Datentypen
Vorteile:– werden direkt vom Prozessor unterstützt– schneller Zugriff– schnelle Verarbeitung
Nachteile:– kleine Datenmenge– feste Struktur– unflexibel
DV
G2 - 03 - V
erkettete 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
DV
G2 - 03 - V
erkettete 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
DV
G2 - 03 - V
erkettete 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
DV
G2 - 03 - V
erkettete Listen
6
Organisation von Listen
next Daten
next Daten
next Daten
null Daten
next Daten
first
actual
last
DV
G2 - 03 - V
erkettete 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;}
DV
G2 - 03 - V
erkettete Listen
8
private void setNext (ListenElement nextElement){ this.nextElement=nextElement;}
private Object getData(){ return data;}
private ListenElement getNext(){ return nextElement;}}
DV
G2 - 03 - V
erkettete 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;
DV
G2 - 03 - V
erkettete 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)
DV
G2 - 03 - V
erkettete Listen
11
next Daten
next Daten
next Daten
next Daten
next Daten
null Daten
first
actual
last
at.setNext(
new ListenElement(
data,at.getNext())
)
DV
G2 - 03 - V
erkettete 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++;}
DV
G2 - 03 - V
erkettete 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);}
DV
G2 - 03 - V
erkettete 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);}
DV
G2 - 03 - V
erkettete 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(); }}
DV
G2 - 03 - V
erkettete 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]);}
DV
G2 - 03 - V
erkettete 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(); }}
DV
G2 - 03 - V
erkettete Listen
18
Konstruktoren
Leerer Konstruktor erzeugt eine leere Listepublic Liste()
{
} Konstruktor mit einem Datenobjekt erzeugt Liste mit einem Elementpublic Liste(Object data)
{
append(data);
}
DV
G2 - 03 - V
erkettete Listen
19
Konstruktor mit mehreren Daten erzeugt Liste mit mehreren Elementen
public Liste(Object [] data)
{
append(data);
}
DV
G2 - 03 - V
erkettete 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);
}
DV
G2 - 03 - V
erkettete 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
DV
G2 - 03 - V
erkettete 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();}
DV
G2 - 03 - V
erkettete 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;}
DV
G2 - 03 - V
erkettete 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;}
DV
G2 - 03 - V
erkettete 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]);
DV
G2 - 03 - V
erkettete Listen
26
Entfernen von Listenelementen
next Daten
next Daten
next Daten
next Daten
null Daten
first
actual
last
DV
G2 - 03 - V
erkettete Listen
27
next Daten
next Daten
next Daten
next Daten
null Daten
first
actual
last
DV
G2 - 03 - V
erkettete 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--;}
DV
G2 - 03 - V
erkettete 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());}
DV
G2 - 03 - V
erkettete 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);
DV
G2 - 03 - V
erkettete Listen
31
doppelt verkettete Listen
next prev
next null
next prev
null prev
next prev
first
actual
last
Daten
Daten
Daten
Daten
Daten
DV
G2 - 03 - V
erkettete Listen
32
zyklisch verkettete Listen
next
next
next
next
next
first
actual
last
Daten
Daten
Daten
Daten
Daten
DV
G2 - 03 - V
erkettete Listen
33
doppelt zyklisch verkettete Listen
next prev
next prev
next prev
next prev
next prev
first
actual
last
Daten
Daten
Daten
Daten
Daten