#include<iostream> #include<string> using namespace std; template< typename T > class SimNode; template< typename T> class SimChain; template< typename T> class SimSpace; class Exception { private: string mid; public: Exception( string a ):mid(a){}; string& GetString(){ return mid;} }; template< typename T > class SimNode { friend SimSpace<T>; friend SimChain<T>; private: T data; int link; }; template< typename T > class SimSpace { friend class SimChain<T>; private: SimNode<T>* data; int MaxSize; int first,first2; public: SimSpace( int MaxSize = 100 ); ~SimSpace(){ delete []data;} int Alloc(); void Free( int& a ); }; template< typename T > class SimChain { private: static SimSpace<T> data; int first; int size; public: SimChain(); ~SimChain(); void Destroy(); int Length(); bool Find( int k , T & x ) const; int Search( const T & x ) const; SimChain<T>& Delete( int k , T & x ); SimChain<T>& Insert( int k , const T & x ); void Output( ostream & os )const; }; template<typename T > SimSpace<T>::SimSpace( int MaxSize ) { this->MaxSize = MaxSize; first = 0 ; first2 = -1; data = new SimNode<T>[MaxSize]; } template<typename T > int SimSpace<T>::Alloc() { if( first2 == -1 ) { if( first == MaxSize ) throw Exception("NoMemory"); return first++; } else { int mid = first2 ; first2 = data[first2].link; return mid; } } template<typename T > void SimSpace<T>::Free( int& a ) { data[a].link = first2; first2 = a; a = -1; } template<typename T> SimSpace<T> SimChain<T>::data; template<typename T> SimChain<T>::SimChain() { size = 0 ; first = data.Alloc(); data.data[first].link = -1; } template<typename T> SimChain<T>::~SimChain() { Destroy(); data.Free( first ); } template<typename T> void SimChain<T>::Destroy() { int mid = data.data[first].link; int mid2; while( mid != -1 ) { mid2 = data.data[mid].link; data.Free( mid ); mid = mid2; } size = 0 ; } template<typename T> int SimChain<T>::Length() { return size; } template<typename T> bool SimChain<T>::Find( int k , T & x ) const { if( k < 1 || k > size ) return false; int index = 0,i; for( i = first ; index < k ; ++index , i = data.data[i].link ); x = data.data[i].data; return true; } template<typename T> int SimChain<T>::Search( const T & x ) const { int index = data.data[first].link; for( ; index != - 1 && data.data[index].data != x ; index = data.data[index].link ); if( index == - 1 ) return 0; else return index; } template<typename T> SimChain<T>& SimChain<T>::Delete( int k , T & x ) { if( k < 1 || k > size ) throw Exception("OutOfBound!"); int index = 1,i; for( i = first ; index < k ; i = data.data[i].link , ++index ); int j = data.data[i].link; x = data.data[j].data; data.data[i].link = data.data[j].link; data.Free( j ); --size; return *this; } template< typename T > SimChain<T>& SimChain<T>::Insert( int k , const T & x ) { if( k < 0 || k > size ) throw Exception("OutOfBound"); int index = 0, i ; for( i = first ; index < k ; i = data.data[i].link , ++index ); int j = data.data[i].link; int m = data.Alloc(); data.data[m].data = x ; data.data[i].link = m ; data.data[m].link = j ; ++size; return *this; } template<typename T> void SimChain<T>::Output( ostream & os )const { int i; for( i = data.data[first].link ; i != -1 ; i = data.data[i].link ) os<< data.data[i].data<<" "; } template<typename T> ostream & operator<<( ostream & os , const SimChain<T>& a ) { a.Output( os ); return os; }