今天Mayuyu要讲的是循环双向链表,其实循环双向链表对于单向链表来说,对于链表的遍历更方便了,既可以向前
遍历,又可以向后遍历,缺点是占用空间比单向链表大。
现在Mayuyu来带领你们一步一步实现循环双向链表的基本操作。
(1)初始化循环双向链表
同单向链表一样,循环双向链表同样有一个头节点,它的每一个节点包含3个域,即prior,val,next,分
别指当前节点的前驱,值和后继,开始循环双向链表只有一个head节点,它的前驱和后继都指向自己。如图:
代码如下:
void Create()
{
head = new DList();
head->prior = head;
head->next = head;
p = head;
}
(2)元素的插入操作
如图,插入元素q,指针修改情况如下
指针修改完毕后,再把p指针移动到q指针位置就行了,因为我们始终在p指针和head指针之间插入元素。
代码如下:
void Insert(int x)
{
q = new DList();
q->val = x;
p->next = q;
q->prior = p;
q->next = head;
head->prior = q;
p = q;
}
嗯,挺好理解吧?Mayuyu讲到这里,相信你能完成更多的操作,比如元素查找等等。
完整代码:
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
struct DList
{
int val;
DList *prior;
DList *next;
};
DList *head,*p,*q;
void Create()
{
head = new DList();
head->prior = head;
head->next = head;
p = head;
}
void Insert(int x)
{
q = new DList();
q->val = x;
p->next = q;
q->prior = p;
q->next = head;
head->prior = q;
p = q;
}
void Print()
{
DList *p = head;
p = p->next;
while(p != head)
{
printf("%d ",p->val);
p = p->next;
}
}
int main()
{
int n;
Create();
cin>>n;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
Insert(x);
}
Print();
return 0;
}