Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Dorothea Meinhardt Geändert vor über 8 Jahren
1
Diskrete Mathe1 12345678910111213141516171819 Diskrete Mathematik I Listen Vorlesung 4
2
Diskrete Mathe1 12345678910111213141516171819 letzte Stunde: rekursive Definitionen und Methoden heute: rekursive Datenstrukuren: Listen Rekursion 1
3
Diskrete Mathe1 123456789101112131415161718192 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 Übersicht I
4
Diskrete Mathe1 123456789101112131415161718193 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“ Übersicht II
5
Diskrete Mathe1 123456789101112131415161718194 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: Listen als rekursive Struktur
6
Diskrete Mathe1 123456789101112131415161718195 flexible Datenstruktur ohne vorherige Festlegung auf 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 Listen als Dynamische Datenstrukturen
7
Diskrete Mathe1 123456789101112131415161718196 class Element { int wert; Element weiter; } Die Klasse Element 5 Elemen t Zeiger auf ein Element int A 4x
8
Diskrete Mathe1 123456789101112131415161718197... mit Element-konstruktor Das ist neu Die Methode Element(int i) ist ein Konstruktor, der bei der Erzeugung eines Elements mit new Element(i) automatisch aufgerufen wird. class Element { Element(int i) { wert = i; weiter = null;} int wert; Element weiter; }
9
Diskrete Mathe1 123456789101112131415161718198 A 7x Eine richtige kleine Liste 5 Die leere Liste 37 Der Kopf der Liste Der Rest der Liste
10
Diskrete Mathe1 12345678910111213141516171819 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 9 A 13x Ein UML-Diagramm für „Element“ weiter 0..1 Beziehung Konstruktor Ein oder kein Nachfolger 0..1 Element +Element(i : int) -wert : int
11
Diskrete Mathe1 1234567891011121314151617181910 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 Elements zusätzliche Prozedur Aber wie kommt man nun zu einer Liste?
12
Diskrete Mathe1 1234567891011121314151617181911 void FügeAn(int neuerWert) { Element lauf = this; while (lauf.weiter != null) lauf = lauf.weiter; lauf.weiter = new Element(neuerWert); } Anfügen von Elementen Sucht das letzte Element Zeiger auf das aufrufende Objekt fügt neues Element an A 10x
13
Diskrete Mathe1 1234567891011121314151617181912 Kopf Element kopf; class Element { Element(int i) { wert = i; weiter = null; } int wert; Element weiter; } A 25x
14
Diskrete Mathe1 1234567891011121314151617181912 Element kopf; kopf = new Element(25); class Element { Element(int i) { wert = i; weiter = null; } int wert; Element weiter; } Kopf 12 A 25x
15
Diskrete Mathe1 1234567891011121314151617181912 Element kopf; kopf = new Element(25); class Element { Element(int i) { wert = i; weiter = null; } int wert; Element weiter; } 25 Kopf 12 A 25x
16
Diskrete Mathe1 1234567891011121314151617181912 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 12 A 25x
17
Diskrete Mathe1 1234567891011121314151617181912 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); } lauf 25 Kopf 12 A 25x
18
Diskrete Mathe1 1234567891011121314151617181912 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); } Kopf 25 22 12 A 25x
19
Diskrete Mathe1 1234567891011121314151617181912 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); } Kopf 25 22 12 A 25x
20
Diskrete Mathe1 1234567891011121314151617181912 void FügeAn(int neuerWert) { Element lauf = this; while (lauf.weiter != null) lauf = lauf.weiter; lauf.weiter = new Element(neuerWert); } Kopf 22 25 Element kopf; kopf = new Element(25); kopf.FügeAn(22); kopf.FügeAn(28); 12 A 25x
21
Diskrete Mathe1 12345678910111213141516171819 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 lauf 12 A 25x
22
Diskrete Mathe1 12345678910111213141516171819 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 25 lauf 22 12 A 25x
23
Diskrete Mathe1 1234567891011121314151617181912 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 25 lauf 22 12 A 25x
24
Diskrete Mathe1 12345678910111213141516171819 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 25 22 28 lauf 12 A 25x
25
Diskrete Mathe1 12345678910111213141516171819 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 25 22 28 12 A 25x
26
Diskrete Mathe1 1234567891011121314151617181912 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 25 22 28 12 A 25x
27
Diskrete Mathe1 12345678910111213141516171819 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 13 A 8x Problem: Einfügen am Anfang einer Liste 15222815222817 kopf
28
Diskrete Mathe1 1234567891011121314151617181914 void FügeEin(int neuerWert) { Element neuesElement = new Element(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert; } Einfügen am Anfang einer Liste
29
Diskrete Mathe1 12345678910111213141516171819 void FügeEin(int neuerWert) { Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert; } Einfügen am Anfang einer Liste 16 Kopf 252228 kopf.FügeEin(17) A 9x 15
30
Diskrete Mathe1 1234567891011121314151617181915 void FügeEin(int neuerWert) { Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert; } Einfügen am Anfang einer Liste 16 Kopf 252228 neuesElement 25 15 A 9x
31
Diskrete Mathe1 1234567891011121314151617181915 void FügeEin(int neuerWert) { Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert; } Einfügen am Anfang einer Liste 16 neuesElement 25 Kopf 252228 15 A 9x
32
Diskrete Mathe1 1234567891011121314151617181915 void FügeEin(int neuerWert) { Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert; } Einfügen am Anfang einer Liste 16 Kopf 25222825 15 A 9x
33
Diskrete Mathe1 1234567891011121314151617181915 void FügeEin(int neuerWert) { Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert; } Einfügen am Anfang einer Liste 16 252228 Kopf 25 15 A 9x
34
Diskrete Mathe1 1234567891011121314151617181915 void FügeEin(int neuerWert) { Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert; } Einfügen am Anfang einer Liste 16 252228 Kopf 25 15 A 9x
35
Diskrete Mathe1 1234567891011121314151617181915 void FügeEin(int neuerWert) { Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert; } Einfügen am Anfang einer Liste 16 172228 Kopf 25 15 A 9x
36
Diskrete Mathe1 1234567891011121314151617181915 void FügeEin(int neuerWert) { Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert; } Einfügen am Anfang einer Liste 16 172228 Kopf 25 15 A 9x
37
Diskrete Mathe1 1234567891011121314151617181916 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 Problem der bisherigen Lösung
38
Diskrete Mathe1 1234567891011121314151617181917 A 8x Die Klasse „Liste“ Liste 0..1 kopf 0..1 fuß 0..1 Element +Element(i : int) -wert : int weiter 0..1
39
Diskrete Mathe1 1234567891011121314151617181918 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 werden („Überladung“) Die Klasse Element (vollständig) neu
40
Diskrete Mathe1 12345678910111213141516171819 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! Die Klasse „Liste“ leere Liste
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.