C++模板实现单向链表
模板实现头文件:
#ifndef SUN_LINKLIST_H #define SUN_LINKLIST_H #include <iostream> using namespace std ; //#include "List.h" // T : operator= , operator!= , operator== , copy constructor , assign constructor #define SUN_LINKLIST_DEBUG #ifdef SUN_LINKLIST_DEBUG //pause #define PAUSE (system("pause")) #else #define PAUSE (0) #endif template<typename T> class LinkList ; template<typename T> class LinkNode ; template <typename T> ostream& operator<<(ostream & _cout , const LinkNode<T>& _linknode ) ; template < typename T > class LinkNode //LinkNode type { public: LinkNode( ) ; LinkNode( const T & _value ) ; LinkNode( const LinkNode<T>& _linknode ) ; virtual ~LinkNode() ; LinkNode<T>& operator= (const LinkNode<T> & _right) ; friend ostream& operator<< <T>(ostream & _cout , const LinkNode<T> &linknode) ; friend class LinkList<T> ; private: T data ; LinkNode<T> * pnext ; } ; template<typename T> LinkNode<T> ::LinkNode( ) :data( ) //!!!default constructor { pnext = NULL ; } template<typename T> LinkNode<T>::LinkNode(const T & _value) { data = _value ; pnext = NULL ; } template <typename T> LinkNode<T> ::LinkNode(const LinkNode<T> &_linknode ) { data = _linknode .data ; //!!!!operator == pnext = NULL ; } template <typename T> LinkNode< T > ::~LinkNode(){ } ; template <typename T> ostream & operator<< (ostream & _cout , const LinkNode<T>& _linknode ) { _cout<<"link node data : "<<_linknode .data ; //!!!!T operator << return _cout ; } template <typename T> LinkNode<T> & LinkNode< T > ::operator=(const LinkNode< T > &_right) { data = _right .data ; pnext = _right .pnext ; return *this ; } template< typename T > class LinkList { private: LinkNode<T> *linkhead ; size_t linklength ; LinkNode <T> *find_ins_pos(size_t _ins_pos ) ; int copydata( const LinkList<T> & _ls , size_t _start , size_t _end ) ; public: LinkList( ); LinkList( const LinkList<T> & _linklist ) ; LinkList<T> & operator= ( const LinkList<T> & _linklist ) ; ~LinkList() ; int insert(size_t _ins_pos , const T & _value) ; int remove(size_t _ins_pos , T & _value ) ; int find (const T & _value) const ; int replace(size_t _re_pos , const T & _value); T & get(size_t _pos ) const ; bool isempty( ) { return linklength == 0 } ; int get_link_length( ) const { return linklength ; } ; }; template <typename T> LinkList<T>::LinkList( ) { linkhead = NULL ; linklength = 0 ; } template <typename T> LinkList<T> ::LinkList(const LinkList<T> & _ls) { linkhead = NULL ; linklength = 0 ; copydata(_ls , 0 , _ls .get_link_length( ) ) ; } template <typename T> T &LinkList<T> ::get(size_t _pos ) const { LinkNode<T> *pln_temp = linkhead ; size_t i = 0 ; while(pln_temp != NULL && i < _pos ) { pln_temp = pln_temp ->pnext ; i++ ; } if(pln_temp == NULL ) { cout<<"get : _pos range ERROR"<<endl ; PAUSE; } return pln_temp ->data ; //operator= } template< typename T> int LinkList < T > ::insert(size_t _ins_pos , const T & _value) { LinkNode< T > *pln = NULL ; if(_ins_pos == 0 ) //insert to the first place of the link list { pln = new LinkNode< T >( _value ) ; pln ->pnext = linkhead ; linkhead = pln ; linklength++ ; return 0 ; } pln = linkhead ; size_t i = 0 ; while( pln != NULL && ( i < (_ins_pos - 1 ) ) ) { pln = pln ->pnext ; i++ ; } if( pln == NULL) //insert range ERROR { cout<< "the range of the inset position is ERROR"<<endl ; return -1 ; } LinkNode<T> *pln_temp = new LinkNode<T>(_value) ; pln_temp ->pnext = pln ->pnext ; pln ->pnext = pln_temp ; linklength++ ; return 0 ; } template <typename T> int LinkList < T > ::copydata(const LinkList< T > &_ls , size_t _start , size_t _end ) { linkhead = NULL ; linklength = 0 ; LinkNode< T > *pln = _ls .linkhead ; LinkNode< T > *phead = NULL; if(_ls .linklength == 0 ) { return 0 ; } // link list empty return linkhead = new LinkNode<T>( *(_ls .linkhead ) ) ; // not empty pln = pln ->pnext ; phead = linkhead ; linklength++ ; while (pln != NULL ) { phead ->pnext = new LinkNode<T> ( *( pln ) ) ; phead = phead ->pnext ; pln = pln ->pnext ; linklength++ ; } phead ->pnext = NULL ; //the pnext of the link end is NULL return 0 ; } template <typename T> int LinkList<T> ::remove(size_t _rm_pos , T & _value ) { if( linkhead == NULL || _rm_pos < 0 || ( linklength - 1 < _rm_pos ) ) { cout<<"remove : _rm_pos range error"<<endl ; return -1; } LinkNode<T> *pln_temp = linkhead ; if(_rm_pos == 0 ) { _value = pln_temp ->data ; // !!!!! T operator= linkhead = linkhead ->pnext ; delete pln_temp ; linklength-- ; return 0 ; } size_t i = 0 ; pln_temp = linkhead ; while(pln_temp != NULL && ( i < (_rm_pos - 1) ) ) { pln_temp = pln_temp ->pnext ; i++ ; } LinkNode<T> *pln_temp1 = pln_temp ->pnext ; pln_temp ->pnext = pln_temp1 ->pnext ; _value = pln_temp1 ->data ; delete pln_temp1 ; linklength-- ; return 0 ; } template <typename T> int LinkList<T> ::find(const T & value ) const { int i = 0 ; LinkNode<T> *pln = linkhead ; while(pln != NULL && pln->data != value ) //!!!!!operator!=() of T { pln = pln ->pnext ; i++ ; } if( pln!=NULL ) return i ; else return -1; } template <typename T> int LinkList<T> ::replace(size_t _re_pos , const T & _value) { T a_temp ; if(remove(_re_pos , a_temp) != 0 || insert(_re_pos , _value ) != 0 ) { cout<<"replace ERROR"<<endl ; return -1; } return 0 ; } template <typename T > LinkList< T > ::~LinkList() { cout<<"de_constructor"<<endl ; LinkNode<T> *pln = linkhead ; while( linkhead !=NULL) { cout<<linkhead->data <<endl ; pln = linkhead ; linkhead = linkhead ->pnext ; delete pln ; } } #endif
测试代码:
#include <iostream> using namespace std ; #include "LinkList.h" int main(int argc , char ** argv) { //测试友员类的访问权限 //LinkList< int > linktest ; //int a = 10 ; //linktest.funtest(a) ; //测试在linknode 中的重载"<<"操作符"函数 LinkNode<int> linknode(20) ; cout<<linknode<<endl ; //测试LinkNode 的赋值操作符 LinkNode< int > linknode1 ; linknode1 = linknode ; cout<<linknode1<<endl ; //测试insert , get 函数 LinkList<int> ls ; for(int i = 0 ; i <100 ; i++ ) { ls .insert(0 , i ) ; } for(int i = 0 ; i < ls .get_link_length( ) ; i++ ) { cout<<ls .get(i)<<endl ; } //测试copy constructor cout<<"copy constructor"<<endl ; LinkList<int> ls2(ls) ; for(int i = 0 ; i < ls2.get_link_length() ; i++ ) { cout<<ls2 .get( i )<<endl ; } //测试remove函数 cout<<"test remove"<<endl ; int i ; ls2 .remove(0 , i) ; cout<<"i = "<<i<<endl ; for(int i = 0 ; i < ls2.get_link_length() ; i++ ) { cout<<ls2 .get( i )<<endl ; } ls2 .remove(1 , i ) ; cout<<"i = "<<i<<endl ; for(int i = 0 ; i < ls2.get_link_length() ; i++ ) { cout<<ls2 .get( i )<<endl ; } //测试find() cout<<"test find"<<endl ; int i1 = 0 ; cout<<ls .find( i1 )<<endl ; //测试replace cout<<"replace"<<endl; int i2 = -3 ; ls .replace(99 , i2) ; cout<< ls .get(99)<<endl ; system("pause") ; return 0 ; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。