单链表是指,无哑结点,无循环的单向链表,其是最基本的数据结构之一。 在看萨尼的数据结构时,发现他的单链表的插入和删除情况非常麻烦,后来发现一个比较简洁的单链表方法。 #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 Chain; template< typename T> ostream & operator<< ( ostream & os , Chain<T> & a ); template< typename T > class ChainNode { friend Chain<T>; friend ostream & operator<< <T>( ostream & os , Chain<T> & a ); private: T data; ChainNode<T> *link; }; template< typename T > class Chain { friend ostream & operator<< <T>( ostream & os , Chain<T> & a ); private: ChainNode<T > *first; public: Chain(){ first = NULL ;} ~Chain(){ 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(); Chain<T>& Delete( int k , T & x ); Chain<T>& Insert( int k , const T & x ); }; template<typename T> int Chain<T>::Length()const { ChainNode<T> *p; int index = 0; for( p = first ; p ; p = p->link ,++index ); return index; } template< typename T > bool Chain<T>::Find( int k , T & x )const { ChainNode<T> *p; int index = 1 ; for( p = first ; index < k && p ; p = p->link , ++index ); if( !p ) return false; else { x = p->data; return true; } } template< typename T> int Chain<T>::Search( const T & x )const { ChainNode<T> *p; int index = 1; for( p = first ; p && p->data != x ; p = p->link , ++index ); if( p ) return index; else return 0; } template< typename T > void Chain<T>::Clear() { ChainNode<T> *p,*q; for( p = first ; p ; p = q ) { q = p->link; delete p; } first = NULL; } template< typename T > Chain<T>& Chain<T>::Delete( int k , T & x ) { ChainNode<T> **p; int index = 1; for( p = &first ; index < k && *p ; ++index , p = &( (*p)->link ) ); if( !p ) throw Exception("OutOfBound"); x = (*p)->data; *p = (*p)->link; return *this; } template<typename T> Chain<T>& Chain<T>::Insert( int k , const T & x ) { ChainNode<T> **p; int index = 0 ; for( p = &first ; index < k && *p ; ++index , p = &(*p)->link ); if( index < k ) throw Exception("OutOfBound"); ChainNode<T> *q = new ChainNode<T>; q->data = x; q->link = (*p); *p = q; return *this; } template<typename T > ostream & operator<<( ostream & os , Chain<T> & a ) { ChainNode<T> *p; for( p = a.first ; p ; p = p->link ) os<<p->data<<" "; return os; }