#include<iostream> #include<string> using namespace std; class Exception { private: string mid; public: Exception( string a ):mid(a){}; string& GetString(){ return mid;} }; template<typename T > class DoubleChain; template< typename T> ostream & operator<< ( ostream & os , DoubleChain<T> & a ); template< typename T > class DoubleChainNode { friend DoubleChain<T>; friend ostream & operator<< <T>( ostream & os , DoubleChain<T> & a ); private: T data; DoubleChainNode<T> *leftLink; DoubleChainNode<T> *rightLink; }; template< typename T > class DoubleChain { friend ostream & operator<< <T>( ostream & os , DoubleChain<T> & a ); private: DoubleChainNode<T> end; int size; public: DoubleChain(){ end.rightLink = end.leftLink = &end ; size = 0 ;} ~DoubleChain(){ Clear();} bool IsEmpty()const{ return first == NULL ;} int Length()const; bool Find( int k , T &x )const; int Search( const T & x )const; void Clear(); DoubleChain<T>& Append( const T & x ); DoubleChain<T>& Delete( int k , T & x ); DoubleChain<T>& Insert( int k , const T & x ); }; template<typename T> int DoubleChain<T>::Length()const { return size; } template< typename T > bool DoubleChain<T>::Find( int k , T & x )const { DoubleChainNode<T> *p; if( k < 1 || k > size ) return false; for( p = end.rightLink ; index != k ; p = p->rightLink , ++index ); x = p->data; return true; } template< typename T> int DoubleChain<T>::Search( const T & x )const { DoubleChainNode<T> *p; int index = 1; end.data = x; for( p = end.rightLink ; p ->data != x ; p = p->rightLink , ++index ); if( p != end ) return index; else return 0; } template< typename T > void DoubleChain<T>::Clear() { DoubleChainNode<T> *p,*q; for( p = end.rightLink ; p != &end; p = q ) { q = p->rightLink; delete p; } end.leftLink = end.rightLink = &end; size = 0 ; } template< typename T > DoubleChain<T>& DoubleChain<T>::Delete( int k , T & x ) { DoubleChainNode<T> *p; if( k < 1 || k > size ) throw Exception("OutOfBound"); int index = 1; for( p = &end ; index < k ; ++index , p = p->rightLink ); DoubleChainNode<T> *q = p->rightLink; x = q->data; p->rightLink = q->rightLink; q->rightLink->leftLink = p; delete q; --size; return *this; } template<typename T> DoubleChain<T>& DoubleChain<T>::Insert( int k , const T & x ) { DoubleChainNode<T> *p; if( k < 0 || k > size ) throw Exception("OutOfBound"); int index = 0 ; for( p = &end ; index < k ; ++index ,p = p->rightLink ); DoubleChainNode<T> *q = new DoubleChainNode<T>; q->data = x; q->rightLink = p->rightLink; q->leftLink = p; p->rightLink = q; q->rightLink->leftLink = q; ++size; return *this; } template<typename T> DoubleChain<T>& DoubleChain<T>::Append( const T & x ) { DoubleChainNode<T> *p = end.leftLink; DoubleChainNode<T> *q = new DoubleChainNode<T>; q->data = x; q->leftLink = p ; q->rightLink = &end; end.leftLink = q; p->rightLink = q; } template<typename T > ostream & operator<<( ostream & os , DoubleChain<T> & a ) { DoubleChainNode<T> *p; for( p = a.end.rightLink ; p != &a.end; p = p->rightLink ) os<<p->data<<" "; return os; }