双链表的结点结构
空的双向链表
first->rlink=NULL; first->llink=NULL; Last=first;
- 设指针p指向双链表中某一结点,则有下式成立:
p->llink->rlink = p = p->rlink->llink
- 插入操作
处理原则:先处理每个方向的 远端指针,再处理近端指针
q->rlink=p->rlink;
q->llink=p;
p->rlink=q;
q->rlink->llink=q;
处理原则:先在正向链表上插入,再在逆向链表上插入
q->rlink=p->rlink;
P->rlink=q;
q->llink=p;
q->rlink->llink=q;
在表尾进行插入时:
q->rlink=p->rlink;
P->rlink=q;
q->llink=p;
if(q->rlink)
q->rlink->llink=q;
- 删除操作
p->llink->rlink=p->rlink;
p->rlink->llink=p->llink;
delete(p);
删除表尾结点:
p->llink->rlink=p->rlink;
if(p->rlink)
p->rlink->llink=p->rlink;
delete(p);
- 双向链表的实现
template <class T>
struct DNode{
T data;
DNode<T> *llink;
DNode <T>*rlink;
};
template <class T>
class DoubleLink {
private:
Node<T> *head;
public:
DoubleLink() ;
~DoubleLink();
void Append(T data);
void Display();
void Insert(int locate , T data);
T Get(int locate);
T Delete(int locate);
};
①空表的构造
template <class T>
DoubleLink <T>::DoubleLink(){
head=new Node<T>;
head->rlink=NULL;
head->llink=NULL;
}
②头插法
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;
}
④析构函数
template <class T>
DoubleLink<T>::~DoubleLink(){
Node<T> *p,*q;
p=head;
while(p)
{
q=p->rlink;
delete p;
p=q;
}
}