实现了链表简单的几个功能 迭代器并不实用,写着玩(未重载操作符)
#pragma once
template < class T > class MyList ;
template < class T > class ListIterator ;
template < class T >
class Node
{
public :
Node ( T item) : date ( item) { } ;
friend class MyList < T> ;
friend class ListIterator < T> ;
private :
T date;
Node* next;
} ;
template < class T >
class MyList
{
public :
MyList ( ) ;
~ MyList ( ) ;
void Insert ( const T& ) ;
void Delete ( const T& ) ;
int Find ( const T& ) const ;
void Reserval ( ) ;
friend class ListIterator < T> ;
private :
Node< T> * m_head;
} ;
template < class T >
class ListIterator
{
public :
ListIterator ( const MyList< T> & L) : m_list ( L) , m_current ( L. m_head) { }
bool NotNull ( ) ;
bool NextNotNull ( ) ;
T* First ( ) ;
T* Next ( ) ;
private :
const MyList< T> & m_list;
Node< T> * m_current;
} ;
template < class T >
MyList< T> :: MyList ( )
: m_head ( nullptr )
{
}
template < class T >
MyList< T> :: ~ MyList ( )
{
Node< T> * current = m_head;
while ( current)
{
Node< T> * q = current;
current = current- > next;
delete q;
}
}
template < class T >
inline void MyList< T> :: Insert ( const T& item)
{
Node< T> * newNode = new Node< T> ( item) ;
newNode- > next = m_head;
m_head = newNode;
}
template < class T >
inline void MyList< T> :: Delete ( const T& item)
{
Node< T> * previous = nullptr ;
Node< T> * current = m_head;
while ( current != nullptr )
{
if ( current- > date == item)
{
break ;
}
previous = current;
current = current- > next;
}
if ( current)
{
if ( previous)
{
previous- > next = current- > next;
delete current;
}
else
{
m_head = m_head- > next;
delete current;
}
}
}
template < class T >
inline int MyList< T> :: Find ( const T& item) const
{
int count = 0 ;
Node< T> * current = m_head;
while ( current)
{
if ( current- > date == item)
{
return count;
}
count++ ;
current = current- > next;
}
return - 1 ;
}
template < class T >
inline void MyList< T> :: Reserval ( )
{
Node< T> * p = m_head, * q = nullptr ;
while ( p)
{
Node< T> * r = q;
q = p;
p = p- > next;
q- > next = r;
}
m_head = q;
}
template < class T >
inline bool ListIterator< T> :: NotNull ( )
{
return m_current != nullptr ;
}
template < class T >
inline bool ListIterator< T> :: NextNotNull ( )
{
return m_current && m_current- > next != nullptr ;
}
template < class T >
inline T* ListIterator< T> :: First ( )
{
if ( m_list. m_head)
{
return & m_list. m_head- > date;
}
return nullptr ;
}
template < class T >
inline T* ListIterator< T> :: Next ( )
{
if ( m_current)
{
m_current = m_current- > next;
return & m_current- > date;
}
return nullptr ;
}
void listTest ( ) {
MyList< int > intList;
intList. Insert ( 5 ) ;
intList. Insert ( 15 ) ;
intList. Insert ( 25 ) ;
intList. Insert ( 35 ) ;
intList. Insert ( 45 ) ;
intList. Reserval ( ) ;
intList. Delete ( 25 ) ;
intList. Delete ( 5 ) ;
intList. Delete ( 45 ) ;
ListIterator< int > li ( intList) ;
if ( li. NotNull ( ) )
{
cout << * li. First ( ) ;
while ( li. NextNotNull ( ) )
cout << " -> " << * li. Next ( ) ;
cout << endl;
}
}