#include <cstdlib>
#include <iostream>
#include "list.h"
template<class T>
cList<T>::cList()
{
start = end = NULL;
}
template<class T>
cList<T>::~cList()
{
}
template<class T>
inline void cList<T>::PushFront( const T& x )
{
Element* elem = new Element;
elem->data = x;
Link( elem, true );
}
template<class T>
inline void cList<T>::PushBack( const T& x )
{
Element* elem = new Element;
elem->data = x;
Link( elem, false );
}
template<class T>
inline void cList<T>::Link(Element* i, bool front)
{
if ( !i ) return;
if ( !start ) {
start = end = i;
i->SetNext(NULL);
i->SetPrev(NULL);
}
else if ( front )
{
i->SetPrev(NULL); i->SetNext(start); start->SetPrev(i);
start = i;
}
else
{
i->SetPrev(end); i->SetNext(NULL); end->SetNext(i);
end = i;
}
}
template<class T>
inline void cList<T>::Unlink(Element* x)
{
if ( !x ) return;
if ( x == start )
{
start = x->GetNext();
if ( start )
start->SetPrev(NULL);
}
else
(x->GetPrev())->SetNext(x->GetNext());
if ( x == end )
{
end = x->GetPrev();
if ( end )
end->SetNext(NULL);
}
else
(x->GetNext())->SetPrev(x->GetPrev());
}
template<class T>
inline unsigned int cList<T>::Size()
{
unsigned int size = 0;
for ( Element* iter = start; iter != NULL; iter = iter->GetNext() )
size++;
return size;
}
template<class T>
inline bool cList<T>::Empty()
{
return (start == NULL);
}
template<class T>
inline void cList<T>::Clear()
{
while ( start )
{
Element* temp = start;
Unlink(start);
delete temp;
}
}
template<class T>
inline void cList<T>::Print()
{
std::cout << "\n[ ";
for ( Element* iter = start; iter != NULL; iter = iter->GetNext() )
std::cout << iter->data << ' ';
std::cout << "]\n";
}
template<class T>
inline void cList<T>::Delete(const T& x)
{
for ( Element* iter = start; iter != NULL; iter = iter->GetNext() )
{
if ( iter->data == x )
{
Unlink(iter);
delete iter;
break;
}
}
}
template<class T>
inline void cList<T>::Erase(const T& x)
{
Element* next;
for ( Element* iter = start; iter != NULL; iter = next )
{
next = iter->GetNext();
if ( iter->data == x )
{
Unlink(iter);
delete iter;
}
}
}
template<class T>
inline void cList<T>::PopFront()
{
Element* temp = start;
Unlink(start);
delete temp;
}
template<class T>
inline void cList<T>::PopBack()
{
Element* temp = end;
Unlink(end);
delete temp;
}
template<class T>
inline void cList<T>::Insert(Element* link, Element* insert)
{
if ( !link || !insert )
return;
link->SetPrev(insert->GetPrev());
if ( !insert->GetPrev() )
start = link;
else
(insert->GetPrev())->SetNext(link);
insert->SetPrev(link);
link->SetNext(insert);
}
template<class T>
inline void cList<T>::Reverse()
{
Element* iter = start;
Element* prev = NULL;
Element* next = NULL;
end = iter;
while ( iter )
{
next = iter->GetNext(); prev = iter->GetPrev();
iter->SetPrev(next);
iter->SetNext(prev);
if ( !next )
start = iter;
iter = next;
}
}