双链表节点的实现
DLink.h
template <class Elem>
class DLink
{
private:
static DLink<Elem>* freelist;
public:
Elem element;
DLink *next;
DLink *prev;
DLink(const Elem& e, DLink* prevp = NULL, DLink* nextp = NULL)
{
element = e;
prev = prevp;
next = nextp;
}
DLink(DLink* prevp = NULL, DLink* nextp = NULL)
{
prev = prevp;
next = nextp;
}
void* operator new(size_t);
void operator delete(void *);
};
template <class Elem>
DLink<Elem>* DLink<Elem>::freelist = NULL;
template <class Elem>
void* DLink<Elem>::operator new(size_t)
{
if(freelist = NULL) return ::new DLink; // creat space
DLink<Elem>* temp = freelist;
freelist = freelist->next;
return temp;
}
template <class Elem>
void DLink<Elem>::operator delete(void* ptr)
{
((DLink<Elem>*)ptr)->next = freelist; // put on freelist
freelist = (Link<Elem>*)ptr;
}
双链表的实现声明 & 成员函数的是实现
#include "stdafx.h"
#include "List.h"
#include "dlink.h"
template <class Elem>
class DList: public List<Elem>
{
private:
DLink<Elem>* head;
DLink<Elem>* tail;
DLink<Elem>* fence;
int leftcnt;
int rightcnt;
void init()
{
fence = tail = head = new DLink<Elem>;
leftcnt = rightcnt = 0;
}
void removeall()
{
while(head != NULL)
{
fence = head;
head = head->next;
delete fence;
}
}
public:
DList()
{
init();
}
~DList()
{
removeall();
}
void clear()
{
removeall();
init();
}
bool insert(const Elem&);
bool append(const Elem&);
bool remove(Elem&);
void setStart()
{
fence = head;
rightcnt += leftcnt;
leftcnt = 0;
}
void setEnd()
{
fence = tail;
leftcnt += rightcnt;
rightcnt = 0;
}
void prev();
void next()
{
if(fence != tail)
{
fence = fence->next;
rightcnt--;
leftcnt++;
}
}
int leftLength() const
{
return leftcnt;
}
int rightLength() const
{
return rightcnt;
}
bool setPos(int pos);
bool getValue(Elem& it) const
{
if(rightLength() == 0)
{
return false;
}
it = fence->next->element;
return true;
}
void print() const;
};
template<class Elem>
bool DList<Elem>::insert(const Elem& item)
{
fence->next = new DLink<Elem>(item, fence, fence->next);
if(fence->next->next != NULL)
{
fence->next->next->prev = fence->next;
}
if(fence == tail)
{
tail = fence->next;
}
rightcnt++;
leftcnt--;
}
template<class Elem>
bool DList<Elem>::append(const Elem& item)
{
tail = tail->next = new DList<Elem>(item, tail, NULL);
rightcnt++;
return true;
}
template<class Elem>
bool DList<Elem>::remove(Elem& item)
{
if(fence->next = NULL) returen false;
item = fence->next->element;
DLink<Elem>* ltemp = fence->next;
if(ltemp->next != NULL)
{
ltemp->next->prev = fence;
}
else
{
tail = fence;
}
fence->next = ltemp->next;
delete ltemp;
rightcnt--;
return true;
}
template<class Elem>
void DList<Elem>::prev()
{
if(fence != head)
{
fence = fence->prev;
leftcnt--;
rightcnt++;
}
}
template<class Elem>
void DList<Elem>::print() const
{
DLink<Elem>* temp = head;
cout << "< ";
while(temp != fence)
{
cout << temp->next->element << " ";
temp = temp->next;
}
cout << "| ";
while(temp->next != NULL)
{
cout << temp->next->element << " ";
temp = temp->next;
}
cout << ">\n ";
}