链表

template <class Elem> 
//单链表
class Link

{
public:
Elem element;
Link *next;
Link(const Elem& elemval,link *nextval=NULL)
{
element=elemval; next=nextval;
}
Link(Link * nextval=NULL)
{
next=nextval;
}
};
template <class Elem>
class LList:public List<Elem>
{
private:
Link<Elem>* head;
Link<Elem>* tail;
Link<Elem>* fence;
int leftcnt;
int rightcnt;
void init()
{
fence=tail=head=new Link<Elem>;
leftcnt=rightcnt=0;
}
void removeall()
{
while(head!=NULL)
{
fence=head;
head=head->next;
delete fence;
}
}
public:
LList(int size=DefaultListSize)
{
init();
}
~LList()
{
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 LList<Elem>::insert(const Elem& item)
{
fence->next=new Link<Elem>(item,fence->next);
if(tail==fence) tail=fence->next;
rightcnt++;
return true;
}

template <class Elem>
bool LList<Elem>::append(const Elem& item)
{
tail=tail->next=new Link<Elem>(item,NULL);
rightcnt++;
return true;
}

template <class Elem>
bool LList<Elem>::remove(Elem & it)
{
if(fence->next==NULL) return false;
it=fence->next->element;
Link<Elem> *ltemp=fence->next;
fence->next=ltemp->next;
if(tail==ltemp) tail=fence;
delete ltemp;
rightcnt--;
return true;
}

template <class Elem>
void LList<Elem>::prev()
{
Link<Elem> * temp=head;
if(fence==head) return;
while(temp->next!=fence) temp=temp->next;
fence=temp;
leftcnt--;rightcnt++;
}

template <class Elem>
bool LList<Elem>::setPos(int pos)
{
if((pos<0)||(pos>rightcnt+leftcnt)) return false;
fence=head;
for(int i=0;i<pos;i++)
fence=fence->next;
return true;
}
template <class Elem>
void LList<Elem>::print() const
{
Link<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";
}


template <class Elem>
class DLink //双链表的节点表达类
{

private:
static DLink<Elem> *freelist;
public:
Elem element;
DLink *next;
DLink *prev;
link(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;
DLink<Elem> *temp=freelist;
freelist=freelist->next;
return temp;
}

template<class Elem>
void DLink<Elem>::operator delete(void *ptr)
{
((DLink<Elem>*)ptr)->next=freelist;
freelist(Link<Elem>*ptr);
}


//双链表中某些函数的实现
template <class Elem>

class DList:public list<Elem>
{
private:
DLink<Elem> *head;
DLink<Elem> *tail;
DLink<Elem> *fence;
int leftcnt;
int rightcnt;
public:
bool insert(const Elem&);
bool append(const Elem&);
bool remove(Elem&);
void prev();
};

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(tail==fence)
tail=fence->next;
rightcnt++;
return true;
}

template <class Elem>
bool DList<Elem>::append(const Elem& item)
{
tail=tail->next=new DLink<Elem>(item,tail,NULL);
rightcnt++;
return true;
}

template <class Elem>
bool DList<Elem>::remove(Elem& it)
{
if(fence->next==NULL)
return false;
it=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++;
}
}
posted @ 2012-02-16 18:52  苍术厚朴  阅读(345)  评论(0编辑  收藏  举报