//链表的模板实现

// 链表的模板实现 
// By KiRa 07/08/28

#include 
< iostream >
using   namespace  std;

/*
Length = 0
IsEmpty = 1
List is 2  6
IsEmpty = 0
First element is 2
Length = 2
Deleted element is 2
List is 6
*/


class  OutOfBounds {
   
public :
      OutOfBounds() {}
};

template 
< class  T >   class  ChainIterator;
template 
< class  T >   class  Chain;
template 
< class  T >   class  KeyedChain;
template 
< class  T >   class  LinkedStack;

template 
< class  T >
class  ChainNode {
   friend 
class  Chain < T > ;
   friend 
class  ChainIterator < T > ;
   friend 
class  KeyedChain < T > ;
   friend 
class  LinkedStack < T > ;
   
private :
      T data;
      ChainNode
< T >   * link;
};

template
< class  T >
class  Chain {
   friend 
class  ChainIterator < T > ;
   
public :
      Chain() {first 
=   0 ;}
      
~ Chain();
      
bool  IsEmpty()  const  { return  first  ==   0 ;}
      
int  Length()  const
      
bool  Find( int  k, T &  x)  const
      
int  Search( const  T &  x)  const
      Chain
< T >&  Delete( int  k, T &  x); 
      Chain
< T >&  Insert( int  k,  const  T &  x);
      
void  Output(ostream &   out const ;
   
private :
      ChainNode
< T >   * first;
};

template
< class  T >
Chain
< T > :: ~ Chain()
{
   ChainNode
< T >   * next; 
   
while  (first) {
      next 
=  first -> link;
      delete first;
      first 
=  next;
      }
}

template
< class  T >
int  Chain < T > ::Length()  const
{
   ChainNode
< T >   * current  =  first;
   
int  len  =   0 ;
   
while  (current) {
     len
++ ;
     current 
=  current -> link;
     }
   
return  len;
}

template
< class  T >
bool  Chain < T > ::Find( int  k, T &  x)  const
{
   
if  (k  <   1 return   false ;
   ChainNode
< T >   * current  =  first;
   
int  index  =   1
   
while  (index  <  k  &&  current) ...{
      current 
=  current -> link;
      index
++ ;
      }
   
if  (current) {x  =  current -> data;
                 
return   true ;}
   
return   false ;
}

template
< class  T >
int  Chain < T > ::Search( const  T &  x)  const
{
   ChainNode
< T >   * current  =  first;
   
int  index  =   1 ;
   
while  (current  &&  current -> data  !=  x) {
      current 
=  current -> link;
      index
++ ;
      }
   
if  (current)  return  index;
   
return   0 ;
}

template
< class  T >
Chain
< T >&  Chain < T > ::Delete( int  k, T &  x)
{
   
if  (k  <   1   ||   ! first)
      
throw  OutOfBounds();
   
   ChainNode
< T >   * =  first;

   
if  (k  ==   1
      first 
=  first -> link; 
   
else  { 
      ChainNode
< T >   * =  first;
      
for  ( int  index  =   1 ; index  <  k  -   1   &&  q;
                          index
++ )
         q 
=  q -> link;
      
if  ( ! ||   ! q -> link)
         
throw  OutOfBounds(); 
      p 
=  q -> link; 
      q
-> link  =  p -> link;} 

   x 
=  p -> data;
   delete p;
   
return   * this ;
}

template
< class  T >
Chain
< T >&  Chain < T > ::Insert( int  k,  const  T &  x)
{
   
if  (k  <   0 throw  OutOfBounds();

   ChainNode
< T >   * =  first;
   
for  ( int  index  =   1 ; index  <  k  &&  p;
                       index
++ )  
      p 
=  p -> link;
   
if  (k  >   0   &&   ! p)  throw  OutOfBounds();

   ChainNode
< T >   * =   new  ChainNode < T > ;
   y
-> data  =  x;
   
if  (k) {
           y
-> link  =  p -> link;
           p
-> link  =  y;}
   
else  {
         y
-> link  =  first;
         first 
=  y;}
   
return   * this ;
}

template
< class  T >
void  Chain < T > ::Output(ostream &   out const
{
   ChainNode
< T >   * current;
   
for  (current  =  first; current;
                         current 
=  current -> link)
      
out   <<  current -> data  <<   "    " ;
}

template 
< class  T >
ostream
&   operator << (ostream &   out const  Chain < T >&  x)
 {x.Output(
out );  return   out ;}
   
   
int  main( void )
{
   
try  {
      Chain
< int >  L;
      cout 
<<   " Length =  "   <<  L.Length()  <<  endl;
      cout 
<<   " IsEmpty =  "   <<  L.IsEmpty()  <<  endl;
      L.Insert(
0 , 2 ).Insert( 1 , 6 );
      cout 
<<   " List is  "   <<  L  <<  endl;
      cout 
<<   " IsEmpty =  "   <<  L.IsEmpty()  <<  endl;
      
int  z;
      L.Find(
1 ,z);
      cout 
<<   " First element is  "   <<  z  <<  endl;
      cout 
<<   " Length =  "   <<  L.Length()  <<  endl;
      L.Delete(
1 ,z);
      cout 
<<   " Deleted element is  "   <<  z  <<  endl;
      cout 
<<   " List is  "   <<  L  <<  endl;
      }
   
catch  (...) {
      cerr 
<<   " An exception has occurred "   <<  endl;
      }
   
   cin.
get ();
   
return  EXIT_SUCCESS;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值