Top Banner
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung 5 11.11.99 -Listen-
40

Diskrete Mathematik I

Jan 21, 2016

Download

Documents

Ninon

Diskrete Mathematik I. Vorlesung 5 11.11.99 -Listen-. Rekursion. letzte Stunde: rekursive Definitionen und Methoden heute: rekursive Datenstrukuren: Listen. Übersicht. Listen ... als rekursive Struktur ... als dynamische Datenstrukturen Die Klasse Element - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Diskrete Mathematik I

Institut für Kartographie und GeoinformationProf. Dr. Lutz Plümer

Diskrete Mathematik IVorlesung 5

11.11.99

-Listen-

Page 2: Diskrete Mathematik I

2

• letzte Stunde:

rekursive Definitionen und Methoden

• heute:

rekursive Datenstrukuren: Listen

Rekursion

Page 3: Diskrete Mathematik I

3

Übersicht

• Listen – ... als rekursive Struktur– ... als dynamische Datenstrukturen

• Die Klasse Element– ... mit Element-konstruktor

• Eine richtige kleine Liste• Ein UML-Diagramm für „Element“• Aber wie kommt man nun zu einer Liste?• Anfügen von Elementen - Beispiel

Page 4: Diskrete Mathematik I

4

Übersicht (Fortsetzung)

• Einfügen am Anfang einer Liste– Problem– Beispiel– Problem der bisherigen Lösung

• Die Klasse „Liste“ (UML-Diagramm)• Die Klasse Element (vollständig)• Die Klasse „Liste“

Page 5: Diskrete Mathematik I

5

Listen als rekursive Struktur

• Die leere Liste Null ist eine Liste. • Wenn E ein Element ist und L eine Liste, dann ist

E L eine Liste.• Beispiele:

– die leere Liste { }– {1}– {1,3,2,5}

• Graphik für die leere Liste:

Page 6: Diskrete Mathematik I

6

Listen als Dynamische Datenstrukturen

• flexible Datenstruktur ohne vorherige Festlegungauf die Größe

• Vorteile gegenüber Arrays– beliebige Größenänderungen– effiziente Umordnung der Elemente

• Nachteil gegenüber Arrays– kein direkter Zugriff auf einzelne Elemente

Page 7: Diskrete Mathematik I

7

class Element{ int wert; Element weiter;}

5

Element int

Zeiger auf ein Element

Die Klasse Element

Page 8: Diskrete Mathematik I

8

class Element { Element(int i) { wert = i; weiter = null;} int wert; Element weiter;}

... mit Element-konstruktor

Das ist neu

• Die Prozedur Element(int i)ist ein Konstruktor, der bei der Erzeugung eines Elements mit new Element(i) automatisch aufgerufen wird.

Page 9: Diskrete Mathematik I

9

5

Die leere Liste

3 7

Der Kopf der Liste

Der Rest der Liste

Eine richtige kleine Liste

Page 10: Diskrete Mathematik I

10

Ein UML-Diagramm für „Element“

Element

+Element(i : int)

-wert : int

weiter

0..1

Beachte:• „weiter“ ist kein Attribut, sondern eine Beziehung• eine (UML-) Beziehung wird (in Java) als Attribut einer

zugehörigen Klasse implementiert• eine UML-Beziehung kann auch rekursiv sein

Beziehung Konstruktor

Ein oderkein Nachfolger

0..1

Page 11: Diskrete Mathematik I

11

Aber wie kommt man nun zu einer Liste?

• Wir haben:– die Klasse Element

• Eine Liste entsteht durch Erzeugung und Verkettung von Objekten vom Typ Element– Erzeugen des ersten Elements

• mit dem Konstruktor „Element“– Anfügen eines Elemente

• zusätzliche Prozedur

Page 12: Diskrete Mathematik I

12

void FügeAn(int neuerWert){ Element lauf = this; while (lauf.weiter != null) lauf = lauf.weiter; lauf.weiter = new Element(neuerWert);}

Zeiger auf dasaufrufende Objekt

Sucht das letzte Element

fügt neues Element an

Anfügen von Elementen

Page 13: Diskrete Mathematik I

Element kopf;

class Element{ Element(int i) { wert = i; weiter = null; } int wert; Element weiter;}

kopf

Page 14: Diskrete Mathematik I

Element kopf;kopf = new Element(25);

class Element{ Element(int i) { wert = i; weiter = null; } int wert; Element weiter;}

kopf

Page 15: Diskrete Mathematik I

Element kopf;kopf = new Element(25);

class Element{ Element(int i) { wert = i; weiter = null; } int wert; Element weiter;}

kopf

25

Page 16: Diskrete Mathematik I

Element kopf;kopf = new Element(25);kopf.FügeAn(22);

void FügeAn(int neuerWert){ Element lauf = this; while (lauf.weiter != null) lauf = lauf.weiter; lauf.weiter = new Element(neuerWert);}

25

kopf

Page 17: Diskrete Mathematik I

Element kopf;kopf = new Element(25);kopf.FügeAn(22);

void FügeAn(int neuerWert){ Element lauf = this; while (lauf.weiter != null) lauf = lauf.weiter; lauf.weiter = new Element(neuerWert);}

lauf25

kopf

Page 18: Diskrete Mathematik I

Element kopf;kopf = new Element(25);kopf.FügeAn(22);

void FügeAn(int neuerWert){ Element lauf = this; while (lauf.weiter != null) lauf = lauf.weiter; lauf.weiter = new Element(neuerWert);}

25

kopf

22

Page 19: Diskrete Mathematik I

Element kopf;kopf = new Element(25);kopf.FügeAn(22);

void FügeAn(int neuerWert){ Element lauf = this; while (lauf.weiter != null) lauf = lauf.weiter; lauf.weiter = new Element(neuerWert);}

25

kopf

22

Page 20: Diskrete Mathematik I

Element kopf;kopf = new Element(25);kopf.FügeAn(22);kopf.FügeAn(28);

void FügeAn(int neuerWert){ Element lauf = this; while (lauf.weiter != null) lauf = lauf.weiter; lauf.weiter = new Element(neuerWert);}

22

25

kopf

Page 21: Diskrete Mathematik I

Element kopf;kopf = new Element(25);kopf.FügeAn(22);kopf.FügeAn(28);

void FügeAn(int neuerWert){ Element lauf = this; while (lauf.weiter != null) lauf = lauf.weiter; lauf.weiter = new Element(neuerWert);}

lauf

22

25

kopf

Page 22: Diskrete Mathematik I

Element kopf;kopf = new Element(25);kopf.FügeAn(22);kopf.FügeAn(28);

void FügeAn(int neuerWert){ Element lauf = this; while (lauf.weiter != null) lauf = lauf.weiter; lauf.weiter = new Element(neuerWert);}

22

25

kopf

lauf

Page 23: Diskrete Mathematik I

Element kopf;kopf = new Element(25);kopf.FügeAn(22);kopf.FügeAn(28);

void FügeAn(int neuerWert){ Element lauf = this; while (lauf.weiter != null) lauf = lauf.weiter; lauf.weiter = new Element(neuerWert);}

22

25

kopf

lauf

Page 24: Diskrete Mathematik I

Element kopf;kopf = new Element(25);kopf.FügeAn(22);kopf.FügeAn(28);

void FügeAn(int neuerWert){ Element lauf = this; while (lauf.weiter != null) lauf = lauf.weiter; lauf.weiter = new Element(neuerWert);}

kopf

22

25 28

lauf

Page 25: Diskrete Mathematik I

Element kopf;kopf = new Element(25);kopf.FügeAn(22);kopf.FügeAn(28);

void FügeAn(int neuerWert){ Element lauf = this; while (lauf.weiter != null) lauf = lauf.weiter; lauf.weiter = new Element(neuerWert);}

28

22

25

kopf

Page 26: Diskrete Mathematik I

Element kopf;kopf = new Element(25);kopf.FügeAn(22);kopf.FügeAn(28);

void FügeAn(int neuerWert){ Element lauf = this; while (lauf.weiter != null) lauf = lauf.weiter; lauf.weiter = new Element(neuerWert);}

28

22

25

kopf

Page 27: Diskrete Mathematik I

27

15 22 28

15 22 2817

kopf

kopf

Problem: Einfügen am Anfang einer Liste

• Problem: es gibt bislang nur die Klasse Element• die Operation Einfügen muß vom ersten Element aufgerufen

werden• Umsetzung der Referenz „kopf“ erforderlich• das Kopf-Element hat aber keinen Zugriff auf die Referenz „kopf“• Lösung: Umkopieren von Wert

Page 28: Diskrete Mathematik I

28

void FügeEin(int neuerWert){ Element neuesElement = new Element(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert;}

Einfügen am Anfang einer Liste

Page 29: Diskrete Mathematik I

29

25 22 28kopf

void FügeEin(int neuerWert){ Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert;}

kopf.FügeEin(17)

Einfügen am Anfang einer Liste

Page 30: Diskrete Mathematik I

30

25 22 28kopf

void FügeEin(int neuerWert){ Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert;}

25neuesElement

Einfügen am Anfang einer Liste

Page 31: Diskrete Mathematik I

31

25 22 28kopf

void FügeEin(int neuerWert){ Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert;}

neuesElement

Einfügen am Anfang einer Liste

25

Page 32: Diskrete Mathematik I

32

25 22 28kopf

void FügeEin(int neuerWert){ Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert;}

Einfügen am Anfang einer Liste

25

Page 33: Diskrete Mathematik I

33

25 22 28kopf

void FügeEin(int neuerWert){ Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert;}

Einfügen am Anfang einer Liste

25

Page 34: Diskrete Mathematik I

34

25 22 28kopf

void FügeEin(int neuerWert){ Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert;}

25

Einfügen am Anfang einer Liste

Page 35: Diskrete Mathematik I

35

17 22 28kopf

void FügeEin(int neuerWert){ Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert;}

25

Einfügen am Anfang einer Liste

Page 36: Diskrete Mathematik I

36

17 22 28kopf

void FügeEin(int neuerWert){ Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert;}

25

Einfügen am Anfang einer Liste

Page 37: Diskrete Mathematik I

37

Problem der bisherigen Lösung

• Einfügen am Anfang mehr als umständlich• Einfügen am Ende ineffizient, insbesondere wenn die

Liste sehr lang ist• wo liegt das Problem?• bisheriges Modell

– wir haben zwar eine Klasse Element– aber keine Klasse Liste

• Lösung: Definition einer Klasse Liste– Verweis auf das erste Element– Verweis auf das letzte Element

Page 38: Diskrete Mathematik I

38

Liste0..1

kopf

0..1fuß

0..1

0..1Element

+Element(i : int)

-wert : intweiter

0..1

0..1

Die Klasse „Liste“

Page 39: Diskrete Mathematik I

39

class Element {private int wert; private Element weiter; Element(int i) { wert = i; weiter = null; }Element(int i, Element e) { wert = i; weiter = e; }void SetzeWert(int i) { wert = i; }int GibWert() { return wert; }void SetzeWeiter(Element e) { weiter = e; }Element GibWeiter() { return weiter; }

}

beachte:

• der Konstruktor Element kann sowohl ein- als auch zweistellig aufgerufen weden („Überladung“)

neu

Die Klasse Element (vollständig)

Page 40: Diskrete Mathematik I

class Liste {Liste() { kopf = fuß = null; }Liste(int w) { kopf = fuß = new Element(w); }private Element kopf, fuß;void FügeAn(int an) {

Element neu = new Element(an);if (fuß != null) {

fuß.SetzeWeiter(neu);fuß = neu;

}else

kopf = fuß = neu;}void FügeEin(int ein) {

kopf = new Element(ein, kopf);if (fuß == null)

fuß = kopf;}

}beachte die Fallunterscheidung der leeren Liste! leere Liste

leere Liste

Die Klasse „Liste“