循环链表是一种特殊的链表结构,其尾部节点指向链表的头部节点,形成一个闭环。这种链表常用于环形缓冲区、循环队列等场景。以下是一个简单的循环链表的示例:
创建一个节点结构体:
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* next;
};
创建一个节点并赋值:
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
if (newNode != NULL) {
newNode->data = data;
newNode->next = NULL;
}
return newNode;
}
插入节点:
void insertNode(struct Node** head, int data) {
struct Node* newNode = createNode(data);
//刚开始未有节点
if (*head == NULL) {
*head = newNode;
newNode->next = head;
}
else { //已有节点存在
struct Node temp = *head;
//一直在轮询,直到找到指向头的节点,然后插入,把指向头的地址给新插入的节点;
while (temp->next != *head) {
temp = temp->next;
}
temp->next = newNode; //找到这个是指向头的节点了,链接新插入节点
newNode->next = *head; //把头地址给新节点,相当于单链表头尾相连
}
}
void displayList(struct Node* head) {
if (head == NULL) {
printf(“List is empty.\n”);
return;
}
struct Node* temp = head;
do {
printf("%d -> ", temp->data);
temp = temp->next;
} while (temp != head);
printf(" (Back to Head)\n");
}
int main() {
struct Node* head = NULL;
// 插入节点到循环链表
insertNode(&head, 1);
insertNode(&head, 2);
insertNode(&head, 3);
// 显示循环链表
displayList(head);
return 0;
}
这个示例中的循环链表由结构体 Node 表示,每个节点包含一个整数数据和一个指向下一个节点的指针。insertNode 函数用于向循环链表中插入新节点,displayList 函数用于显示循环链表的内容。
循环链表的特点是,最后一个节点的 next 指针指向链表的头部节点。这使得遍历链表时,可以从任何节点开始,并在回到头部节点后停止。并且这个头部节点是第一个传进来的作为头部节点,后续都默认是这个节点为头就是。