Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen Übungsmodul 6 Dr. W. Narzt u. Dr. A. Stritzinger.

Ähnliche Präsentationen


Präsentation zum Thema: "Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen Übungsmodul 6 Dr. W. Narzt u. Dr. A. Stritzinger."—  Präsentation transkript:

1 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen Übungsmodul 6 Dr. W. Narzt u. Dr. A. Stritzinger Institut für Wirtschaftsinformatik- Software Engineering JKU Linz

2 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 2 Verbund-Datentypen als Werte Verbund-Variable: Typ – Name – Wert – Adresse JanaSpeicher AdresseWert type Pair = { int a int b } Pair p p.a = 10 p.b = Name = p Typ = Pair Adresse = 100 Adresse = 100 Wert = 10 Adresse = 104 Wert = 13 pa b 13 10

3 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 3 Referenzdatentypen JanaSpeicher AdresseWert reftype RefPair = { int a int b } RefPair p P = new RefPair p.a = 10 p.b = Name = p Typ = RefPair Adresse = 100 Wert = 112 Adresse = 112 Wert = 10 Adresse = 116 Wert = 13 Warum Referenzvariablen? zur Laufzeit kann (beliebig viel) Speicherplatz für neue Daten belegt werden Strukturierung der Daten pa b a b 13 10

4 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 4 Vergleich Referenz/Verbund-Datentypen I type Person = { char[] firstName, lastName } reftype RefPerson = { char[] firstName, lastName } Deklaration Erzeugen von Datenobjekten Person student Objekt wird bei Deklaration bereits erzeugt; Wert undefiniert! RefPerson refStudent Wert von student: Referenz auf ein Objekt Student; noch nicht initialisiert! refStudent = new RefPerson erst jetzt ist ein Objekt des Typs RefPerson erzeugt. Wert ist noch nicht definiert Wert-Variable Referenzvariable

5 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 5 Vergleich Referenz/Verbund-Datentypen II student.firstName = "Hugo"refStudent^.firstName = "Hugo" oder refStudent.firstName = "Hugo" Zugriff auf Elemente Löschen von Datenobjekten Werden beim Verlassen des Algorithmus automatisch aus dem Speicher entfernt delete refStudent jetzt gilt: refStudent == null Spezieller Referenzwert null refStudent = null - Wert-Variable Referenzvariable

6 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 6 Person hugo, franz hugo.firstname = "Hugo " hugo.lastname = "Berger " franz = hugo RefPerson hugo, franz hugo = new RefPerson hugo^.firstname = "Hugo " hugo^.lastname = "Berger " franz = hugo Achtung: Zuweisung der Referenz! Zuweisung Vergleich Person a,b a.firstName = "Hugo" a.lastName = "Berger" b.firstName = "Hugo" b.lastName = "Berger" if (a == b) {...} // true RefPerson a,b,c a = new RefPerson, b = …; c =... a.firstName = "Hugo " a.lastName = "Berger " b.firstName = "Hugo " b.lastName = "Berger" c=a if (a == b) {...} //Gleichheit false! if (a == c) {...} //Identität true! Wert-Variable Referenzvariable Vergleich Referenz/Verbund-Datentypen III

7 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 7 Vergleich Referenz/Verbund-Datentypen IV f( Person p) { p.firstName = "nix" } Kopie des Werts = Datenobjekt selbst wird übergeben g( RefPerson p) { p.firstName = "nix" } Kopie des Werts = Referenz wird übergeben !! Verwendung als Eingangsparameter Verwendung als Übergangsparameter f( Person p) { Person a a.firstName = "franz" a.lastName ="Huber" p = a } g( RefPerson p) { RefPerson b; b = new Refperson b.firstName = "franz" b.lastName = "Huber" p = b } Referenz p wird verändert! Wert-Variable Referenzvariable

8 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 8 Verkettete Liste Idee: Liste als Folge von Datenelementen. Jedes Element enthält einen Verweis auf das nachfolgende Element. Liste kann also beliebig lang werden. Rekursiver Datentyp: enthält Referenzvariablen vom selben Typ wie er selbst ist. (Nur bei Referenztypen möglich!) Datentyp für Listenelement: reftype Node = { int value Node next }

9 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 9 Verkettete Liste als ADT type List = { reftype Node = { int value Node next } Node first init() { first = null } append( int a) {... } } //Verwendung useList() { List myList myList.init().... myList.append( 10) } first myList first myList value: 10 next:

10 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 10 Liste durchlaufen (Bsp. Ausgabe) Von vorne nach hinten printList() { Node n = first while (n != null) { writeln(n^.value) n = n^.next } Von hinten nach vorne printList() { Node last = null while (first != last) { Node n = first while (n^.next != last) { n = n^.next } writeln(n^.value) last = n }

11 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 11 Elemente vorne einfügen insertFirst( int a) { Node n n = new Node// neues Element erzeugen n^.value = a// und initialisieren n^.next = first// Element vor das erste Element einhängen first = n// neues Element ist ab nun das erste Element } Bsp: myList.insertFirst( 199) myList.first value: 18 next: value: 13 next: n value: 199 next:

12 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 12 Elemente hinten anhängen appendLast( int a) { Node n // neuen Knoten erzeugen und initialisieren n = new Node n^.value = a; n^.next = null if (first == null) // erstes Element wird eingefügt { first = n } else // Ende der Liste suchen { Node cur = first while (cur^.next != null) { cur = cur^.next } // cur zeigt auf das letzte Element in der Liste (cur.next == null) cur.next = n } } Bsp: myList.appendLast( 199) myList.first value: 18 next: value: 13 next: n value: 199 next: cur

13 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 13 Liste vollständig löschen delete() { while (first != null) { Node next = first^.next // Referenz auf das nächste Element delete first// erstes Element der Liste löschen first = next// neues erstes Element der Liste } // first ist null }

14 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 14 Element sortiert einfügen insertSorted( int a) { Node n, cur, prev n = new Node n^.value = a cur = first // Einfügeposition suchen prev = null while ((cur != null) && (cur^.value < a)) { prev = cur cur = cur^.next } // prev zeigt auf Element vor der Einfügeposition if (prev != null) // Einfügen in der Mitte oder am Ende? { prev^.next = n //Mitte: cur != null, Ende: cur == null n^.next = cur } else // Einfügen am Beginn, oder die Liste ist leer { first = n n^.next = cur // leere Liste: cur == null } }

15 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 15 Zirkuläre Liste mit Sentinel Sonderfälle reduzieren Liste enthält immer ein Element (Sentinel) Letzte Element verweist auf das erste Element der Liste Datentyp und Initialisierung: type List = { reftype Node = { int value Node next } Node sentinel init() { sentinel = new Node sentinel ^.next = sentinel sentinel ^.value = 0 // Wert irrelevant! } value: 0 next: sentinel

16 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 16 Zirkuläre Liste mit Sentinel Sortiertes einfügen: insert( int a) { Node n, cur, prev n = new Node n^.value = a cur = sentinel ^.next prev = sentinel while ((cur != sentinel) && (cur^.value < a)) { prev = cur cur = cur^.next } n^.next = cur prev^.next = n } beginne die Suche mit dem "1." Element mit gültigen Wert cur zeigt auf das Element hinter Einfügeposition (falls am Ende der Liste einzufügen ist, auf sentinel.) prev zeigt auf das Element vor der Einfügeposition (falls am Beginn der Liste einzufügen ist, auf sentinel).

17 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 17 Doppelt verkettete Liste type List = { reftype Node = { int value Node next Node prev } Node first Node last init() { first = null last = null } append( int a) {... } } first myList first myList value: 10 next: prev last first myList value: 10 next: prev last value: 13 next: prev

18 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 18 Löschen aus einer doppelt verketteten Liste Fall 1: Normalfalln^.prev^.next = n^.next n^.next^.prev = n^.prev Fall 2: Löschen am Anfangfirst = n^.next n^.next^.prev = null (n^.next^.prev = n^.prev) Fall 3: Löschen am Endelast = n^.prev n^.prev^.next = null (n^.prev^.next = n^.next) Fall 4: Nur 1 Elementfirst = null last = null (first = n^.next) (last = n^.prev) f l n f l n f l n f l n

19 Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 19 Löschen aus einer doppelt verketteten Liste delete ( int a) { // element suchen Node n = first while ((n != null) && (n^.value != a)) { n = n^.next } // element gefunden? if (n != null) { if (n == first) first = n^.next if (n == last) last = n^.prev if (n != first) n^.prev^.next = n^.next if (n != last) n^.next^.prev = n^.prev delete n }


Herunterladen ppt "Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen Übungsmodul 6 Dr. W. Narzt u. Dr. A. Stritzinger."

Ähnliche Präsentationen


Google-Anzeigen