1.双链表结点的实现:
template <typename E> class Link {
private:
static Link<E>* freelist;
public:
E element;//value for this node
Link* next;
Link* prev;
Link(const E& it,Link* prevp,Link* nextp){
element=it;
prev=prevp;
next=nextp;
}
Link(Link* prevp=NULL,link* nextp=NULL){
prev=prevp;
next=nextp;
}
void* operator new(size_t){
if(freelist==NULL) return ::new Link;//create space
Link<E>* temp=freelist;
freelist=freelist->next;
return temp;
}
void operator delete(void* ptr){
((Link<E>*)ptr)->next=freelist;
freelist=(Link<E>*)ptr;
}
};
template <typename E>
Link<E>* Link<E>::freelist=NULL;
2.双链表的insert,append,remove,和prev操作的实现:
void insert(const &E it){
curr->next=curr->next->prev=new Link<E>(it,curr,curr->next);
cnt++;
}
void append(const E& it){
tail->prev=tail->prev->next=new Link<E>(it,tail->prev,tail);
cnt++;
}
E remove(){
if(curr->next==tail) return NULL;
E it=curr->next->element;
Link<E>* ltemp=curr->next;
curr->next->next->prev=curr;
curr->next=curr->next->next;
delete ltemp;
cnt--;
return it;
}
void prev(){
if(curr!=head)
curr=curr->prev;
}
双链表比单链表使用了更多的空间。它的结构性开销是单链表的两倍。