```
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <malloc.h>
/*
双链表:每一个节点有两个指针域
循环链表:能通过任何一个节点能找到其他所有的节点
将单链表中终端结点的指针端由空指针改为指向头结点, 就使整个
单链表形成一个环, 这种头尾相接的单链表称为单循环链表, 简称循环链表
其实循环链表和单链表的主要差异就在于循环的判断条件上, 原来是判断p->next
是否为空, 现在则是p -> next不等于头结点,则循环未结束。
*/
typedef struct Noode
{
int data;//数据域
struct Node * pNext;//指针域
} NODE,*PNODE; //struct Noode,struct Noode *
PNODE create_list();//创建循环链表
void traverse_list(PNODE pHead);//遍历
bool is_empty(PNODE pHead);//链表是否为空
int main()
{
PNODE pHead = NULL;
pHead = create_list();//创建一个循环链表
if(is_empty(pHead))
{
printf("链表为空!\n");
}
else
{
printf("链表不为空!\n");
}
traverse_list(pHead);
return 0;
}
PNODE create_list()
{
int len=0;//有效节点的个数
int i;
int val;//用来存放用户输入的节点的值
//1.分配了一个链表所需的头结点
PNODE pHead = (PNODE)malloc(sizeof(NODE));
//判断头结点是否分配了空间
if(NULL == pHead)
{
printf("分配失败,程序终止!\n");
exit(-1);
}
//使pTail永远指向尾节点
PNODE pTail = pHead;
pTail->pNext=NULL;
//需要多少了节点
printf("需要生成的链表节点的个数:len = ");
scanf("%d",&len);
//循环输入各节点的data,形成链表
for(i=0; i<len; i++)
{
printf("请输入第%d个节点的值:",i+1);
scanf("%d",&val);
//生成一个新的节点,存放data,连接链表
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(NULL == pNew)
{
printf("分配失败,程序终止!\n");
exit(-1);
}
pNew->data=val;
pTail->pNext = pNew;
pNew->pNext=pHead;//最后的指针指向头结点
pTail=pNew;
}
return pHead;
}
void traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext;
while(p!=pHead)
{
printf("%d ",p->data);
p = p->pNext;
}
printf("\n");
}
bool is_empty(PNODE pHead)
{
if(pHead->pNext==NULL)
{
return true;
}
else
{
return false;
}
}
```