/////// File: List.C /////// #include "List.h" template inline int List::equal(T& r, T& s) { return( r == s ); } // If your compiler has trouble with the static member End, // consider replacing End by NULL in the template List template Item* List::End = NULL; template List::~List() { free(); } template void List::free() // private method { Item* n, *p = head; while (p) { n = p->next; delete p; p=n; } } template int List::shorten(int n) { while (n-- && head) { Item* tmp=head; head = head->next; delete(tmp); } return(- ++n); } template int List::remove(T& c) { Item *tmp, *p = head; int count = 0; while (p->next) // treat all but head cell { if ( equal((p->next)->value(), c) ) { count++; tmp = p->next; p->next = tmp->next; delete(tmp); // free up store } else p = p->next; } if ( equal(head->value(), c) ) // treat head cell { tmp = head; head = head->next; delete(tmp); count++; } return(count); // number of items removed } template void List::remove(Item* z) // del list cell { Item* tmp; if ( head == z ) // treat head cell { tmp = head; head = head->next; delete(tmp); return; } Item* p = head; while (p->next) // treat other cells if ( p->next == z ) { tmp=p->next; p->next=(p->next)->next; delete(tmp); // free up store return; } else p= p->next; return; // no entry is 0 } template int List::put_on(T& c) { Item* tmp = new Item(c,head); if ( tmp ) { head = tmp; return(0); } else return(-1); // failed } // insert after entry e template int List::insert(T& c, Item* e) { Item* tmp = new Item(c,next(e)); if ( tmp ) { if (e) e->next = tmp; else head = tmp; return(0); } else return(-1); // failed } template Item* List::last() { Item* p = head; while( p && p->next ) p = p->next; return(p); } template Item* List::find(T& c) { for( Item* p = head; p ; p = p->next ) if( equal(p->value(), c) ) return(p); return(NULL); // c not on list } template int List::substitute(T& r, T& s) { for( Item* p = head; p ; p = p->next ) if( equal(p->value(), s) ) { p->value(r); return(0); } return(-1); // s not on list } // display from p to end template void List::display(ostream& out, Item* p) const { out << "("; while ( p ) { out << p->value(); // call overloaded << if ( p = p->next ) out << " : "; } out << ")\n"; } template int ListIterator::operator()(T& n) { pre = cur; if ( pre ) { cur = pre->next; n = pre->value(); return(1); } else return(0); } template void ListIterator::del() { l.remove( pre ); }