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 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


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

Ähnliche Präsentationen


Google-Anzeigen