// Doubly Linked List with templates and inheritance example // Steve J. Hodges, CS19, Spring 2006 // NOT FOR DISTRIBUTION, DO NOT DUPLICATE #ifndef LINKEDLIST_H #define LINKEDLIST_H #include // forward class definition template class List; // LinkNode helper class for List // internal connection for List class template class LinkNode{ friend class List; public: LinkNode(){next = prev = 0; data=0;} ~LinkNode(){ if (data){ delete data; data=0;} } private: T *data; LinkNode *next; LinkNode *prev; }; // Linked List class with Templates // insert - pointer to T - insert at front of List // delete - pointer to T - delete first object in list that matches // print -- prints all items in the list template class List{ public: List(){ first = last = 0; } ~List(); void insertFront( T *); void insertRear( T *); T *removeFront(); T *removeRear(); void print(); void printR(); private: LinkNode *first; LinkNode *last; }; template List::~List(){ LinkNode *link = first; while (first){ link = first; first = first-> next; if (link->data){ delete link->data; link->data=0; } delete link; } } template void List::insertFront(T *d){ LinkNode *link = new LinkNode(); T *nd = new T(); *nd = *d; // default memberwise copy or overloaded assignment link->data = nd; // attach data // link->prev stays at 0 no change if(first == 0){ first = last = link; return; } link->next = first; first->prev = link; first = link; } template T *List::removeFront(){ T *temp=0; if (first == 0) return 0; // splice out data node temp = first->data; first->data = 0; if (first == last){ delete first; first = last = 0; return temp; } Linknode *link = first; first->next->prev = 0; first=first->next; delete link; return temp; } template void List::insertRear(T *d){ LinkNode *link = new LinkNode(); T *nd = new T(); *nd = *d; // default memberwise copy or overloaded assignment link->data = nd; // attach data // link->prev stays at 0 no change if(first == 0){ first = last = link; return; } last->next = link; link->prev = last; last = link; } template T *List::removeRear(){ T *temp=0; if (last == 0) return 0; // splice out data node temp = last->data; last->data = 0; if (first == last){ delete last; first = last = 0; return temp; } LinkNode *todel = last; last->prev->next = 0; last = last->prev; delete todel; // delete node that was formerly last return temp; } template void List::print(){ LinkNode *link = first; while(link){ std::cout << *(link->data) << " "; link = link->next; } std::cout << endl; } template void List::printR(){ LinkNode *link = last; while(link){ std::cout << *(link->data) << " "; link = link->prev; } std::cout << endl; } // ------------------------------------------------------------------- template class Stack : public List{ public: void push(T *d){ insertFront(d); } T *pop(){ return removeFront(); } }; // ------------------------------------------------------------------- template class Queue : public List{ public: void enque(T *d){ insertRear(d); } T *deque(){ return removeFront(); } }; #endif