#include #include #include using namespace std; template class List; template class Iterator; template class Node { public: /* Constructs a node with a given data value. @param s the data to store in this node */ Node(T s); private: T data; Node* previous; Node* next; friend class List; friend class Iterator; }; template class List { public: /** Constructs an empty list; */ List(); /** Appends an element to the list. @param s the value to append */ void push_back(T s); /** Inserts an element into the list. @param iter the position before which to insert @param s the value to append */ void insert(Iterator iter, T s); /** Removes an element from the list. @param i the position to remove @return an iterator pointing to the element after the erased element */ Iterator erase(Iterator i); /** Gets the beginning position of the list. @return an iterator pointing to the beginning of the list */ Iterator begin(); /** Gets the past-the-end position of the list. @return an iterator pointing past the end of the list */ Iterator end(); void remove(const T& value); void reverse(); void unique(); private: Node* first; Node* last; }; template class Iterator { public: /** Constructs an iterator that does not point into any list. */ Iterator(); /** Looks up the value at a position. @return the value of the node to which the iterator points */ T get() const; /** Advances the iterator to the next node. */ void next(); /** Moves the iterator to the previous node. */ void previous(); /** Compares two iterators @param b the iterator to compare with this iterator @return true if this iterator and b are equal */ bool equals(Iterator b) const; private: Node* position; Node* last; friend class List; }; template Node::Node(T s) { data = s; previous = NULL; next = NULL; } template List::List() { first = NULL; last = NULL; } template void List::push_back(T s) { Node* newnode = new Node(s); if (last == NULL) /* list is empty */ { first = newnode; last = newnode; } else { newnode->previous = last; last->next = newnode; last = newnode; } } template void List::insert(Iterator iter, T s) { if (iter.position == NULL) { push_back(s); return; } Node* after = iter.position; Node* before = after->previous; Node* newnode = new Node(s); newnode->previous = before; newnode->next = after; after->previous = newnode; if (before == NULL) /* insert at beginning */ first = newnode; else before->next = newnode; } template Iterator List::erase(Iterator i) { Iterator iter = i; assert(iter.position != NULL); Node* remove = iter.position; Node* before = remove->previous; Node* after = remove->next; if (remove == first) first = after; else before->next = after; if (remove == last) last = before; else after->previous = before; iter.position = after; delete remove; return iter; } template Iterator List::begin() { Iterator iter; iter.position = first; iter.last = last; return iter; } template Iterator List::end() { Iterator iter; iter.position = NULL; iter.last = last; return iter; } template Iterator::Iterator() { position = NULL; last = NULL; } template T Iterator::get() const { assert(position != NULL); return position->data; } template void Iterator::next() { assert(position != NULL); position = position->next; } template void Iterator::previous() { if (position == NULL) position = last; else position = position->previous; assert(position != NULL); } template bool Iterator::equals(Iterator b) const { return position == b.position; } template void List::remove(const T& value) { Iterator p = begin(); Iterator q = end(); while (! p.equals(q)) { if (p.get() == value) { Iterator r = p; p.next(); erase(r); } else p.next(); } } template void List::reverse() { Iterator p = begin(); Iterator q = end(); while (! p.equals(q)) { q.previous(); if (p.equals(q)) return; // swap the two values T temp = p.position->data; p.position->data = q.position->data; q.position->data = temp; p.next(); } } template void List::unique() { Iterator p = begin(); Iterator q = end(); while (! p.equals(q)) { Iterator r = p; p.next(); if ((! p.equals(q)) && r.get() == p.get()) erase(r); } } int main() { List a; a.push_back(1); a.push_back(2); a.push_back(1); a.push_back(5); a.push_back(5); a.push_back(1); a.push_back(1); a.push_back(7); a.push_back(7); a.push_back(7); a.push_back(1); cout << "test remove\n"; a.remove(1); Iterator p = a.begin(); Iterator q = a.end(); while (! p.equals(q)) { cout << "element " << p.get() << "\n"; p.next(); } cout << "test unique\n"; a.unique(); p = a.begin(); q = a.end(); while (! p.equals(q)) { cout << "element " << p.get() << "\n"; p.next(); } cout << "test reverse\n"; a.reverse(); p = a.begin(); q = a.end(); while (! p.equals(q)) { cout << "element " << p.get() << "\n"; p.next(); } return 0; }