List Iterator Implementation Lecture 28 Section 14.6 Robb T. Koether Hampden-Sydney College Fri, Apr 10, 2015 Robb T. Koether (Hampden-Sydney College) List Iterator Implementation Fri, Apr 10, 2015 1 / 18
1 LinkedList Iterators 2 List Traversals 3 Reverse Iterators 4 Assignment Robb T. Koether (Hampden-Sydney College) List Iterator Implementation Fri, Apr 10, 2015 2 / 18
Outline 1 LinkedList Iterators 2 List Traversals 3 Reverse Iterators 4 Assignment Robb T. Koether (Hampden-Sydney College) List Iterator Implementation Fri, Apr 10, 2015 3 / 18
A Sort Function Sorting with Iterators void LinkedListwIter<T>::sortIter() { Iterator base = begin(); while (base!= end()) { Iterator min = base; Iterator curr = min; ++curr; while (curr!= end()) { if (*curr < *min) min = curr; ++curr; } T temp = *base; *base = *min; *min = temp; ++base; } return; } Robb T. Koether (Hampden-Sydney College) List Iterator Implementation Fri, Apr 10, 2015 4 / 18
Outline 1 LinkedList Iterators 2 List Traversals 3 Reverse Iterators 4 Assignment Robb T. Koether (Hampden-Sydney College) List Iterator Implementation Fri, Apr 10, 2015 5 / 18
List Traversals Definition (Traverse) To traverse a list is to move systematically through its nodes, visiting each node along the way. Forward traversals go from head to tail. Reverse traversals go from tail to head. The meaning of visiting a node is left unspecified at this point. The meaning will be specified at the time of the traversal. Robb T. Koether (Hampden-Sydney College) List Iterator Implementation Fri, Apr 10, 2015 6 / 18
The Traversal Function The traverse() Function void traverse(void (*visit)(iterator&)); Introduce a new List member function traverse(). The parameter visit is a pointer to a function. The visit() function has prototype void visit(iterator& it); Robb T. Koether (Hampden-Sydney College) List Iterator Implementation Fri, Apr 10, 2015 7 / 18
Traversals and Iterators Traversal Implementation void traverse(void (*visit)(iterator&)) { for (Iterator it = begin(); it!= end(); ++it) visit(it); return; } The traverse() function is implemented as a for loop. Robb T. Koether (Hampden-Sydney College) List Iterator Implementation Fri, Apr 10, 2015 8 / 18
Example - Print the List The print() Function list.traverse(print);. void print(iterator& it) { cout << *it << endl; return; } For example, we could write a print() function and then use traverse() to print all the values in the list. Robb T. Koether (Hampden-Sydney College) List Iterator Implementation Fri, Apr 10, 2015 9 / 18
Outline 1 LinkedList Iterators 2 List Traversals 3 Reverse Iterators 4 Assignment Robb T. Koether (Hampden-Sydney College) List Iterator Implementation Fri, Apr 10, 2015 10 / 18
Reverse Iterators A reverse iterator is an iterator that advances in the opposite direction, from tail to head. It is initialized to the last element in the list. It advances until it has gone beyond the head of the list. Because a reverse iterator is an iterator, we will derive the ReverseIterator class from the Iterator class. Robb T. Koether (Hampden-Sydney College) List Iterator Implementation Fri, Apr 10, 2015 11 / 18
ReverseIterator Member Functions Additional ReverseIterator Member Functions ReverseIterator(const LinkedListwIter<T>* lst, LinkedListNode<T>* p); ReverseIterator& operator++(); ReverseIterator(LinkedListwIter<T>*, LinkedListNode<T>*) Construct a ReverseIterator. operator++() Advance the ReverseIterator to the next node. Robb T. Koether (Hampden-Sydney College) List Iterator Implementation Fri, Apr 10, 2015 12 / 18
LinkedListwIter Member Functions Additional LinkedListwIter Member Functions ReverseIterator rbegin() const; ReverseIterator rend() const; rbegin() Create a ReverseIterator set to the beginning (tail) of the list. rend() Create a ReverseIterator set to the end (beyond the head) of the list. Robb T. Koether (Hampden-Sydney College) List Iterator Implementation Fri, Apr 10, 2015 13 / 18
LinkedListwIter Member Functions The other LinkedListwIter member functions that use iterators, such as the iterator version of getelement(), can accept reverse iterators as well because A ReverseIterator IS-A Iterator. Robb T. Koether (Hampden-Sydney College) List Iterator Implementation Fri, Apr 10, 2015 14 / 18
Implemention of Reverse Iterators To construct a reverse iterator for a linked list, Introduce a stack data member. Push NULL onto the stack. Then push the addresses of the nodes onto the stack as the list is traversed from head to tail. Stop with all but the final NULL pointer on the stack. Now the reverse iterator is initialized. Robb T. Koether (Hampden-Sydney College) List Iterator Implementation Fri, Apr 10, 2015 15 / 18
Implemention of Reverse Iterators To increment a reverse list iterator Pop an address off the stack. Assign it to the node pointer. To decrement a reverse list iterator Push the current address onto the stack. Use the next pointer as the current address. Robb T. Koether (Hampden-Sydney College) List Iterator Implementation Fri, Apr 10, 2015 16 / 18
Outline 1 LinkedList Iterators 2 List Traversals 3 Reverse Iterators 4 Assignment Robb T. Koether (Hampden-Sydney College) List Iterator Implementation Fri, Apr 10, 2015 17 / 18
Assignment Assignment Read Section 14.6. Robb T. Koether (Hampden-Sydney College) List Iterator Implementation Fri, Apr 10, 2015 18 / 18