#ifndef TLINKLIST_H
#define TLINKLIST_H
//#define NULL 0
#include <stdlib.h>
template < class T>
class TLinkList ;
template < class T>
class TLinkNode{
friend class TLinkList< T> ;
public :
TLinkNode( TLinkNode< T> * p= NULL){ next= p;}
TLinkNode( const T& dat, TLinkNode< T> * p= NULL) { data= dat; next= p ;}
T getData() const { return data;}
private :
T data ;
TLinkNode * next ;
};
template < class T>
class TLinkList{
private :
TLinkNode< T>* head ;
TLinkNode< T>* current ;
int size ;
public :
TLinkList(); //{length=0 ;}
~ TLinkList() ;
void ClearAll() ;
int Size() const { return size ;}
bool IsEmpty() const { return ( size== 0 )? true : false ;}
TLinkNode< T> * GetCurrent() const ;
TLinkNode< T> * GetItem( int k) const ;
T & GetData( int k) const ;
bool Insert( int k, const T & data) ;
bool PushFront( const T & data) ;
bool PushBack( const T & data) ;
};
template < class T>
TLinkList< T>:: TLinkList(){
size= 0 ;
current= head= NULL ;
}
template < class T>
TLinkList< T>::~ TLinkList(){
ClearAll() ;
}
template < class T>
void TLinkList< T>:: ClearAll(){
while ( head!= NULL){
current= head ;
head= head-> next ;
delete current ;
}
size= 0 ;
head= current= NULL ;
}
template < class T>
TLinkNode< T> * TLinkList< T>:: GetCurrent() const {
return current ;
}
template < class T>
TLinkNode< T> * TLinkList< T>:: GetItem( int k) const {
if ( k> size)
return NULL ;
int i= 0 ;
TLinkNode< T> * node= head ;
if ( head== NULL)
return NULL ;
while ( i< k){
node= node-> next ;
i++ ;
}
return node ;
}
template < class T>
T & TLinkList< T>:: GetData( int k) const {
TLinkNode< T> * node= GetItem( k) ;
T temp ;
if ( node!= NULL){
temp= node-> data ;
}
return temp ;
}
template < class T>
bool TLinkList< T>:: Insert( int k, const T & data){
TLinkNode< T> * node ;
TLinkNode< T> * temp ;
if ( head== NULL|| k> size)
return false ;
temp= new TLinkNode< T>( data) ;
if ( k== 0 ){
PushFront( data) ;
} else {
node= GetItem( k- 1 ) ;
temp-> next= node-> next ;
node-> next= temp ;
size++ ;
}
return true ;
}
template < class T>
bool TLinkList< T>:: PushBack( const T & data){
if ( head== NULL){
head= current= new TLinkNode< T>( data) ;
size++ ;
} else {
current-> next= new TLinkNode< T>( data) ;
size++ ;
current= current-> next ;
}
}
template < class T>
bool TLinkList< T>:: PushFront( const T & data){
TLinkNode< T> * temp ;
if ( head== NULL){
head= current= new TLinkNode< T>( data) ;
size++ ;
} else {
temp= new TLinkNode< T>( data) ;
temp-> next= head ;
head= temp ;
size++ ;
}
}
#endif // TLINKLIST_H