prj 2007/1 stefan dissmann verkettete datenstruktur: liste problem: liste, die eine beliebige zahl...
TRANSCRIPT
PRJ 2007/1Stefan Dissmann
Verkettete datenstruktur: Liste
Problem:Liste, die eine beliebige Zahl von Elementen verwaltet
• Operationen:Erzeugen, Anfügen, Anfang lesen, Anfang löschen, Leerheitstest
• Zunächst zur Vereinfachung:Jedes Element enthält nur eine ganze Zahl.
PRJ 2007/2Stefan Dissmann
Verkettete datenstruktur: Liste
Problem:Liste, die eine beliebige Zahl von Elementen verwaltet
• Operationen:Erzeugen, Anfügen, Anfang lesen, Anfang löschen, Leerheitstest
• Zunächst zur Vereinfachung:Jedes Element enthält nur eine ganze Zahl.
Lösung:Jedes Element kennt nur genau seinen Nachfolger verkettete Datenstruktur
PRJ 2007/3Stefan Dissmann
Idee der Verkettung
17
1. für jedes Element ein Objekt anlegen
PRJ 2007/4Stefan Dissmann
Idee der Verkettung
17 9
1. für jedes Element ein Objekt anlegen
2. Objekt kennt weiteres Objekt
PRJ 2007/5Stefan Dissmann
Idee der Verkettung
17 9 33
1. für jedes Element ein Objekt anlegen
2. Objekt kennt weiteres Objekt
3. und so fort …
PRJ 2007/6Stefan Dissmann
Technische Umsetzung: Element
1. Problem:Klasse für einzelnes Element der Liste entwickeln
PRJ 2007/7Stefan Dissmann
Technische Umsetzung: Element
1. Problem:Klasse für einzelnes Element der Liste entwickeln
public class IntElement {
}
PRJ 2007/8Stefan Dissmann
Technische Umsetzung: Element
1. Problem:Klasse für einzelnes Element der Liste entwickeln
public class IntElement {
private int wert;
}
PRJ 2007/9Stefan Dissmann
Technische Umsetzung: Element
1. Problem:Klasse für einzelnes Element der Liste entwickeln
public class IntElement {
private int wert;
private IntElement nachfolger;
}
PRJ 2007/10Stefan Dissmann
Technische Umsetzung: Element
Und Konstruktor und Methoden ergänzen:
PRJ 2007/11Stefan Dissmann
Technische Umsetzung: Element
Und Konstruktor und Methoden ergänzen:
public class IntElement {
private int wert;
private IntElement nachfolger;
public IntElement(int w) {
wert = w;
nachfolger = null;
}
public void verkette(IntElement n) {
nachfolger = n;
}
}
PRJ 2007/12Stefan Dissmann
Technische Umsetzung: Element
Und Konstruktor und Methoden ergänzen:
public class IntElement {
private int wert;
private IntElement nachfolger;
public IntElement(int w) {
wert = w;
nachfolger = null;
}
public void verkette(IntElement n) {
nachfolger = n;
}
}
PRJ 2007/13Stefan Dissmann
Technische Umsetzung: Element
Und weitere Methoden:
public class IntElement {
…
public IntElement gibNachfolger() {
return nachfolger;
}
public int gibWert() {
return wert;
}
}
PRJ 2007/14Stefan Dissmann
Technische Umsetzung: Liste
2. Problem:Klasse für Liste von ganzen Zahlen entwickeln
PRJ 2007/15Stefan Dissmann
Technische Umsetzung: Liste
2. Problem:Klasse für Liste von ganzen Zahlen entwickeln
public class IntListe {
public IntListe() {…};
public void fügeAn(int w) {…};
public int gibErstes() {…};
public void löscheErstes() {…};
public boolean leer() {…};
}
PRJ 2007/16Stefan Dissmann
Technische Umsetzung: Liste
… und Attribute ergänzen:
public class IntListe {
private IntElement anfang, ende;
public IntListe() {…};
public void fügeAn(int w) {…};
public int gibErstes() {…};
public void löscheErstes() {…};
public boolean leer() {…};
}
PRJ 2007/17Stefan Dissmann
Implementierung: Liste
… und implementieren:
public IntListe() {
anfang = ende = null;
}
PRJ 2007/18Stefan Dissmann
Implementierung: Liste
… und implementieren:
public void fügeAn(int w) {
IntElement neu = new IntElement(w);
if (anfang == null) {
anfang = ende = neu;
} else {
ende.verkette(neu);
ende = neu;
}
}
PRJ 2007/19Stefan Dissmann
Implementierung: Liste
public void fügeAn(int w) {
IntElement neu = new IntElement(w);
if (anfang == null) {
anfang = ende = neu;
} else {
ende.verkette(neu);
ende = neu;
}
} anfang ende
null
PRJ 2007/20Stefan Dissmann
Implementierung: Liste
public void fügeAn(int w) {
IntElement neu = new IntElement(w);
if (anfang == null) {
anfang = ende = neu;
} else {
ende.verkette(neu);
ende = neu;
}
} wert nachfolger
neu
anfang ende
null
PRJ 2007/21Stefan Dissmann
Implementierung: Liste
public void fügeAn(int w) {
IntElement neu = new IntElement(w);
if (anfang == null) {
anfang = ende = neu;
} else {
ende.verkette(neu);
ende = neu;
}
} wert nachfolger
neu
null
anfang ende
PRJ 2007/22Stefan Dissmann
Implementierung: Liste
public void fügeAn(int w) {
IntElement neu = new IntElement(w);
if (anfang == null) {
anfang = ende = neu;
} else {
ende.verkette(neu);
ende = neu;
}
}
null
anfang ende
wert nachfolger
neu
PRJ 2007/23Stefan Dissmann
Implementierung: Liste
public void fügeAn(int w) {
IntElement neu = new IntElement(w);
if (anfang == null) {
anfang = ende = neu;
} else {
ende.verkette(neu);
ende = neu;
}
}
wert nachfolger
wert nachfolger
anfang ende
wert nachfolger
neu
…
PRJ 2007/24Stefan Dissmann
Implementierung: Liste
public void fügeAn(int w) {
IntElement neu = new IntElement(w);
if (anfang == null) {
anfang = ende = neu;
} else {
ende.verkette(neu);
ende = neu;
}
}
wert nachfolger
wert nachfolger
anfang ende
wert nachfolger
neu
…
PRJ 2007/25Stefan Dissmann
Implementierung: Liste
public void fügeAn(int w) {
IntElement neu = new IntElement(w);
if (anfang == null) {
anfang = ende = neu;
} else {
ende.verkette(neu);
ende = neu;
}
}
wert nachfolger
wert nachfolger
anfang ende
wert nachfolger
neu
…
PRJ 2007/26Stefan Dissmann
Implementierung: Liste
public int gibErstes() {
if (anfang != null)
return anfang.gibWert();
else
return 0;
}
PRJ 2007/27Stefan Dissmann
Implementierung: Liste
public boolean leer() {
return anfang == null;
}
PRJ 2007/28Stefan Dissmann
Implementierung: Liste
public void löscheErstes() {
if (anfang != ende) {
anfang = anfang.gibNachfolger();
} else {
anfang = ende = null;
}
}
PRJ 2007/29Stefan Dissmann
Anwendung der Liste
IntListe zahlen = new IntListe();zahlen.fügeAn(19);
zahlen.fügeAn(3);
zahlen.fügeAn(28);
while (!zahlen.leer()) {
System.out.println(zahlen.gibErstes());
zahlen.löscheErstes();
}
PRJ 2007/30Stefan Dissmann
Anwendung der Liste
IntListe zahlen = new IntListe();zahlen.fügeAn(19);
zahlen.fügeAn(3);
zahlen.fügeAn(28);
while (!zahlen.leer()) {
System.out.println(zahlen.gibErstes());
zahlen.löscheErstes();
}
Anmerkung:Bei der Benutzung von IntListe wird IntElement nicht
benötigt!