双链表
构造前因:
单链表的主要不足之处是:link字段仅仅指向后继结点,不能有效地找到前驱
双链表弥补了上述不足之处增加一个指向前驱的指针
双链表的结点结构:
前驱指针域llink+数据域data+后继指针域rlink
template <class T>
struct DNode{
T data;
DNode<T> *llink;
DNode <T>*rlink;
};
双链表构建空表:
template <class T>
DoubleLink <T>::DoubleLink(){
head=new Node<T>;
head->rlink=NULL;
head->llink=NULL;
}
双链表析构函数:
template <class T>
DoubleLink<T>::~DoubleLink(){
Node<T> *p,*q;
p=head;
while(p)
{
q=p->rlink;
delete p;
p=q;
}
}
双链表头插法:
template <class T>
void DoubleLink<T>::Append(T data){
Node<T> *s;
s=new Node<T>;
s->data=data;
s->rlink=head->rlink;
head->rlink=s;
s->llink=head;
if (s->rlink)
s->rlink->llink=s;
return;
}
双链表遍历:
template <class T>
void DoubleLink<T>::Display(){
Node <T> *p;
p=head->rlink;
while(p) {
cout<<p->data<<" ";
p=p->rlink;
}
cout<<endl;
return;
}
删除p:
p->llink->rlink=p->rlink;
p->rlink->llink=p->rlink;
delete(p);
循环链表
循环链表:将链表的头尾结点链接起来
构建空表:
template <class T>CycleLinkList<T>:: CycleLinkList( ){
first=new Node<T>;
first->next=first; //first的指针指向first 形成循环
}
尾插法构建循环链表只需将尾插法构建单链表最后尾指针指向first
头插法构建循环链表只需将尾插法构建空链表时的初始化单链表的first->next=NULL改为指向first