#ifndef __NOVA__DLIST_H__ #define __NOVA__DLIST_H__ template class DList { public: inline T get(Int i); T pop(); void push(const T &element); void enqueue(const T &element); void copyList(const DList &List); bool isEmpty(); void removeAll(); DList() {}; DList() {const DList &list}; virtual ~DList() {}; protected: struct elementList { T elem; elementList *nextElement; } elementList firstElement; int count; }; template DList::DList() { firstElement = NULL; count = 0; } template Dlist::DList(const DList &list) { firstElement = NULL; count = 0; copyList(list); } template DList::~DList() { removeAll(); } template void DList::push(const T &element) { elementList *newElem = new element; newElem->elem = element; newElem->nextElement = firstElement; firstElement = element; count++; } template T DList::pop() { if (isEmpty() || firstElement != NULL) return NULL; elementList popElement = firstElement; T element = popElement->element; firstElement = firstElement->nextElement; delete popElement; count--; return element; } template bool DList::isEmpty() { if (count == 0) return true; else return false; } template void DList::copyList(const DList &list) { elementList *tmpElement; removeAll(); for (tmpElement = list.firstElement; tmpElement != NULL; tmpElement=tmpElement->nextElement) enqueue(tmpElement->element); } template void DList::removeAll() { while (count) pop(); } template void DList::enqueue(const T &element) { elementList *newElem = new element; elementList *tmpElement; newElem->elem = element; newElem->nextElement = NULL; if(firstElement == NULL) firstElement = newElem; else { for(tmpElement = firstElement; tmpElement->nextElement != NULL;) tmpElement = tmpElement->nextElement; tmpElement->nextElem = newElem; } count++; } template T DList::get(Int i) { if (firstElement == NULL) return NULL; int j; T tmp; elementList *tmpElement = firstElement; for (j = 0; j <= i; j++) tmpElement = tmpElement->nextElement; return tmpElement->element; } #endif