Verkettete Liste

Lineare Datentypen: die Liste

Um Elemente in einem Programm zu speichern, wurden bisher Variablen und Arrays benutzt. In einer Variablen lässt sich nur ein Wert speichern; ein Array speichert zwar mehrere Elemente, aber die Anzahl der Elemente muss in der Regel im Voraus festgelegt werden. Möchte man beliebig viele Elemente speichern können, muss man Listen benutzen. Listen tauchen in vielen Anwendungen auf, z.B. bei der Nutzung von WhatsApp oder anderen Messenger Programmen. Was geschieht, wenn eine Nachricht kommt? Die letzte Nachricht steht am Ende einer Liste. Oder E-Mails: in der Regel steht die neueste Mail an erster Stelle. Man kann diese Liste aber auch anders anordnen. Was aber passiert, wenn z.B. die Speicherkarte voll ist und man Nachrichten löschen muss? Mit diesen und anderen fragen beschäftigt sich der folgende Text.

Elemente können zufällig oder linear angeordnet werden. Eine einzelne Variable kann irgendwo im Speicher abgelegt werden, ein Array kann nur linear in einem Speicherblock eingerichtet werden. Jedes Element im Array hat einen Vorgänger und einen Nachfolger. Ausgenommen sind das erste und das letzte Element: das erste Element hat keinen Vorgänger und das letzte keinen Nachfolger. Bleiben wir noch beim Array: Die Datenstruktur Array speichert eine fixe Anzahl von gleichartigen Elementen, die im Speicher aneinander gefügt werden. Die Größe dieses Arrays wird beim Erzeugen des Array-Objektes zu Beginn festgelegt. Da die die Größe nicht mehr geändert werden kann, spricht man auch von einer statischen Struktur (Hinweis: in einigen Programmiersprachen kann man dynamische Arrays anlegen. Deren Größe kann im Verlauf des Programmes angepasst werden.) Jedem Element ist eine Zahl zugewiesen. Mit diesem Index kann gezielt auf ein spezielles Element zugegriffen werden. Wieso funktioniert das? Jedes Objekt befindet sich an einer bestimmten Adresse im Speicher. Da alle Objekte linear abgelegt werden und sie jeweils denselben Speichergröße belegen, kann man die notwendige Adresse eines Objektes berechnen, wenn man seinen Index und seine Größe kennt. Die Adresse des Arrays ist gleichzeitig die Adresse des ersten Elements. Die Adresse von array[4] berechnet sich vereinfacht wie folgt: Adresse(array[4])=Startadresse (array) + (4 * Elementgröße). Damit ist auch geklärt, warum das erste Arrayelement den Index 0 hat

Die Liste speichert eine variable Anzahl von Elementen, sie ist also dynamisch. Die Elemente können an einer beliebigen Stelle des Speichers stehen. Die einzelnen Elemente sind miteinander über Zeiger verkettet. Damit ergibt sich wie beim Array eine lineare Struktur mit Anfang und Ende. Allerdings kann man auf  einzelne Element nicht direkt zugreifen; die ganze Liste muss sequentiell vom Anfang an durchsucht werden.

Wie sieht ein Vergleich der beiden Strukturen aus, wenn man den Aufwand für das Einfügen und das Löschen eines Elementes und den Zugriff auf ein Element betrachtet? Um ein Element in ein Array einfügen zu können, benötigt man einen freien Platz im Array. An den Index des ersten freien Platzes kann man direkt das neue Element einfügen. Beim gezielten oder sortiertem Einfügen entscheidet die Position des neuen Elementes über den Aufwand. Möchte man das neue Element am Anfang des Arrays einfügen, müssen alle Elemente des Arrays um einen Platz verschoben werden. Statistisch muss beim gezielten Einfügen die Hälfte aller Einträge verschoben werden. Beim Einfügen eines Elementes in eine Liste muss wie beim Array zuerst die richtige Position gefunden werden. Anschließend müssen nur Zeiger geändert werden. Kein einziges Element wird verschoben. Der Vorteil liegt hier also klar bei der Liste. Beim Löschen eines Elements entsteht im Array eine Lücke. Werden dann neue Elemente eingefügt, muss man das Array sequentiell durchgehen, um den freien Platz zu finden oder nach jedem Löschvorgang Elemente wie beim Einfügen verschieben. Wie beim Einfügen müssen dann im Durchschnitt die Hälfte aller Elemente verschoben werden. Das Löschen eines Elements in der Liste verläuft ähnlich einfach wie das Einfügen: man muss das zu löschende Element sequentiell suchen und entsprechend Zeiger verändern. Auch hier geht der Punkt an die Liste. Der Zugriff auf ein bestimmtes Element des Arrays erfolgt direkt über den Index; bei der Liste muss statistisch die Hälfte aller Elemente angesehen werden. Der Vorteil liegt hier beim Array.

 

Auf den verlinkten Seiten befinden sich Beispiele für die Anwendung der Liste einschließlich der Klasse Liste:

Materialien zu diesem Themenbereich findet man unter der folgenden Adresse:
Materialien zum KLP GOSt Informatik Grundkurs (Qualifikationsphase Q1-GK)
Materialien zum KLP GOSt Informatik Leistungskurs (Qualifikationsphase Q1-LK)

 

Hilfreich ist auch der folgende Download:

Lineare Datentypen: Die Liste (Leitprogramm)