/////// File: ArbList.C /////// #include "ArbList.h" ArbList::~ArbList() { free(); } void ArbList::free() // private method { ArbCell* n, *p = head; while (p) { n = p->next; delete p; p=n; } } int ArbList::shorten(int n) { while (n-- && head) { ArbCell* tmp=head; head = head->next; delete(tmp); } return(- ++n); } int ArbList::remove(Arbent c) { ArbCell *tmp, *p = head; int count = 0; if ( p == NULL ) return(count); while (p->next) // treat all but head cell { if ( equal((p->next)->item, c) ) // call equal { count++; tmp = p->next; p->next = tmp->next; delete(tmp); // free up store } else p = p->next; } if( equal(head->item, c) ) // treat head cell { tmp = head; head = head->next; delete(tmp); count++; } return(count); // number of items removed } int ArbList::put_on(Arbent c) { ArbCell* tmp = new ArbCell(c,head); if ( tmp ) { head = tmp; return(0); } else return(-1); // failed } // insert after entry e int ArbList::insert(Arbent c, ArbCell* e) { ArbCell* tmp = new ArbCell(c,next(e)); if ( tmp ) { if (e) e->next = tmp; else head = tmp; return(0); } else return(-1); // failed } ArbCell* ArbList::last() { ArbCell* p = head; while( p && p->next ) p = p->next; return(p); } ArbCell* ArbList::find(Arbent c) { for( ArbCell* p = head; p ; p = p->next ) if( equal(p->item, c) ) return(p); return(NULL); // c not on list } int ArbList::substitute(Arbent r, Arbent s) { ArbCell* p = find(s); if ( p == NULL ) return(-1); // s not on list p->item = r; return(0); } // display from p to end void ArbList::display(ArbCell* p) { cout << "("; while ( p ) { dispfn(p->item); if ( p = p->next ) cout << " "; } cout << ")\n"; }