循环双链表操作和普通链表操作差异不大,就是判断链表遍历结束条件改变,因为循环双链表的最后一个节点的后继节点是头节点,头节点的前驱节点是最后一个节点,遍历完毕的条件改变,其次断开节点也要考虑其前驱指针和后继指针的指向。
1.头文件
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef char ElemType;
2.初始化循环双链表
typedef struct DLink{
ElemType data;
struct DLink *prior;
struct DLink *next;
}DCLinkNode;
DCLinkNode *p;
p = (DCLinkNode * ) malloc(sizeof(DCLinkNode));
p -> prior = p -> next = NULL;
3.尾插法插入a,b,c,d,e
void CreateDCLink(DCLinkNode * L,ElemType a[],int n){
DCLinkNode *p = L,*q;
for (int i = 0; i < n; ++i) {
q = (DCLinkNode * ) malloc(sizeof(DCLinkNode));
q -> data = a[i];
p -> next = q;
q -> prior = p;
p = q;
}
p -> next = L;
L -> prior = p;
}
4.输出循环双链表
void DisDLink(DCLinkNode * L){
DCLinkNode *p = L -> next;
while (p != L){
printf("%c ",p -> data);
p = p -> next;
}
printf("\n");
}
5.输出循环双链表的长度
int LengthLink(DCLinkNode *L){
DCLinkNode *p = L -> next;
if(p == L){
printf("元素个数位0\n");
return 0;
}
int cnt = 0;
while (p != L){
cnt++;
p = p -> next;
}
printf("元素个数为%d\n",cnt);
return cnt;
}
6.判空
bool EmptyDLink(DCLinkNode * L){
DCLinkNode *p = L -> next;
if(p == L){
printf("链表为空\n");
return false;
} else{
printf("链表不为空\n");
return true;
}
}
7.输出链表的第三个元素
bool GetDLink(DCLinkNode * L,int i,ElemType x){
if(i <= 0){
printf("位置不合法\n");
return false;
}
int j = 0;
DCLinkNode *p = L -> next;
while (j < i - 1 && p != L){
j++; p = p -> next;
}
if(p == L){
printf("位置不合法\n");
return false;
}
x = p -> data;
printf("第%d个元素是%c\n",i,x);
return true;
}
8.输出元素a的位置
bool GETFCLink(DCLinkNode * L,ElemType x){
DCLinkNode *p = L -> next;
int cnt = 1;
while (p != L && p -> data != x){
cnt++;
p = p -> next;
}
if(p == L){
printf("查无此值\n");
return false;
} else{
x = p -> data;
printf("%c在第%d位\n",x,cnt);
return true;
}
}
9.在第4个位置上插入元素f
bool InsertDLink(DCLinkNode * L,int i,ElemType x){
if(i <= 0){
printf("位置不合法\n");
return false;
}
int j = 1;
DCLinkNode *p = L -> next,*q;
while (j < i - 1 && p != L){
j++; p = p -> next;
}
if(p == L){
printf("位置不合法\n");
return false;
} else{
q = (DCLinkNode * ) malloc(sizeof(DCLinkNode));
q -> data = x;
if(p -> next != L)
q -> next = p -> next;
p -> next = q;
q -> prior = p;
printf("%c插入成功\n",x);
return true;
}
}
10.输出链表
11.删除链表的第3个元素
bool DelDCLink(DCLinkNode * L,int i,ElemType x){
if(i <= 0){
printf("位置不合法\n");
return false;
}
int j = 1;
DCLinkNode *p = L -> next,*q;
while (j < i - 1 && p != L){
j++; p = p -> next;
}
if(p == L){
printf("位置不合法\n");
return false;
} else{
q = (DCLinkNode * ) malloc(sizeof (DCLinkNode));
q = p -> next;
x = q -> data;
p -> next = q -> next;
q -> next -> prior = p;
free(q);
printf("%c删除成功\n",x);
return true;
}
}
12.输出链表
13.释放链表
void DestroyDLink(DCLinkNode * L){
DCLinkNode *pre = L,*p = L -> next;
while (p != L){
free(pre);
pre = p;
p = pre -> next;
}
free(pre);
printf("销毁成功\n");
}
14.主函数
int main(){
DCLinkNode *p;
p = (DCLinkNode * ) malloc(sizeof(DCLinkNode));
p -> prior = p -> next = NULL;
ElemType ch[5] = {'a','b','c','d','e'};
CreateDCLink(p,ch,5);
DisDLink(p);
LengthLink(p);
EmptyDLink(p);
ElemType x;
GetDLink(p,3,x);
GETFCLink(p,'a');
InsertDLink(p,4,'f');
DisDLink(p);
DelDCLink(p,3,x);
DisDLink(p);
DestroyDLink(p);
return 0;
}