单项循环链表
# ifndef C11LEARN_SINGLECYCLELINK_H
# define C11LEARN_SINGLECYCLELINK_H
# include "chapter10.h"
template < typename T >
class SingleCycleL
{
public :
HalfNode< T> * Nil;
public :
SingleCycleL ( ) {
Nil = new HalfNode< T> ( ) ;
Nil-> next = Nil;
}
SingleCycleL ( const SingleCycleL< T> & l)
{
Nil = new HalfNode< T> ( ) ;
Nil-> next = Nil;
copy ( l) ;
}
const SingleCycleL< T> & operator = ( const SingleCycleL< T> & l)
{
clear ( ) ;
copy ( l) ;
return * this ;
}
virtual ~ SingleCycleL ( )
{
clear ( ) ;
if ( Nil!= nullptr )
{
delete Nil;
Nil = nullptr ;
}
}
void clear ( )
{
HalfNode< T> * current = Nil-> next;
while ( current != Nil)
{
HalfNode< T> * node = current;
current = current-> next;
delete node;
}
Nil-> next = Nil;
}
void copy ( const SingleCycleL< T> & l)
{
HalfNode< T> * current = l. Nil-> next;
HalfNode< T> * current_self = Nil;
while ( current!= l. Nil)
{
HalfNode< T> * node = new HalfNode< T> ( current-> key) ;
current = current-> next;
current_self-> next = node;
current_self = node;
}
current_self-> next = Nil;
}
} ;
template < typename T >
void insert ( SingleCycleL< T> & l, T key)
{
HalfNode< T> * t = new HalfNode< T> ( key) ;
t-> next = l. Nil-> next;
l. Nil-> next = t;
}
template < typename T >
bool remove ( SingleCycleL< T> & l, T key)
{
HalfNode< T> * pre = l. Nil;
HalfNode< T> * current = l. Nil-> next;
while ( current-> key!= key)
{
pre = current;
current = current-> next;
}
if ( current != l. Nil)
{
pre-> next = current-> next;
delete current;
return true ;
}
return false ;
}
template < typename T >
HalfNode< T> search ( SingleCycleL< T> & l, T key)
{
l. Nil-> key = key;
HalfNode< T> * current = l. Nil-> next;
while ( current-> key!= key)
{
current = current-> next;
}
return current;
}
# endif
辅助类HalfNode链接