概述
单向循环链表里面的每一个节点的next都要有指向,最后一个节点的next指向head节点
单向循环链表跟普通的单链表的操作逻辑几乎—模一样,唯一的区别,结尾的判断,区别如下
建议学完单向非循环链表,再来对比
(本人先是在掘金上编辑的,然后复制粘贴自己的博客,所以图片都有掘金的水印,欢迎来我的掘金博客查看原文)
示例代码
//单向循环链表
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node *next;
}listnode, *singly_list;
//typedef struct Node listnode;
//typedef struct Node *singly_list;
//初始化链表
singly_list init_list(void)
{
//为链表申请一个节点作为头结点
singly_list head = malloc(sizeof(listnode));
if (head != NULL)
{
head->next = head;
}
return head;
}
//判断空链表
bool empty(singly_list head)
{
return head->next == head;
}
//新建节点
singly_list create_node(DataType data)
{
singly_list new = malloc(sizeof(listnode));
if (new != NULL)
{
new->data = data;
new->next = NULL;
}
return new;
}
//插入节点(尾插)
void insert_node(singly_list head, singly_list new)
{
//如果不为空,就要找到链表的最后一个节点
singly_list p = head;
//如果下一个节点不为空,就一直往后找,直到这个节点的next为空
while(p->next != head)
{
p = p->next;
}
new->next = head;
p->next = new;
}
//插入节点(头插)
void tail_node(singly_list head, singly_list new)
{
new->next = head->next