#ifndef _HEADER_FUER_VERKETTETE_LISTEN__CRLIST__DEF_ #define _HEADER_FUER_VERKETTETE_LISTEN__CRLIST__DEF_ //-------------------------------------------------------------------------- template class CListEntry { public: T* Data; CListEntry* point2; }; //-------------------------------------------------------------------------- struct CListSearchEx { void* CurEntry; }; //-------------------------------------------------------------------------- template class CRList { public: //-------------------------------------------------------------------------- // Konstruktor //-------------------------------------------------------------------------- CRList ( ) { ListRoot = NULL; CurEntry = NULL; ItemCount = 0; } //-------------------------------------------------------------------------- // Dekonstruktor //-------------------------------------------------------------------------- ~CRList( ) { Clear(); } //-------------------------------------------------------------------------- // Eintrag hinzufügen //-------------------------------------------------------------------------- void Add( T* Item ) { // Neuen Eintrag erstellen CListEntry *E = new CListEntry ( ); // Daten eintragen E->Data = Item; E->point2 = ListRoot; ListRoot = E; // Anzahl hochzählen ++ItemCount; } //-------------------------------------------------------------------------- // Eintrag aus der Liste entfernen //-------------------------------------------------------------------------- void Delete( T* Item ) { CListEntry *Last = NULL; CListEntry *Next = ListRoot; CListEntry *This = Next; // Schleife um den Eintrag zu finden for (; Next; This=Next ) { Next = This->point2; if ( This->Data == Item ) { // Aktueller Sucheintrag löschen? if ( This == CurEntry ) CurEntry = Next; // Eintrag gefunden delete This; // Anzahl runterzählen --ItemCount; // Pointer neu setzen if ( Last == NULL ) ListRoot = Next; else Last->point2 = Next; return; } else Last = This; } } //-------------------------------------------------------------------------- // Leert die komplette Liste //-------------------------------------------------------------------------- void Clear ( void ) { CListEntry *Next = ListRoot; CListEntry *This = Next; // Löschen aller Einträge for (; Next; This=Next ) { Next = This->point2; delete This; } // Variablen zurücksetzen ListRoot = NULL; CurEntry = NULL; ItemCount = 0; } //-------------------------------------------------------------------------- // Anzahl Einträge zurückgeben //-------------------------------------------------------------------------- unsigned GetItemCount( void ) { return ItemCount; } //-------------------------------------------------------------------------- // Zum ersten Eintrag der Liste springen //-------------------------------------------------------------------------- T* GetFirstItem( void ) { if ( ListRoot==NULL ) return NULL; CurEntry = ListRoot->point2; if ( ListRoot==NULL ) return NULL; return ListRoot->Data; } //-------------------------------------------------------------------------- // Zum nächsten Eintrag der Liste springen //-------------------------------------------------------------------------- T* GetNextItem ( void ) { T* ReturnValue; if ( CurEntry == NULL ) return NULL; ReturnValue = CurEntry->Data; CurEntry = CurEntry->point2; return ReturnValue; } //-------------------------------------------------------------------------- // Zum ersten Eintrag der Liste springen //-------------------------------------------------------------------------- T* GetFirstItemEx( CListSearchEx &Search ) { if ( ListRoot == NULL ) { Search.CurEntry = NULL; return NULL; } Search.CurEntry = (void*)ListRoot->point2; if ( ListRoot == NULL ) return NULL; return ListRoot->Data; } //-------------------------------------------------------------------------- // Zum nächsten Eintrag der Liste springen //-------------------------------------------------------------------------- T* GetNextItemEx ( CListSearchEx &Search ) { CListEntry *This = (CListEntry *)Search.CurEntry; if ( This == NULL ) return NULL; // Nächster Eintrag Search.CurEntry = (void*)This->point2; return This->Data; } //-------------------------------------------------------------------------- private: CListEntry *ListRoot; // Erster Eintrag der Liste CListEntry *CurEntry; // Eintrag für die GetNextItem-Funktion unsigned ItemCount; // Anzahl Einträge in der Liste }; //-------------------------------------------------------------------------- #endif