46
Informatik I Jan-Georg Smaus Die Klasse LinkedList Informatik I 19. Schleifen und Iteration f¨ ur verlinkte Listen Jan-Georg Smaus Albert-Ludwigs-Universit¨ at Freiburg 27. Januar 2011 1 / 21

Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

  • Upload
    vominh

  • View
    220

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedListInformatik I

19. Schleifen und Iteration fur verlinkte Listen

Jan-Georg Smaus

Albert-Ludwigs-Universitat Freiburg

27. Januar 2011

1 / 21

Page 2: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Sequenztypen

Wir werden uns jetzt weiter mit Schleifen und Iterationbeschaftigen, und zwar fur verlinkte Listen.

Verlinkte Listen sind ein Sequenztyp, den wir selbst gebauthaben.

Es gibt auch einige eingebaute Sequenztypen in Python,die wir spater betrachten werden.

Damit verlinkte Listen ein vollwertiger Sequenztyp imSinne von Python waren, mussten wir noch einige weitereMethoden zur Verfugung stellen . . .

Entscheidend aber ist: Objekte eines Sequenztypsenthalten andere Dinge in einer bestimmten Reihenfolge.Es ist also fur jedes Ding wohldefiniert, was das nachsteDing ist.Aquivalent: es ist wohldefiniert, was das erste, zweite,. . . Ding ist.

2 / 21

Page 3: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Sequenztypen

Wir werden uns jetzt weiter mit Schleifen und Iterationbeschaftigen, und zwar fur verlinkte Listen.

Verlinkte Listen sind ein Sequenztyp, den wir selbst gebauthaben.

Es gibt auch einige eingebaute Sequenztypen in Python,die wir spater betrachten werden.

Damit verlinkte Listen ein vollwertiger Sequenztyp imSinne von Python waren, mussten wir noch einige weitereMethoden zur Verfugung stellen . . .

Entscheidend aber ist: Objekte eines Sequenztypsenthalten andere Dinge in einer bestimmten Reihenfolge.Es ist also fur jedes Ding wohldefiniert, was das nachsteDing ist.Aquivalent: es ist wohldefiniert, was das erste, zweite,. . . Ding ist.

2 / 21

Page 4: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Sequenztypen

Wir werden uns jetzt weiter mit Schleifen und Iterationbeschaftigen, und zwar fur verlinkte Listen.

Verlinkte Listen sind ein Sequenztyp, den wir selbst gebauthaben.

Es gibt auch einige eingebaute Sequenztypen in Python,die wir spater betrachten werden.

Damit verlinkte Listen ein vollwertiger Sequenztyp imSinne von Python waren, mussten wir noch einige weitereMethoden zur Verfugung stellen . . .

Entscheidend aber ist: Objekte eines Sequenztypsenthalten andere Dinge in einer bestimmten Reihenfolge.Es ist also fur jedes Ding wohldefiniert, was das nachsteDing ist.Aquivalent: es ist wohldefiniert, was das erste, zweite,. . . Ding ist.

2 / 21

Page 5: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Iterieren uber Sequenzen

Uber Sequenzen kann man iterieren, d.h., man kann eineSchleife schreiben, die nacheinander die Elemente einerSequenz “besucht” und ggf. irgendetwas damit tut.

Alle rekursiven Methoden der LinkedList-Klasse kannman auch so umschreiben, dass sie uber das Objektiterieren, d.h., man kann iterative anstatt rekursiveMethoden schreiben.Das werden wir jetzt tun.

Fur die eingebauten Sequenztypen gibt es eine besondersmachtige Unterstutzung fur das Iterieren, aber dazu imnachsten Kapitel . . .

3 / 21

Page 6: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Iterieren uber Sequenzen

Uber Sequenzen kann man iterieren, d.h., man kann eineSchleife schreiben, die nacheinander die Elemente einerSequenz “besucht” und ggf. irgendetwas damit tut.

Alle rekursiven Methoden der LinkedList-Klasse kannman auch so umschreiben, dass sie uber das Objektiterieren, d.h., man kann iterative anstatt rekursiveMethoden schreiben.Das werden wir jetzt tun.

Fur die eingebauten Sequenztypen gibt es eine besondersmachtige Unterstutzung fur das Iterieren, aber dazu imnachsten Kapitel . . .

3 / 21

Page 7: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Die Klasse LinkedList

4 / 21

Page 8: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Erinnerung: die Attribute

Hier noch einmal die Definition von __init__ der KlasseLinkedList, damit wir die Attribute sehen:

linkedlist iterative

class LinkedList:

def __init__(self):

self.data = None

self.next = None

5 / 21

Page 9: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

prettyprint

Die erste rekursive Prozedur war _prettyprint. Zunachstprettyprint:

linkedlist iterative

class LinkedList:

. . .def prettyprint(self):

if self.next is None:

print("empty")

else:

print("cons", end=" ")

self._prettyprint()

6 / 21

Page 10: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

prettyprint

Jetzt _prettyprint:

linkedlist iterative

class LinkedList:

. . .def _prettyprint(self):

curr = self

while curr.next is not None:

print(curr.data, end=" ")

curr = curr.next

print()

7 / 21

Page 11: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Erklarung zu prettyprint

Anfangs ist curr (das erste Element von) self.

Die Bedingung curr.next is not None bedeutet: curr

ist ein echtes Listenelement von self, also nicht dasletzte, unechte Listenelement von self (die leere Liste).

In jedem Schleifendurchlauf wird das data-Attribut voncurr ausgedruckt und curr auf seinen Nachfolger gesetzt.

Somit nimmt curr nacheinander die Werte aller echtenListenelemente an.

Danach folgt der Aufruf print() fur einen Zeilenumbruch.

8 / 21

Page 12: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Erklarung zu prettyprint

Anfangs ist curr (das erste Element von) self.

Die Bedingung curr.next is not None bedeutet: curr

ist ein echtes Listenelement von self, also nicht dasletzte, unechte Listenelement von self (die leere Liste).

In jedem Schleifendurchlauf wird das data-Attribut voncurr ausgedruckt und curr auf seinen Nachfolger gesetzt.

Somit nimmt curr nacheinander die Werte aller echtenListenelemente an.

Danach folgt der Aufruf print() fur einen Zeilenumbruch.

8 / 21

Page 13: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

copy

linkedlist iterative

class LinkedList:

. . .def copy(self):

newfirst = LinkedList()

newfirst.data = self.data

oldcurr = self

newcurr = newfirst

while oldcurr.next is not None:

newcurr.next = LinkedList()

newcurr.next.data = oldcurr.next.data

newcurr = newcurr.next

oldcurr = oldcurr.next

return newfirst

9 / 21

Page 14: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Vor der Schleife

Die vier Zeilen vor der Schleife haben folgenden Effekt:

e1 -

self

e1 -

self/oldcurr

. . .None None

None None

newfirst

e1 None

newfirst

e1 None

newfirst/newcurr

newfirst ist momentan keine korrekte verlinkte Liste!

10 / 21

Page 15: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Vor der Schleife

Die vier Zeilen vor der Schleife haben folgenden Effekt:

e1 -

self

e1 -

self/oldcurr

. . .None None

None None

newfirst

e1 None

newfirst

e1 None

newfirst/newcurr

newfirst ist momentan keine korrekte verlinkte Liste!

10 / 21

Page 16: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Vor der Schleife

Die vier Zeilen vor der Schleife haben folgenden Effekt:

e1 -

self

e1 -

self/oldcurr

. . .None None

None None

newfirst

e1 None

newfirst

e1 None

newfirst/newcurr

newfirst ist momentan keine korrekte verlinkte Liste!

10 / 21

Page 17: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Vor der Schleife

Die vier Zeilen vor der Schleife haben folgenden Effekt:

e1 -

self

e1 -

self/oldcurr

. . .None None

None None

newfirst

e1 None

newfirst

e1 None

newfirst/newcurr

newfirst ist momentan keine korrekte verlinkte Liste!

10 / 21

Page 18: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Vor der Schleife

Die vier Zeilen vor der Schleife haben folgenden Effekt:

e1 -

self

e1 -

self/oldcurr

. . .None None

None None

newfirst

e1 None

newfirst

e1 None

newfirst/newcurr

newfirst ist momentan keine korrekte verlinkte Liste!

10 / 21

Page 19: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Vor der Schleife

Die vier Zeilen vor der Schleife haben folgenden Effekt:

e1 -

self

e1 -

self/oldcurr

. . .None None

None None

newfirst

e1 None

newfirst

e1 None

newfirst/newcurr

newfirst ist momentan keine korrekte verlinkte Liste!

10 / 21

Page 20: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Allgemeiner Schleifendurchlauf

e1 -

self. . . ei -

oldcurr

ei -

ei+1 -

ei+1 -

oldcurr

. . .None None

e1 -

newfirst. . . ei None

newcurr

ei -

newcurr

ei - None Noneei+1 Noneei+1 None

newcurr

Die ersten i Eintrage sind schon kopiert. newfirst istmonentan keine korrekte verlinkte Liste.

Jetzt ist newfirst eine korrekte verlinkte Liste.

Und jetzt schon wieder nicht.

Die ersten i+ 1 Eintrage sind kopiert. Im Grunde ist dieSituation exakt die gleiche wie vor dem Durchlauf, nur umein Element verschoben.

11 / 21

Page 21: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Allgemeiner Schleifendurchlauf

e1 -

self. . . ei -

oldcurr

ei -

ei+1 -

ei+1 -

oldcurr

. . .None None

e1 -

newfirst. . .

ei None

newcurr

ei -

newcurr

ei -

None None

ei+1 Noneei+1 None

newcurr

Die ersten i Eintrage sind schon kopiert. newfirst istmonentan keine korrekte verlinkte Liste.

Jetzt ist newfirst eine korrekte verlinkte Liste.

Und jetzt schon wieder nicht.

Die ersten i+ 1 Eintrage sind kopiert. Im Grunde ist dieSituation exakt die gleiche wie vor dem Durchlauf, nur umein Element verschoben.

11 / 21

Page 22: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Allgemeiner Schleifendurchlauf

e1 -

self. . . ei -

oldcurr

ei -

ei+1 -

ei+1 -

oldcurr

. . .None None

e1 -

newfirst. . .

ei None

newcurr

ei -

newcurr

ei - None None

ei+1 None

ei+1 None

newcurr

Die ersten i Eintrage sind schon kopiert. newfirst istmonentan keine korrekte verlinkte Liste.

Jetzt ist newfirst eine korrekte verlinkte Liste.

Und jetzt schon wieder nicht.

Die ersten i+ 1 Eintrage sind kopiert. Im Grunde ist dieSituation exakt die gleiche wie vor dem Durchlauf, nur umein Element verschoben.

11 / 21

Page 23: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Allgemeiner Schleifendurchlauf

e1 -

self. . . ei -

oldcurr

ei -

ei+1 -

ei+1 -

oldcurr

. . .None None

e1 -

newfirst. . .

ei None

newcurr

ei -

newcurr

ei -

None Noneei+1 None

ei+1 None

newcurr

Die ersten i Eintrage sind schon kopiert. newfirst istmonentan keine korrekte verlinkte Liste.

Jetzt ist newfirst eine korrekte verlinkte Liste.

Und jetzt schon wieder nicht.

Die ersten i+ 1 Eintrage sind kopiert. Im Grunde ist dieSituation exakt die gleiche wie vor dem Durchlauf, nur umein Element verschoben.

11 / 21

Page 24: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Allgemeiner Schleifendurchlauf

e1 -

self. . .

ei -

oldcurr

ei -

ei+1 -

ei+1 -

oldcurr. . .

None None

e1 -

newfirst. . .

ei None

newcurr

ei -

newcurr

ei -

None Noneei+1 None

ei+1 None

newcurr

Die ersten i Eintrage sind schon kopiert. newfirst istmonentan keine korrekte verlinkte Liste.

Jetzt ist newfirst eine korrekte verlinkte Liste.

Und jetzt schon wieder nicht.

Die ersten i+ 1 Eintrage sind kopiert. Im Grunde ist dieSituation exakt die gleiche wie vor dem Durchlauf, nur umein Element verschoben.

11 / 21

Page 25: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Allgemeiner Schleifendurchlauf

e1 -

self. . .

ei -

oldcurr

ei -

ei+1 -

ei+1 -

oldcurr. . .

None None

e1 -

newfirst. . .

ei None

newcurr

ei -

newcurr

ei -

None Noneei+1 None

ei+1 None

newcurr

Die ersten i Eintrage sind schon kopiert. newfirst istmonentan keine korrekte verlinkte Liste.

Jetzt ist newfirst eine korrekte verlinkte Liste.

Und jetzt schon wieder nicht.

Die ersten i+ 1 Eintrage sind kopiert. Im Grunde ist dieSituation exakt die gleiche wie vor dem Durchlauf, nur umein Element verschoben.

11 / 21

Page 26: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Letzter Schleifendurchlauf

e1 -

self

. . . en -

oldcurr

en -

None None

None None

oldcurr

e1 -

newfirst

. . . en None

newcurr

en -

newcurr

en - None NoneNone None

newcurr

Alle n Eintrage sind schon kopiert. newfirst istmonentan keine korrekte verlinkte Liste.

Jetzt ist newfirst eine korrekte verlinkte Liste.

None wird “kopiert”. newfirst bleibt eine korrekteverlinkte Liste.

12 / 21

Page 27: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Letzter Schleifendurchlauf

e1 -

self

. . . en -

oldcurr

en -

None None

None None

oldcurr

e1 -

newfirst

. . .

en None

newcurr

en -

newcurr

en -

None None

None None

newcurr

Alle n Eintrage sind schon kopiert. newfirst istmonentan keine korrekte verlinkte Liste.

Jetzt ist newfirst eine korrekte verlinkte Liste.

None wird “kopiert”. newfirst bleibt eine korrekteverlinkte Liste.

12 / 21

Page 28: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Letzter Schleifendurchlauf

e1 -

self

. . . en -

oldcurr

en -

None None

None None

oldcurr

e1 -

newfirst

. . .

en None

newcurr

en -

newcurr

en -

None None

None None

newcurr

Alle n Eintrage sind schon kopiert. newfirst istmonentan keine korrekte verlinkte Liste.

Jetzt ist newfirst eine korrekte verlinkte Liste.

None wird “kopiert”. newfirst bleibt eine korrekteverlinkte Liste.

12 / 21

Page 29: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Letzter Schleifendurchlauf

e1 -

self

. . . en -

oldcurr

en -

None None

None None

oldcurr

e1 -

newfirst

. . .

en None

newcurr

en -

newcurr

en -

None None

None None

newcurr

Alle n Eintrage sind schon kopiert. newfirst istmonentan keine korrekte verlinkte Liste.

Jetzt ist newfirst eine korrekte verlinkte Liste.

None wird “kopiert”. newfirst bleibt eine korrekteverlinkte Liste.

12 / 21

Page 30: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Letzter Schleifendurchlauf

e1 -

self

. . .

en -

oldcurr

en -

None None

None None

oldcurr

e1 -

newfirst

. . .

en None

newcurr

en -

newcurr

en -

None None

None None

newcurr

Alle n Eintrage sind schon kopiert. newfirst istmonentan keine korrekte verlinkte Liste.

Jetzt ist newfirst eine korrekte verlinkte Liste.

None wird “kopiert”. newfirst bleibt eine korrekteverlinkte Liste.

12 / 21

Page 31: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Korrektheit von Programmen

Wir haben uns soeben recht grundlich davon uberzeugt,dass copy korrekt ist.

Es gibt einen Formalismus, der eine solche Argumentationnoch viel praziser vollzieht: Hoare-Kalkul.

Der SatzIm Grunde ist die Situation exakt die gleiche wievor dem Durchlauf, nur um ein Elementverschoben.

hat in diesem Formalismus eine Bezeichnung:Schleifeninvariante.

13 / 21

Page 32: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Korrektheit von Programmen

Wir haben uns soeben recht grundlich davon uberzeugt,dass copy korrekt ist.

Es gibt einen Formalismus, der eine solche Argumentationnoch viel praziser vollzieht: Hoare-Kalkul.

Der SatzIm Grunde ist die Situation exakt die gleiche wievor dem Durchlauf, nur um ein Elementverschoben.

hat in diesem Formalismus eine Bezeichnung:

Schleifeninvariante.

13 / 21

Page 33: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Korrektheit von Programmen

Wir haben uns soeben recht grundlich davon uberzeugt,dass copy korrekt ist.

Es gibt einen Formalismus, der eine solche Argumentationnoch viel praziser vollzieht: Hoare-Kalkul.

Der SatzIm Grunde ist die Situation exakt die gleiche wievor dem Durchlauf, nur um ein Elementverschoben.

hat in diesem Formalismus eine Bezeichnung:Schleifeninvariante.

13 / 21

Page 34: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

append

linkedlist iterative

class LinkedList:

. . .def append(self, other):

if self.is_empty():

return other

else:

curr = self

while curr.next.next is not None:

curr = curr.next

curr.next = other

return self

14 / 21

Page 35: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Erklarungen zu append

Die Bedingung curr.next.next is not None bedeutet:curr ist ein echtes Listenelement von self, und zwarspatestens das vorletzte.

Sobald die Bedingung curr.next.next is not None

erstmals verletzt ist, bedeutet dies:

curr ist das letzteechte Listenelement.Die Zuweisung curr.next = other sorgt dann dafur,dass das next-Attribut des letzten Listenelements aufother umgebogen wird.

15 / 21

Page 36: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Erklarungen zu append

Die Bedingung curr.next.next is not None bedeutet:curr ist ein echtes Listenelement von self, und zwarspatestens das vorletzte.

Sobald die Bedingung curr.next.next is not None

erstmals verletzt ist, bedeutet dies: curr ist das letzteechte Listenelement.Die Zuweisung curr.next = other sorgt dann dafur,dass das next-Attribut des letzten Listenelements aufother umgebogen wird.

15 / 21

Page 37: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

without

linkedlist iterative

class LinkedList:

. . .def without(self, entry):

if self.is_empty():

return self

else:

if self.data == entry:

return self.next

else:

curr = self

while curr.next.next is not None:

if curr.next.data == entry:

curr.next = curr.next.next

break

else:

curr = curr.next

return self

16 / 21

Page 38: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Erklarungen zu without

Bis zum zweiten else sieht es auch wie die rekursiveVariante.

Wie oben auch bedeutet die Bedingungcurr.next.next is not None: curr ist ein echtesListenelement von self, und zwar spatestens dasvorletzte.

In jedem Durchlauf vergleichen wir nicht etwa curr.data

mit entry, sondern curr.next.data.

Warum? In dem Moment, in dem wir entry in der Listefinden, mussen wir Zugriff auf den Vorganger diesesElements haben, denn dessen next-Attribut mussumgebogen werden.

17 / 21

Page 39: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Erklarungen zu without

Bis zum zweiten else sieht es auch wie die rekursiveVariante.

Wie oben auch bedeutet die Bedingungcurr.next.next is not None: curr ist ein echtesListenelement von self, und zwar spatestens dasvorletzte.

In jedem Durchlauf vergleichen wir nicht etwa curr.data

mit entry, sondern curr.next.data.

Warum?

In dem Moment, in dem wir entry in der Listefinden, mussen wir Zugriff auf den Vorganger diesesElements haben, denn dessen next-Attribut mussumgebogen werden.

17 / 21

Page 40: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Erklarungen zu without

Bis zum zweiten else sieht es auch wie die rekursiveVariante.

Wie oben auch bedeutet die Bedingungcurr.next.next is not None: curr ist ein echtesListenelement von self, und zwar spatestens dasvorletzte.

In jedem Durchlauf vergleichen wir nicht etwa curr.data

mit entry, sondern curr.next.data.

Warum? In dem Moment, in dem wir entry in der Listefinden, mussen wir Zugriff auf den Vorganger diesesElements haben, denn dessen next-Attribut mussumgebogen werden.

17 / 21

Page 41: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

replace

linkedlist iterative

class LinkedList:

. . .def replace(self, old, new):

curr = self

while (curr.data != old and

curr.next is not None):

curr = curr.next

if curr.next is not None:

curr.data = new

return True

return False

18 / 21

Page 42: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Erklarungen zu replace

Die Schleifenbedingung konnte aus zwei Grunden verletztsein:

curr.data enthalt den zu ersetzenden Eintrag. In diesemFall ersetzen wir und geben True zuruck.curr ist das letzte, unechte Element von self<. Dannverlassen wir die Schleife ohne etwas zu tun. Außerhalbder Schleife geben wir dann False zuruck.

19 / 21

Page 43: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

sum und length

Wir hatten dann noch zwei rekursive Methoden sum undlength.

Diese durfen Sie als Ubung im Betreuten Programmierenmachen!

20 / 21

Page 44: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

sum und length

Wir hatten dann noch zwei rekursive Methoden sum undlength.

Diese durfen Sie als Ubung im Betreuten Programmierenmachen!

20 / 21

Page 45: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Zusammenfassung

Wir haben gesehen, wie man uber eine verlinkte Listeiteriert. Es gibt eine Variable, die nacheinander dieElemente der Liste als Wert annimmt.

Im Detail kann es trickreich sein: eine solche Methodekann unter Umstanden:

erst beim zweiten Element beginnen (kein Beispiel);nur bis zum vorletzten Element gehen;verfruht abbrechen.

Beliebter Fehler: Zugriff auf Attribute eines None-Objekts.

Die rekursiven Formulierungen sind mitunter viel eleganterals die iterativen.

Die iterativen sind allerdings effizienter (selbst imVergleich zu Endrekursion, da diese von Python nicht aufbesondere Weise unterstutzt wird).

21 / 21

Page 46: Informatik I Jan-Georg Smaus Informatik I Die Klasse ...gki.informatik.uni-freiburg.de/teaching/ws1011/infoI/infoI19.pdf · Informatik I Jan-Georg Smaus Die Klasse LinkedList Sequenztypen

Informatik I

Jan-GeorgSmaus

Die KlasseLinkedList

Ausdrucken

Kopieren

Anhangen

Entfernen

Ersetzen

Summe undLange

Zusammen-fassung

Zusammenfassung

Wir haben gesehen, wie man uber eine verlinkte Listeiteriert. Es gibt eine Variable, die nacheinander dieElemente der Liste als Wert annimmt.

Im Detail kann es trickreich sein: eine solche Methodekann unter Umstanden:

erst beim zweiten Element beginnen (kein Beispiel);nur bis zum vorletzten Element gehen;verfruht abbrechen.

Beliebter Fehler: Zugriff auf Attribute eines None-Objekts.

Die rekursiven Formulierungen sind mitunter viel eleganterals die iterativen.

Die iterativen sind allerdings effizienter (selbst imVergleich zu Endrekursion, da diese von Python nicht aufbesondere Weise unterstutzt wird).

21 / 21