循环链表是一种首尾相连的单链表,它允许从任意节点开始遍历整个链表。以下是使用C语言实现循环链表的基本步骤和示例代码:
1. 定义链表节点结构体
首先,定义一个链表节点的结构体,包含数据和指向下一个节点的指针。
```c
typedef struct Node {
int data;
struct Node *next;
} Node;
```
2. 创建新节点
创建一个新节点的函数,分配内存并初始化数据和指针。
```c
Node* createNode(int data) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
```
3. 初始化循环链表
初始化循环链表时,将头节点的`next`指针指向尾节点,并将尾节点的`next`指针指向头节点。
```c
void initList(Node head) {
Node *newNode = createNode(0); // 创建一个哑节点作为头节点
if (*head == NULL) {
*head = newNode;
newNode->next = *head; // 头节点指向自身,形成循环
} else {
Node *temp = *head;
while (temp->next != *head) {
temp = temp->next;
}
temp->next = newNode;
newNode->next = *head;
}
}
```
4. 插入节点到循环链表尾部
将新节点插入到循环链表的尾部。
```c
void insertNode(Node head, int data) {
Node *newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
newNode->next = *head;
} else {
Node *temp = *head;
while (temp->next != *head) {
temp = temp->next;
}
temp->next = newNode;
newNode->next = *head;
}
}
```
5. 打印循环链表
遍历循环链表并打印每个节点的数据。
```c
void printList(Node *head) {
if (head == NULL) {
printf("List is empty.\n");
return;
}
Node *temp = head;
do {
printf("%d ", temp->data);
temp = temp->next;
} while (temp != head);
printf("\n");
}
```
6. 释放循环链表内存
在释放循环链表内存时,需要特别小心,因为头节点和尾节点是相互关联的。
```c
void deleteList(Node head) {
if (*head == NULL) {
return;
}
Node *temp = *head;
do {
Node *nextNode = temp->next;
free(temp);
temp = nextNode;
} while (temp != *head);
*head = NULL;
}
```
示例使用