下面介绍链式存储结构的单向循环链表。
循环链表的特点
循环链表是另一种形式的链式存储结构。其特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。
由此,从表中任一结点出发均可找到表中其他结点。
循环链表的描述
描述: 数据域+指针域
typedef int datatype;
typedef struct node {
datatype data;//数据域
struct node * next;//保存下一个数据的地址
}slinklist, *slinklist_t;
基本操作
创建空链表
用malloc动态申请空间
slinklist_t createSlinkList()
{
slinklist_t H = (slinklist_t)malloc(sizeof(slinklist));
if(NULL == H)
{
printf("malloc Head node fail\n");
return NULL;
}
H->data = -1;
H->next = H; //只有头结点,自身构成循环
return H;
}
插入:尾插
使用尾插法插入元素
int insertSlinkList(slinklist_t H, datatype x)
{
slinklist_t pnew = NULL, r = NULL;
//1.封装新结点
pnew = (slinklist_t)malloc(sizeof(slinklist));
if(NULL == pnew)
{
printf("insert:malloc pnew node fail\n");
return -1;
}
//2.找尾巴
r = H;
while(r->next != H)
r = r->next;
//3.接入新结点
pnew->data = x;
pnew->next = H;
r->next = pnew;
return 0;
}
输出链表
void showSlinkList(slinklist_t H)
{
slinklist_t p = H->next;
while(p->next != H)
{
printf("%d ", p->data);
p = p->next;
}
printf("%d\n", p->data);
}
单向循环链表操作与单链表大同小异。
测试
//1.创建一个空的单向循环链表
slinklist_t H = createSlinkList();
if(NULL == H)
{
printf("create Slinklist failed\n");
return -1;
}
//2.向表中增加数据
insertSlinkList(H, 10);
insertSlinkList(H, 11);
insertSlinkList(H, 99);
insertSlinkList(H, 1);
insertSlinkList(H, 12);
//3.打印输出
showSlinkList(H);