#include using namespace std; /* clas :: list_item */ template class list_item { public : list_item( elemType value, list_item* item_to_link_to = 0 ); void next(list_item* link) { _next = link; } list_item* next() { return _next; } elemType value() { return _value;} void value(elemType nValue) { _value = nValue; } private: elemType _value; list_item* _next; }; template inline list_item:: list_item( elemType value, list_item* item ) : _value(value) { if(!item) _next = 0; else { _next = item->_next; item->_next = this; } } /* class :: ilist */ template class list { public : list () : _at_front(0) , _at_end(0) , _size(0) , current(0) {} list( const list &rhs ) : _at_front( 0 ), _at_end( 0 ) , current(0) { copy( rhs ); } list& operator = (const list &list); list_item* find( elemType value ); list_item* begin() { return _at_front; } list_item* end() { return _at_end; } ~list() { remove_all(); } int size(); void insert ( list_item* ptr, elemType value ); void insert_end ( elemType value ); void insert_front ( elemType value ); void remove ( elemType value ); void display (ostream& os = cout); void remove_front (); void remove_all (); void concat (list mlist); void reverse (); list_item* init_pos (list_item* pnt) { current = pnt; } list_item* inc_pos () { if(current) current = current->next; } private: void copy (const list &mlist); void link (list_item* first , list_item* next); void size_up (int v = 1); void size_down(int v = 1); list_item* _at_front ; list_item* _at_end ; list_item* current ; int _size ; }; template inline void list::size_up(int v) { _size += v; } template inline void list::size_down(int v) { _size -= v; } template inline int list::size() { return _size; } template inline list& list::operator=(const list &rhs) { _at_front = 0; _at_end = 0; copy(rhs); _size = rhs._size; current = _at_front; return *this; } template inline void list::insert_front( elemType value ) { list_item* ptr = new list_item ( value ); if(!_at_front) _at_front = _at_end = ptr; else { ptr->next( _at_front ); _at_front = ptr; } size_up(); } template inline void list::insert_end( elemType value ) { if(!_at_end) _at_end = _at_front = new list_item( value ); else _at_end = new list_item( value , _at_end ); size_up(); } template inline void list::insert( list_item* ptr, elemType value ) { if(!ptr) insert_front( value ); else { size_up(); new list_item( value , ptr ); } } template inline void list::copy (const list &mlist) { _at_front = _at_end = 0; list_item* pnt = mlist._at_front; while (pnt) { insert_end( pnt->value() ); pnt = pnt->next(); } } template inline list_item* list::find ( elemType value ) { list_item* iter = _at_front; while (iter) { if( iter->value() == value ) break; iter = iter->next(); } return iter; } template inline void list::display( ostream& os ) { os << "\n( " << _size << ") ("; list_item* iter = _at_front; while ( iter ) { os << iter->value(); iter = iter->next(); } os << ")\n"; } template inline void list::remove_front() { list_item* ptr = _at_front; _at_front = _at_front->next(); delete ptr; } template inline void list::remove_all() { if( !_size ) return; while (_at_front) remove_front(); _size = int( _at_front = _at_end = 0 ) ; } template inline void list::link (list_item* first , list_item* next) { if ( first && next ) first->next(next); if ( !first ) _at_front =next; if ( !next ) { _at_end =first; first->next(0); } } template inline void list::remove ( elemType value ) { list_item* prev = 0 , *iter = _at_front , *del; int deleted = 0; while (del = iter) { if ( iter->value() == value ) { ++deleted; link( prev , (iter = iter->next()) ); delete del; } else { prev = iter; iter = iter->next(); } } size_down(deleted); } template inline void list::concat ( list mlist ) { list_item* iter = mlist.begin(); while (iter) { insert_end(iter->value()); iter = iter->next(); } } template inline void list::reverse () { list_item *sled = 0 , *iter = _at_front , *store; _at_front = _at_end; _at_end = iter ; while (iter) { store = iter; iter = iter->next(); (sled = store)->next(sled); } }