Zur Erinnerung:
Es soll eine Klasse TsList zur Verwaltung einer einfach verketteten Liste erstellt werden.
Diese soll folgendes zur Verfügung stellen:
einen Konstruktor, einen Destruktor sowie die Kommunikationsschnittstellen
empty, append und zur Abfrage der Datenelemente getItem,
getFirstItem, getNextItem
Zusätzlich zu den Zeigern First und Last ist ein weiterer laufender Zeiger erforderlich, welcher von getFirstItem() und getNextItem() verwendet und verwaltet wird. Ich nenne diesen Zeiger Current.
Includes und Definition der Datenstruktur eines Listenelementes |
#include <stdio> #include <iostream> #include <conio> // Einfachstes Element zur Zusammenstellung einer einfach verketteten Liste typedef struct SsListItem { int Value; struct SsListItem *Succ; } TsListItem; |
Deklaration der Klasse TsList |
class TsList { public: TsList(){First = Last = Current = NULL;} ~TsList(); int empty(){return First==NULL;} int append(int); TsListItem *getItem(unsigned int); TsListItem *getFirstItem(); TsListItem *getNextItem(); private: TsListItem *First, *Last, *Current; }; TsList::~TsList() { TsListItem *Temp; while (First) { Temp = First->Succ; delete First; First = Temp; } } int TsList::append(int Value) { TsListItem *Temp = new TsListItem; // Neues Element anlegen if (Temp) // Steht Speicherplatz zur Verfügung? { Temp->Value = Value; // Wert zuweisen Temp->Succ = NULL; // Terminierung mit dem NULL-Zeiger if (!First) First = Last = Temp; else { Last->Succ = Temp; Last = Temp; } return 1; } else return 0; } TsListItem *TsList::getItem(unsigned int n) { if (empty()) return NULL; TsListItem *Temp = First; unsigned int i = 0; while (Temp && (i++<n)) Temp = Temp->Succ; return Temp; } TsListItem *TsList::getFirstItem() { Current = First; return Current; } TsListItem *TsList::getNextItem() { if (Current) Current = Current->Succ; return Current; } |
Die Hauptfunktion |
int main() { int Value, oK; TsList List; cout << "Eingegebene Ganzzahlen werden in einer einfach verketteten Liste verwaltet." << "\n\nGeben Sie Ganzzahlen ein und schliessen Sie diese mit einer 0 ab.\n"; // Eingabe der Ganzzahlenfolge do { cin >> Value; if (Value) oK = List.append(Value); } while (Value && oK); cout <<< "\nAusgabe der eingegebenen Ganzzahlen:\n"; // Ausgabe der Ganzzahlenfolge TsListItem *Current = List.getFirstItem(); while (Current) { printf("%8i",Current->Value); Current = List.getNextItem(); }; // kurzer Quelltext mit derselben Wirkung: // for (TsListItem *Current = List.getFirstItem();Current;Current = List.getNextItem()) // printf("%8i",Current->Value); getch(); return 0; } |
Der Zugriff auf ein Listenelement per TsListItem* TsList::getFirstItem und TsListItem* TsList::getNextItem erfolgt jeweils ohne Suchen in einem einzigen Schritt.