Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Diskrete Mathe1 12345678910111213141516171819 Diskrete Mathematik I Listen Vorlesung 4.

Ähnliche Präsentationen


Präsentation zum Thema: "Diskrete Mathe1 12345678910111213141516171819 Diskrete Mathematik I Listen Vorlesung 4."—  Präsentation transkript:

1 Diskrete Mathe Diskrete Mathematik I Listen Vorlesung 4

2 Diskrete Mathe letzte Stunde: rekursive Definitionen und Methoden heute: rekursive Datenstrukuren: Listen Rekursion 1

3 Diskrete Mathe 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 Mathe 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 Mathe 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 Mathe 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 Mathe class Element { int wert; Element weiter; } Die Klasse Element 5 Elemen t Zeiger auf ein Element int A 4x

8 Diskrete Mathe 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 Mathe A 7x Eine richtige kleine Liste 5 Die leere Liste 37 Der Kopf der Liste Der Rest der Liste

10 Diskrete Mathe 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 Mathe 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 Mathe 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 Mathe Kopf Element kopf; class Element { Element(int i) { wert = i; weiter = null; } int wert; Element weiter; } A 25x

14 Diskrete Mathe 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 Mathe 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 Mathe 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 Mathe 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 Mathe 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 A 25x

19 Diskrete Mathe 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 A 25x

20 Diskrete Mathe void FügeAn(int neuerWert) { Element lauf = this; while (lauf.weiter != null) lauf = lauf.weiter; lauf.weiter = new Element(neuerWert); } Kopf Element kopf; kopf = new Element(25); kopf.FügeAn(22); kopf.FügeAn(28); 12 A 25x

21 Diskrete Mathe 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 lauf 12 A 25x

22 Diskrete Mathe 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 A 25x

23 Diskrete Mathe 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 A 25x

24 Diskrete Mathe 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 lauf 12 A 25x

25 Diskrete Mathe 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 A 25x

26 Diskrete Mathe 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 A 25x

27 Diskrete Mathe 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 kopf

28 Diskrete Mathe 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 Mathe void FügeEin(int neuerWert) { Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert; } Einfügen am Anfang einer Liste 16 Kopf kopf.FügeEin(17) A 9x 15

30 Diskrete Mathe void FügeEin(int neuerWert) { Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert; } Einfügen am Anfang einer Liste 16 Kopf neuesElement A 9x

31 Diskrete Mathe 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 A 9x

32 Diskrete Mathe void FügeEin(int neuerWert) { Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert; } Einfügen am Anfang einer Liste 16 Kopf A 9x

33 Diskrete Mathe void FügeEin(int neuerWert) { Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert; } Einfügen am Anfang einer Liste Kopf A 9x

34 Diskrete Mathe void FügeEin(int neuerWert) { Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert; } Einfügen am Anfang einer Liste Kopf A 9x

35 Diskrete Mathe void FügeEin(int neuerWert) { Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert; } Einfügen am Anfang einer Liste Kopf A 9x

36 Diskrete Mathe void FügeEin(int neuerWert) { Element neuesElement = newElement(wert); neuesElement.weiter = weiter; weiter = neuesElement; wert = neuerWert; } Einfügen am Anfang einer Liste Kopf A 9x

37 Diskrete Mathe 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 Mathe 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 Mathe 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 Mathe 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


Herunterladen ppt "Diskrete Mathe1 12345678910111213141516171819 Diskrete Mathematik I Listen Vorlesung 4."

Ähnliche Präsentationen


Google-Anzeigen