今天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; }
原文:http://blog.csdn.net/achelloworld/article/details/22918025