本博文源于王卓老师的数据结构,旨在用代码实现书上的案例,循环双链表书上给出了插入和删除,插入可以做头插法,删除是一个需要理解记忆的内容,在这里博文给出代码,有需要的读者可以收藏学习。
文章目录
1、循环双链表存储结构
有prior域和next域
typedef struct DuLNode{
ElementType data;
struct DuLNode* prior;
struct DuLNode*next;
}DuLNode,*DuLinkList;
2、初始化循环双链表
初始化就是设置next和prior指向自己
void InitDuList(DuLinkList &L){
L = new DuLNode;
if(!L){
cout << "new failed" << endl;
exit(ERROR);
}
L->next = L->prior = L;
}
3、获得第i元素的值
跟普通的链表循环类似
DuLinkList GetElem_DuL(DuLinkList &L, int i) {
if(L->next == L || i <=0) return L;
DuLinkList p= L->next;
int cnt = 1;
while(p!=L && cnt<i){
p = p->next;
cnt++;
}
return p;
}
4、在第i号位置插入元素e
插入的话,也就是书上源代码,先连两边的线,最后补齐
Status ListInsert_DuL(DuLinkList &L,int i,ElementType e){
DuLinkList p;
if(!(p=GetElem_DuL(L,i)))
return ERROR;
DuLinkList s = new DuLNode;
s->data = e;
s->prior =p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
return OK;
}
5、打印循环双链表
跟循环单链表一样遍历
void Print_DuL(DuLinkList L){
for(DuLinkList p = L->next;p!=L;p=p->next)
cout << p->data << " ";
cout << endl;
}
6、尾插法建立循环双链表
尾插法就是要有一个快慢指针,插入完成赋值给慢指针
void Create_DuL(DuLinkList &L,int A[],int n){
InitDuList(L);
DuLinkList r = L,s;
for(int i =0;i<n;i++){
s= new DuLNode;
s->data = A[i];
s->prior = r;
s->next = r->next;
r->next = s;
r= s;
}
}
7、删除循环双链表指定位置元素
书上源码,这里注意next->prior与prior->next的含义
Status ListDelete_Dul(DuLinkList &L,int i){
DuLinkList p;
if(!(p=GetElem_DuL(L,i)))
return ERROR;
p->prior->next = p->next;
p->next->prior = p->prior;
delete p;
return OK;
}
测试效果
完整源码
#include<iostream>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXSIZE 10
typedef int ElementType;
typedef int Status;
using namespace std;
typedef struct DuLNode{
ElementType data;
struct DuLNode* prior;
struct DuLNode*next;
}DuLNode,*DuLinkList;
void InitDuList(DuLinkList &L){
L = new DuLNode;
if(!L){
cout << "new failed" << endl;
exit(ERROR);
}
L->next = L->prior = L;
}
DuLinkList GetElem_DuL(DuLinkList &L, int i) {
if(L->next == L || i <=0) return L;
DuLinkList p= L->next;
int cnt = 1;
while(p!=L && cnt<i){
p = p->next;
cnt++;
}
return p;
}
Status ListInsert_DuL(DuLinkList &L,int i,ElementType e){
DuLinkList p;
if(!(p=GetElem_DuL(L,i)))
return ERROR;
DuLinkList s = new DuLNode;
s->data = e;
s->prior =p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
return OK;
}
void Print_DuL(DuLinkList L){
for(DuLinkList p = L->next;p!=L;p=p->next)
cout << p->data << " ";
cout << endl;
}
void Create_DuL(DuLinkList &L,int A[],int n){
InitDuList(L);
DuLinkList r = L,s;
for(int i =0;i<n;i++){
s= new DuLNode;
s->data = A[i];
s->prior = r;
s->next = r->next;
r->next = s;
r= s;
}
}
Status ListDelete_Dul(DuLinkList &L,int i){
DuLinkList p;
if(!(p=GetElem_DuL(L,i)))
return ERROR;
p->prior->next = p->next;
p->next->prior = p->prior;
delete p;
return OK;
}
int main(){
DuLinkList L;
InitDuList(L);
for(int i=0;i<5;i++){
ListInsert_DuL(L,1,i+1);
}
cout << "head insert:1 2 3 4 5"<< endl;
Print_DuL(L);
cout << "tail insert:7 2 4 5 6" << endl;
int A[5] ={
7,2,4,5,6};
Create_DuL(L,A,5);
Print_DuL(L);
ListDelete_Dul(L,2);
cout << "Delete pos:2" << endl;
Print_DuL(L);
return 0;
}