template<class T>
class DLLNode
{
public:
DLLNode()
{
next = prev = 0;
}
DLLNode(const T& el, DLLNode* n = 0, DLLNode * p = 0) {
info = el; next = n; prev = p;
}
T info;
DLLNode* next, * prev;
};
template<class T>
class DoublyLinkedList
{
public:
DoublyLinkedList()
{
head = tail = 0;
}
void Add(const T&);
T DeleteLast();
bool isEmpty()
{
return head == 0;
}
private:
DLLNode<T>* head, * tail;
};
template<class T>
void DoublyLinkedList<T>::Add(const T& el)
{
if (tail != 0)
{
tail = new DLLNode<T>(el, 0, tail);
tail->prev->next = tail;
}
else
{
head = tail = new DLLNode<T>(el);
}
}
template<class T>
T DoublyLinkedList<T>::DeleteLast()
{
T el = tail->info;
if (head == tail)
{
delete head;
head = tail = 0;
}
else
{
tail = tail->prev;
delete tail->next;
tail->next = 0;
}
return el;
}