在单链表的基础上,只要把尾指针改为指向头结点,则相应的单链表也变成了循环链表(原来的尾指针指向的是NULL)
#include <stdio.h>
#include <stdlib.h>
//循环链表
//循环链表与单链表大体相同,仅仅是单链表的尾指针指向的是NULL,而循环链表指向的是第1个元素
//基本的数据结构还是一样的
#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status;
typedef struct {
ElemType data;
struct Node *next;
}Node,*List;
//1. 链表的初始化
Status InitList(List *L){
*L=(List)malloc(sizeof(Node));
(*L)->next=*L;//尾指针指向头指针
(*L)->data=NULL;
return OK;
}
//2. 判断链表是否为空
Status IsEmpty(List L){
//若为空,返回TRUE
// 如果尾指针指向头指针,则为空
if(L->next==L){
return TRUE;
}else{
return FALSE;
}
}
//3. 链表的整表创建
Status CreateList(List *L,int n){
//创建长度为n的循环链表
int i;
List p;
srand(time(0));
for(i=0;i<n;i++){
p=(List)malloc(sizeof(Node));
p->data=rand()%100+1;
p->next=(*L)->next;
(*L)->next=p;
}
return OK;
}
int main()
{
List L,T;
if(OK==InitList(&L)){
printf("初始化成功\n");
}
if(TRUE==IsEmpty(L)){
printf("链表为空!\n");
}else{
printf("链表不为空!\n");
}
printf("输入初始化循环链表的长度:");
int i,n;
scanf("%d",&n);
if(OK==CreateList(&L,n)){
//循环输出3倍长度的链表值(循环链表可以无限循环输出下去,因为是环)
T=L;
for(i=0;i<3*n;i++){
printf("%d\t",T->data);
T=T->next;
}
}
return 0;
}