template <typename Type> class CList { struct Node /*: public Object<Node>*/ { Type m_data; Node* m_pPrev; Node* m_pNext; Node(const Type& data = Type(), Node* p = 0, Node* n = 0) : m_data(data), m_pPrev(p), m_pNext(n) { } }; public: CList() : m_size(0){ init();} ~CList(){ clear(); delete m_head; delete m_tail; } CList(const CList& x){ init(); Copy(x); } CList& operator = (const CList& x){ if (this != &x) Copy(x); return *this; } public: class iterator { friend class CList<Type>; public: iterator() : m_current(NULL){} iterator(Node* pNode) : m_current(pNode){} virtual ~iterator(){} const iterator operator++(int){ iterator it = *this; m_current = m_current->m_pNext; return it; } iterator& operator++(){ m_current = m_current->m_pNext; return *this; } const iterator operator--(int){ iterator it = *this; m_current = m_current->m_pPrev; return it; } iterator& operator--(){ m_current = m_current->m_pPrev; return *this; } iterator& operator=(const iterator& it){ m_current = it.m_current; return *this; } bool operator !=(const iterator& it){ return !(m_current == it.m_current); } bool operator ==(const iterator& it){ return m_current == it.m_current; } Type& operator*(){ return m_current->m_data;} iterator(const iterator& it){ m_current = it.m_current; } private: Node* m_current ; }; public: int size() const {return m_size;} bool empty(){ return m_size == 0 ? false : true; } void push_back(const Type& x){ insert(iterator(m_tail), x); } void pop_back(){ erase(iterator(m_tail->m_pPrev)); } void push_front(const Type& x){ insert(iterator(m_head->m_pNext), x); } void pop_front(){ erase(iterator(m_head->m_pNext)); } iterator erase(iterator it){ it.m_current->m_pPrev->m_pNext = it.m_current->m_pNext; it.m_current->m_pNext->m_pPrev = it.m_current->m_pPrev; Node* p = it.m_current->m_pNext; delete it.m_current; m_size--; return iterator(p); } iterator begin(){return iterator(m_head->m_pNext);} iterator end(){return iterator(m_tail);} const iterator begin() const {return iterator(m_head->m_pNext);} const iterator end() const {return iterator(m_tail);} Type& back(){return m_tail->m_pPrev->m_data;} Type& front(){return m_head->m_pNext->m_data;} iterator insert(iterator it, const Type& data){ Node* node = new Node(data, it.m_current->m_pPrev, it.m_current); it.m_current->m_pPrev->m_pNext = node; it.m_current->m_pPrev = node; m_size++; return iterator(node); } void clear(){ iterator it = begin(); while ( it != end() ) { it = erase(it); } } private: void init(){ m_head = new Node; m_tail = new Node; m_head->m_pNext = m_tail; m_tail->m_pPrev = m_head; } void Copy(const CList& x){ iterator it = x.begin(); for (; it != x.end(); ++it) { push_back(*it); } } private: Node* m_head; Node* m_tail; int m_size; }; #endif