/* * linked_list.cpp * * Created on: 14.11.2012 * Author: trifon */ #include "list.h" template struct elem { T inf; elem* link; }; // декларация на шаблон template class LinkedList; template class LinkedListIterator : public Iterator { friend class LinkedList; elem* p; public: LinkedListIterator(elem* _p = NULL) : p(_p) {} Iterator& operator++() { if (p != NULL) p = p->link; return *this; } LinkedListIterator operator++(int) { LinkedListIterator it = *this; ++(*this); return it; } T& operator*() const { return p->inf; } operator bool() const { return p != NULL; } bool operator==(Iterator const& it) const { LinkedListIterator const & llit = (LinkedListIterator const &)it; return llit.p == p; } }; template class LinkedList : public List > { elem* start; elem* end; private: void copyList(LinkedList const& l) { start = end = NULL; for(I it = l.iteratorBegin(); it; ++it) toEnd(*it); } void deleteList() { elem* p = start; while(start) { start = start->link; delete p; p = start; } end = NULL; } public: LinkedList() : start(NULL), end(NULL) {} LinkedList(LinkedList const& l) { copyList(l); } LinkedList& operator=(LinkedList const& l) { if (&l != this) { deleteList(); copyList(l); } return *this; } ~LinkedList() { deleteList(); } typedef LinkedListIterator I; bool empty() const { return start == NULL; } void toEnd(T const& x) { insertAfter(x, iteratorEnd()); } I iteratorBegin() const { return I(start); } I iteratorEnd() const { return I(end); } // O(n) void insertBefore(T const& x, I const& it) { I p = iteratorBegin(); if (p == it) { start = new elem; start->inf = x; start->link = it.p; if (end == NULL) end = start; } else { I q = p++; while (p && p != it) { q = p++; } // p == it if (p) insertAfter(x, q); } } // O(1) void insertAfter(T const& x, I const& it) { if (!it.p && start != NULL) return; elem* p = new elem; if (!p) return; p->inf = x; if (empty()) { start = end = p; p->link = NULL; } else { p->link = it.p->link; it.p->link = p; if (end == it.p) end = p; } } // O(n) bool deleteBefore(T& x, I& it) { if (!it) return false; I p = iteratorBegin(); if (p == it) return false; I q = p++; while (p && p != it) q = p++; if (p == NULL) return false; return deleteAt(x, q); } // O(1) bool deleteAfter(T& x, I& it) { if (!it) return false; elem* q = it.p->link; if (q == NULL) return false; it.p->link = q->link; x = q->inf; if (end == q) end = it.p; delete q; return true; } // O(n) bool deleteAt(T& x, I& it) { if (!it) return false; I p = iteratorBegin(); if (p == it) { if (end == start) end = NULL; start = start->link; x = it.p->inf; delete it.p; it.p = NULL; return true; } else { I q = p++; while (p && p != it) { q = p++; } // p == it if (p) { it.p = NULL; return deleteAfter(x, q); } return false; } } // friend ostream& operator<<(ostream&,LinkedList const&); void print() const { for(I it = iteratorBegin(); it; ++it) cout << *it << ' '; cout << endl; } }; template ostream& operator<<(ostream& os,LinkedList const& l) { l.print(); return os; }