1 / 64

Dynamisches Array als "verkettete Liste"

Dynamisches Array als "verkettete Liste". Ein Vergleich. Durch die intensive Nutzung jeden Quadratmeters Bodenfläche (Hausbau und Tomatenplantagen) gibt es in Amsterdam keine Möglichkeit mehr eine freie Bodenfläche zu finden.

Download Presentation

Dynamisches Array als "verkettete Liste"

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Dynamisches Array als "verkettete Liste"

  2. Ein Vergleich

  3. Durch die intensive Nutzung jeden Quadratmeters Bodenfläche (Hausbau und Tomatenplantagen) gibt es in Amsterdam keine Möglichkeit mehr eine freie Bodenfläche zu finden.

  4. Deswegen wird mittlerweile eine neue Bebauungsfläche genutzt: das Wasser in den Kanälen. Diese neue genutzte Fläche wird mit Hausbooten versehen.

  5. Das Boot muss mit dem Land verbunden werden. Wie wird dieses Boot mit dem Land verbunden, obwohl der Anlegepunkt belegt ist? Wie wird dieses Boot mit dem Land verbunden, obwohl der Anlegepunkt belegt ist? X Land (Bootsteg mit nur einem Anlegepunkt)

  6. Bevor wir uns zu lange in Holland aufhalten - und dabei die Tomatenbauern bei ihrer wichtigen Arbeit stören – und bevor sich unser neu erworbenes Wissen in Rauch auflöst, schnell noch ein anderer Vergleich...

  7. In der Klasse wurde ausgemacht: Wenn jemand ein wichtiges Ereignis erfährt (wie z.B. nächste Kurzarbeit im Mathe), sollen alle Schüler der Klasse benachrichtigt werden. Wie kann man dies realisieren, ohne daß ein Schüler alle anderen anruft bzw. jeder Schüler daran beteiligt wird ?

  8. Durch eine Telefonkette benachrichtigen sich die Schüler Gustav, Olaf, Miroslav, Wiglaf und Stanislav der Klasse

  9. Wen soll Stanislav anrufen?

  10. Niemandem mehr, oder …

  11. Gustav, dann hat man einen Telefonring

  12. Von Holland, Ketten und Ringen zurück zur EDV nach Deutschland...

  13. Warum kann man nicht beliebig viele Zahlen immer wieder hintereinander in einem Array anfügen?

  14. Weil ein Array eine feste Länge haben muss.

  15. Was müsste man also bei jedem Anfügevorgang machen?

  16. dynamischen Speicher reservieren!

  17. Beispiel:

  18. ... Annahme: Man will hintereinander die folgenden Zahlen abspeichern: ... 0007 ... ... 0345 ... ... 0911 ... ... 19 -93 , 71 , 19 -93 Man reserviert also dynamisch (d.h.während der Laufzeit) Speicher für eine Zahl, dann Speicher für die nächste Zahl, usw.Die reservierten Speicher (mit den Adressen) liefert jeweils das Betriebssystem. 71

  19. ... ... 0007 ... ... 0345 ... ... 0911 ... ... Welches Problem hat man, wenn man diese Zahlen (in der Reihenfolge wie sie abgelegt wurden) auf dem Bildschirm ausgeben will 19 Man kennt nicht die Adressen dieser Zahlen, weil diese Adressen nicht gespeichert wurden. -93 Was muss man also machen, um diese Zahlen ausgeben zu können? 71

  20. ... ... 0007 ... ... 0345 ... ... 0911 ... ... Man muss jeweils neben der Zahl auch die Adresse der nächsten Zahl speichern. 19 Man braucht also einen Datentyp, in dem neben einer Zahl eine Adresse gespeichert wird. -93 Wir nennen den Datentyp hier "dtelement" und stellen dies schematisch wie folgt dar: dtelement Zahl Adresse 71

  21. ... ... 0007 ... ... 0345 ... ... 0911 ... ... Wie sieht dann die Verlinkung dieser Speicherblöcke mit dem Datentyp element aus?(-93 , 71 , 19) Schreiben Sie die 3 Speicherblöcke auf und verlinken sie 19 -93 71

  22. ... ... 0007 Welche Adresse soll hier eingetragen werden und ... ... ... 0345 ...wie kann man dieses Element als das Letzte markieren? ... ... 0911 ... ... 19 ? -93 0911 71 0007 19 -93 71

  23. ... ... 0007 ... ... 0345 ... ... 0911 ... ... 19 -93 0911 71 0007 19 -93 71

  24. ... ... 0007 NULL ist eine spezielle Adresse, die z.B. für diesen Zweck verwendet werden kann. ... ... 0345 ... ... 0911 ... ... 19 NULL -93 0911 71 0007 19 -93 71

  25. ... ... 0007 ... ... 0345 ... ... 0911 ... ... Wie sieht die genaue Belegung im Arbeitsspeicher aus? Der Speicherblock (Zahl, Adresse), der –93 in das dynamische Array einträgt, soll abgespeichert werden. 19 NULL Was fehlt noch? -93 71 soll angefügt werden. 0911 19 soll angefügt werden. Man hat also mit dem 1. Element das ganze dynamische Array als sogenannte "verkettete Liste". 71 0007

  26. Umsetzung in C:

  27. Name der Adresse (frei wählbar) Name der Struktur(frei wählbar) Diese Adresse muss wieder auf eine Variable zeigen, die den Datentyp dtelement hat! #include "stdafx.h" #include <stdio.h> #include <malloc.h> struct dtelement{ int zahl; struct dtelement *next; }; int main(){ ... }

  28. Reservieren Sie jeweils für die Zahl 10 und 20 dynamisch Speicher und verlinken diese Speicherplätze dann miteinander. Geben Sie anschließend - vom Anfang der verketteten Liste ausgehend - die Zahlen auf dem Bildschirm aus.

  29. Welchen Wert hat anf und e an dieser Stelle ? 0050 0060 int main(){ struct dtelement *anf; struct dtelement *e; anf = (struct dtelement *) malloc(sizeof( struct dtelement)); e = (struct dtelement *) malloc(sizeof( struct dtelement)); anf ? e ? Annahme: Die Variablen anf und e werden an der Adresse 0050 und 0060 gespeichert.

  30. Welchen Wert hat anf und e an dieser Stelle ? (also nach e = ... 0050 0060 int main(){ struct dtelement *anf; struct dtelement *e; anf = (struct dtelement *) malloc(sizeof( struct dtelement)); e = (struct dtelement *) malloc(sizeof( struct dtelement)); anf ? Annahme: Der 1. reservierte Speicher beginnt bei der Adresse 0100, Der 2. reservierte Speicher beginnt bei der Adresse 0200. e ?

  31. 0050 0060 int main(){ struct dtelement *anf; struct dtelement *e; anf = (struct dtelement *) malloc(sizeof( struct dtelement)); e = (struct dtelement *) malloc(sizeof( struct dtelement)); Wie werden die einzelnen Bereiche des Speichers an der Adresse 0100 (bzw. 0200) interpretiert bzw. was bedeuten sie? Eine Integer-Zahl Eine Adresse, die als Datentyp die Struktur dtelement hat. Eine Integer-Zahl Eine Adresse, die als Datentyp die Struktur dtelement hat. 0100 anf 0100 ... e 0200 ... 0200 ...

  32. Welche Werte stehen an diesen 4 Stellen? 0100 0050 ... 0060 ... 0200 ... int main(){ struct dtelement *anf; struct dtelement *e; anf = (struct dtelement *) malloc(sizeof( struct dtelement)); e = (struct dtelement *) malloc(sizeof( struct dtelement)); anf 0100 e 0200

  33. 0100 0050 ... 0060 ... 0200 ... int main(){ struct dtelement *anf; struct dtelement *e; anf = (struct dtelement *) malloc(sizeof( struct dtelement)); e = (struct dtelement *) malloc(sizeof( struct dtelement)); ? anf 0100 ? e 0200 ? ?

  34. 0100 0050 ... 0060 ... 0200 ... int main(){ struct dtelement *anf; struct dtelement *e; anf = (struct dtelement *) malloc(sizeof( struct dtelement)); e = (struct dtelement *) malloc(sizeof( struct dtelement)); Durch welche Anweisungen wird im 1. reservierten Speicher die Zahl 10 und im 2. reservierten Speicher die Zahl 20 abgespeichert? ? anf 0100 ? e 0200 ? Programm geht gleich weiter... ?

  35. 0100 0050 ... 0060 ... 0200 ... (*anf).zahl = 10; * 0100 .zahl ? anf 0100 ? e 0200 ? ?

  36. 0100 0050 ... 0060 ... 0200 ... (*anf).zahl = 10; * 0100 .zahl anf 0100 ? e 0200 ? ?

  37. 0100 0050 ... 0060 ... 0200 ... (*anf).zahl = 10; * 0100 .zahl 10 anf 0100 ? e 0200 ? ?

  38. 0100 0050 ... 0060 ... 0200 ... (*anf).zahl = 10; (*e).zahl = 20; * 0200 .zahl 10 anf 0100 ? e 0200 ? ?

  39. 0100 0050 ... 0060 ... 0200 ... (*anf).zahl = 10; (*e).zahl = 20; * 0200 .zahl 10 anf 0100 ? e 0200 ?

  40. 0100 0050 ... 0060 ... 0200 ... (*anf).zahl = 10; Durch welche Anweisung wird der 1. reservierte Speicher mit dem 2. reservierten Speicher verlinkt? (*e).zahl = 20; * 0200 .zahl 10 anf 0100 ? e 0200 20 ?

  41. 0100 0050 ... 0060 ... 0200 ... (*anf).zahl = 10; (*e).zahl = 20; (*anf).next = e; .next * 0100 0200 10 anf 0100 ? e 0200 20 ?

  42. 0100 0050 ... 0060 ... 0200 ... (*anf).zahl = 10; (*e).zahl = 20; (*anf).next = e; .next * 0100 0200 10 anf 0100 e 0200 20 ?

  43. 0100 0050 ... 0060 ... 0200 ... (*anf).zahl = 10; (*e).zahl = 20; (*anf).next = e; .next * 0100 0200 10 anf 0100 0200 e 0200 20 ?

  44. 0100 0050 ... 0060 ... 0200 ... (*anf).zahl = 10; Durch welche Anweisung kann man das 2. angefügte element als das Letzte markieren? (*e).zahl = 20; (*anf).next = e; (*e).next = NULL; .next * 0200 10 anf 0100 0200 e 0200 20 ?

  45. 0100 0050 ... 0060 ... 0200 ... (*anf).zahl = 10; Durch welche Anweisung kann man das 2. angefügte element als das Letzte markieren? (*e).zahl = 20; (*anf).next = e; (*e).next = NULL; .next * 0200 10 anf 0100 0200 e 0200 20

  46. 0100 0050 ... 0060 ... 0200 ... (*anf).zahl = 10; Durch welche Anweisung kann man das 2. angefügte element als das Letzte markieren? (*e).zahl = 20; (*anf).next = e; (*e).next = NULL; .next * 0200 10 anf 0100 0200 e 0200 20 NULL

  47. 0100 0050 ... 0060 ... 0200 ... (*anf).zahl = 10; Damit hat man folgende Verlinkung der Elemente im Arbeitsspeicher (*e).zahl = 20; (*anf).next = e; (*e).next = NULL; return 0; } In anf (wie Anfang) ist die Adresse des 1. Elements gespeichert. Damit kann man die Liste durchlaufen. In e wird die Adresse eines neu anzufügenden Elements zwischengespeichert und dann in die Liste eingetragen (als Link auf das neue Element). 10 anf 0100 0200 e 0200 20 NULL

  48. 0100 0050 ... 0060 ... 0200 ... ... (*(*anf).next).zahl = 30; Was würde folgende zusätzliche Anweisung im Speicher veranlassen? .next * 0100 .zahl * 0200 10 anf 0100 0200 e 0200 20 NULL

  49. 0100 0050 ... 0060 ... 0200 ... ... (*(*anf).next).zahl = 30; Was würde folgende zusätzliche Anweisung im Speicher veranlassen? .next * 0100 .zahl * 0200 10 anf 0100 0200 e 0200 NULL

  50. 0100 0050 ... 0060 ... 0200 ... ... (*(*anf).next).zahl = 30; Was würde folgende zusätzliche Anweisung im Speicher veranlassen? .next * 0100 .zahl * 0200 10 anf 0100 0200 e 0200 30 NULL

More Related