www.pudn.com > container.rar > container.h
// Fig. 15.3: list.h // Template List class definition #ifndef CONTAINER_H #define CONTAINER_H #include#include #include "element.h" template< class TYPE > class Container { public: Container(); // constructor ~Container(); // destructor void insertAtFront( const TYPE & ); void insertAtBack( const TYPE & ); bool removeFromFront( TYPE & ); bool removeFromBack( TYPE & ); bool isEmpty() const; void print() const; private: Element< TYPE > *firstPtr; // pointer to first node Element< TYPE > *lastPtr; // pointer to last node // Utility function to allocate a new node Element< TYPE > *getNewNode( const TYPE & ); }; // Default constructor template< class TYPE > Container< TYPE >::Container() { firstPtr = NULL; lastPtr = NULL; } // Destructor template< class TYPE > Container< TYPE >::~Container() { if ( !isEmpty() ) { // List is not empty cout << "Destroying nodes ...\n"; Element< TYPE > *currentPtr = firstPtr, *tempPtr; while ( currentPtr != 0 ) { // delete remaining nodes tempPtr = currentPtr; // cout << tempPtr->data << '\n'; currentPtr = currentPtr->nextPtr; delete tempPtr; } } cout << "All nodes destroyed\n\n"; } // Insert a node at the front of the list template< class TYPE > void Container< TYPE >::insertAtFront( const TYPE &value ) { Element< TYPE > *newPtr = getNewNode( value ); if ( isEmpty() ) // List is empty firstPtr = lastPtr = newPtr; else { // List is not empty newPtr->nextPtr = firstPtr; firstPtr = newPtr; } } // Insert a node at the back of the list template< class TYPE > void Container< TYPE >::insertAtBack( const TYPE &value ) { Element< TYPE > *newPtr = getNewNode( value ); if ( isEmpty() ) // List is empty firstPtr = lastPtr = newPtr; else { // List is not empty lastPtr->nextPtr = newPtr; lastPtr = newPtr; } } // Delete a node from the front of the list template< class TYPE > bool Container< TYPE >::removeFromFront( TYPE &value ) { if ( isEmpty() ) // List is empty return false; // delete unsuccessful else { Element< TYPE > *tempPtr = firstPtr; if ( firstPtr == lastPtr ) firstPtr = lastPtr = 0; else firstPtr = firstPtr->nextPtr; value = tempPtr->data; // data being removed delete tempPtr; return true; // delete successful } } // Delete a node from the back of the list template< class TYPE > bool Container< TYPE >::removeFromBack( TYPE &value ) { if ( isEmpty() ) return false; // delete unsuccessful else { Element< TYPE > *tempPtr = lastPtr; if ( firstPtr == lastPtr ) firstPtr = lastPtr = 0; else { Element< TYPE > *currentPtr = firstPtr; while ( currentPtr->nextPtr != lastPtr ) currentPtr = currentPtr->nextPtr; lastPtr = currentPtr; currentPtr->nextPtr = 0; } value = tempPtr->data; delete tempPtr; return true; // delete successful } } // Is the List empty? template< class TYPE > bool Container< TYPE >::isEmpty() const { return firstPtr == 0; } // Return a pointer to a newly allocated node template< class TYPE > Element< TYPE > *Container< TYPE >::getNewNode( const TYPE &value ) { Element< TYPE > *ptr = new Element< TYPE >( value ); assert( ptr != 0 ); return ptr; } // Display the contents of the List template< class TYPE > void Container< TYPE >::print() const { if ( isEmpty() ) { cout << "The list is empty\n\n"; return; } Element< TYPE > *currentPtr = firstPtr; cout << "The list is: "; while ( currentPtr != 0 ) { cout << currentPtr->data << ' '; currentPtr = currentPtr->nextPtr; } cout << "\n\n"; } #endif