1.头文件
#include
#include
#include
typedef char ElemType;
2.初始化循环单链表
typedef struct DNode{
ElemType data;
struct DNode *next;
}LinkNode;
LinkNode *p;
p = (LinkNode * ) malloc(sizeof(LinkNode));
p -> next = NULL;
3.尾插法插入元素a,b,c,d,e,和普通链表实现差别不大,就是让最后一个节点的后继节点指向头节点,循环往复,可以实现对一个节点的多次访问。
void CreateCLink(LinkNode * L,ElemType a[],int n){
LinkNode *p = L,*q;
for (int i = 0; i < n; ++i) {
q = (LinkNode * ) malloc(sizeof(LinkNode));
q -> data = a[i];
p -> next = q;
p = q;
}
p -> next = L;
}
4.输出循环单链表
void DisCLink(LinkNode *L){
LinkNode *p = L -> next;
if(p == L){
printf("链表为空\n");
return;
}
while (p != L){
printf("%c ",p -> data);
p = p -> next;
}
printf("\n");
return;
}
5.输出循环单链表长度
int LengthCLink(LinkNode * L){
LinkNode *p = L -> next;
int cnt = 0;
if(p == L){
printf("循环链表为空\n");
return 0;
}
while (p != L){
cnt++;
p = p -> next;
}
printf("链表有%d个元素\n",cnt);
return cnt;
}
6.判空
bool EmptyLink(LinkNode * L){
LinkNode *p = L -> next;
if(p == L){
printf("链表为空\n");
return false;
} else{
printf("链表不为空\n");
return true;
}
}
7.输出循环单链表第3个元素
bool GetCLink(LinkNode * L,int i,ElemType x){
if(i <= 0){
printf("位置不合法\n");
return false;
}
int j = 0;
LinkNode *p = L -> next;
while (j < i - 1 && p != L){
j++; p = p -> next;
}
x = p -> data;
printf("第%d位是%c\n",i,x);
return true;
}
8.输出元素a的位置
bool GetCFLink(LinkNode * L,ElemType x){
LinkNode *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);
}
}
9.在第4个位置上插入元素f
bool InsertCLink(LinkNode * L,int i,ElemType x){
if(i <= 0){
printf("位置不合法\n");
return false;
}
int j = 1;
LinkNode *p = L -> next,*q;
while (j < i - 1 && p != L){
j++; p = p -> next;
}
if(p == L){
printf("位置不合法\n");
return false;
} else{
q = (LinkNode * ) malloc(sizeof(LinkNode));
q -> data = x;
if(p -> next != L)
q -> next = p -> next;
p -> next = q;
printf("%c插入成功\n",x);
return true;
}
}
10.输出循环单链表
11.删除第3个元素
bool DelCLink(LinkNode * L,int i,ElemType x){
if(i <= 0){
printf("位置不合法\n");
return false;
}
int j = 1;
LinkNode *p = L -> next,*q;
while (j < i - 1 && p != L){
j++; p = p -> next;
}
if(p == L){
printf("位置不合法\n");
return false;
} else{
q = (LinkNode * ) malloc(sizeof(LinkNode));
q = p -> next;
x = q -> data;
if(q -> next != L)
p -> next = q -> next;
free(q);
printf("%c删除成功\n",x);
return true;
}
}
12输出循环单链表
13.释放循环单链表
void DestroyCLink(LinkNode * L){
LinkNode *pre = L,*p = L -> next;
while (p != L){
free(pre);
pre = p;
p = pre -> next;
}
free(pre);
printf("销毁成功\n");
}
14.主函数
int main(){
LinkNode *p;
p = (LinkNode * ) malloc(sizeof(LinkNode));
p -> next = NULL;
ElemType ch[5] = {'a','b','c','d','e'};
CreateCLink(p,ch,5);
DisCLink(p);
LengthCLink(p);
EmptyLink(p);
ElemType x;
GetCLink(p,3,x);
GetCFLink(p,'a');
InsertCLink(p,4,'f');
DisCLink(p);
DelCLink(p,3,x);
DisCLink(p);
DestroyCLink(p);
return 0;
}