270 likes | 293 Views
The List ADT Sections 3.2, 3.3, 3.5. Lists in Everyday Life. Shopping list To-do list Dave Letterman’s top 10 list My cat’s revenge list Shopping vector? What if you want to insert an item?. List Wish List. Insert an element Remove an element Remove all items Assignment operator
E N D
Lists in Everyday Life • Shopping list • To-do list • Dave Letterman’s top 10 list • My cat’s revenge list • Shopping vector? • What if you want to insert an item?
List Wish List • Insert an element • Remove an element • Remove all items • Assignment operator • Comparison operators • Constructors/destructors • Generic class • Convenient way to iterate through the list
Abstract view of List and Iterator ListElement next next next next null null prev prev prev prev front back I1 Iterator
List Public Interface (contd) • Locating places on the list iterator begin(); const iterator begin() const; iterator end(); const iterator end() const; • Accessing values on the list Object & front(); Object & back(); (and their const versions)
List Public Interface (contd.) • Write functions int push_front(const Object & x); int push_back(const Object & x); int pop_front(); int pop_back(); int insert(iterator & itr, const Object & x); iterator erase( iterator itr); iterator erase( iterator start, iterator end ); void clear();
List Public Interface (contd.) • Constructors and destructor List(); List(const List & rhs); ~List();
List Complexity Requirements • O(1) Runtime complexity • Default Constructor • push_front(t), push_back(t), insert(I, t) • pop_front(), pop_back(), erase(I) • begin(), end(); • front(), back(); • empty();
List Complexity Requirements (2) • O(N) Runtime complexity • Copy Constructor • Destructor • clear() • erase(SI,EI)
List Iterator Public Interface • Read-only operators int operator== (const iterator & rhs) const; int operator!= (const iterator & rhs) const; Object& operator* ( ) const; // return a reference to // current value • Write operators iterator& operator++ ( ); // prefix iterator operator++ ( int ); // postfix iterator& operator-- ( ); // prefix iterator operator-- ( int ); // postfix • O(1) requirement for space and time
Using List List<String> KittyVengeance; KittyVengeance.push_front(“toe biting”); • “toe biting” KittyVengeance.push_back(“carpet littering”); • “toe biting”, “carpet littering” KittyVengeance.push_front(“midnight howling”); • “midnight howling”, “toe biting”, “carpet littering” KittyVengeance.push_back(“couch tearing”); • “midnight howling”, “toe biting”, “carpet littering”, “couch tearing” List<String>::iterator I; for (I = KittyVengeance.begin(); I != KittyVengence.end(); I++) { // print list with << }
List Insertion • Insert “furniture scratching” before “toe biting” // sequential search for (I = KittyVengeance.begin(); I != KittyVengence.end(); I++) { if (“toe biting” == *I) { break; } } // insert the new string KittyVengeance.insert(I, “furniture scratching”); • “midnight howling”, “furniture scratching”, “toe biting”, “carpet littering”, “couch tearing” // what happens if “toe biting” is not on the list?
Remove all copies of item from List List<String>::iterator I = KittyVengeance.begin(); while( I != KittyVengeance.end()) { if (“couch tearing” == *I) { KittyVengeance.erase(I); } else { I++; } }
List and List Iterator • Conceptual relationship Iterator I1 begin current end List: A, B, C, D, E, F begin current end Iterator I2
data prev next data prev next data prev next No need for contiguous memory allocation Nodes in a list • Node • Pointers to the previous and next element • Data Value • Defined within the List class, with limited scope
List Implementation A Doubly Linked List With Header and Tail Nodes as Markers An Empty List
const_iterator for List Prefix Postfix
iterator class for List Why do we override the parent’s ++ implementation?