Dynamische Strukturen |
Normalerweise legen Sie beim Erstellen des Programms die Variablen fest, die im Programm verwendet werden. Dazu müssen Sie bereits vor dem Erstellen des Programms festlegen, welche Daten sie brauchen. Nehmen wir an, Sie wollen in Ihrem Programm eine Einkaufsliste führen. Dazu können Sie ein Array von Einkaufslisteneinträgen anlegen. Aber wieviele Einträge sollen es maximal werden? Egal welchen Wert Sie wählen: Er ist zu klein, wenn Sie der Kaufrausch packt und zu groß, wenn Sie nur noch einmal schnell Eier und Speck für ein improvisiertes Mittagessen brauchen. Für solche Fälle bietet C++ die Möglichkeit, während des Programmlaufs Speicher anzufordern, der dann über Zeiger zugegriffen wird.
float *floatZeiger = new float;
int *intZeiger = new int(2); // InitialisierungDie Variable, auf die intZeiger zeigt, wird gleich nach ihrer Erzeugung mit dem Wert 2 belegt.
delete floatZeiger;
int *Lotto = 0; // Zeiger definieren und sichern
Lotto = new int [6]; // Array mit sechs Elementen erzeugen
for (i=0; i<6; i++) // Array durchlaufen
{
Lotto[i] = rand() % 49 + 1; // Lottozahl erzeugen
}
delete[] Lotto; // Freigabe des Speichers
Lotto = 0; // Zeiger sichern
struct TListenKnoten
{
int data;
TListenKnoten *next;
};
Im Buch erscheint an dieser Stelle die Abbildung einer verketteten Liste (abblinlist).
#include <iostream>
using namespace std;
struct TListenKnoten
{
int data; // simuliert die Daten
TListenKnoten *next; // Verknüpfung zum Nachfolger
};
TListenKnoten *Anker = 0; // Anfang der Liste
int main()
{
int Inhalt;
TListenKnoten *node, *old;
// Fülle die Liste mit Zahlen, bis 0 eingegeben wird
do
{
cout << "Zahl eingeben (0 für Ende)" << endl;
cin >> Inhalt;
if (Inhalt)
{
// Neues Element für die Liste erzeugen:
TListenKnoten *node = new TListenKnoten;
node->data = Inhalt; // Besetze die Daten
node->next = Anker; // Hänge die bisherige Liste an
Anker = node; // Setze den Anfangspunkt hierher
}
} while (Inhalt);
// Gebe die Liste in umgekehrter Reihenfolge aus
// und lösche dabei die ausgegebenen Elemente
while (Anker) // ungleich 0! Die Liste ist nicht leer!
{
cout << Anker->data << endl;
old = Anker; // Sichere zum späteren Löschen
Anker = Anker->next; // Ziehe nächstes Element nach vorn
delete old; // Lösche das ausgelesene Element
}
}
Mit verketteten Listen lassen sich flexibelste Lösungen für die Ablage von Daten erzeugen. Sie können Daten an einem Ende der Liste einhängen und am anderen Ende entfernen. Damit ergibt sich ein Puffer. Wenn Sie das letzte Element einer Liste auf das erste zeigen lassen, ergibt sich eine Ringstruktur.
|
Diese Seite basiert auf Inhalten aus dem Buch
Arnold Willemer: Einstieg in C++ Mit freundlicher Genehmigung und Unterstützung des Verlags galileo computing |
| Informatik-Ecke Einstieg in C++ |
(C) Copyright 2005 Arnold Willemer
|