您的位置:首页 > 其它

双向+头结点+循环的链表

2011-01-12 22:47 204 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: