📅  最后修改于: 2023-12-03 15:14:24.843000             🧑  作者: Mango
循环链表是一种链表,其尾节点指向头节点,形成一个环状结构。本文介绍在C语言中,如何对循环链表进行基本操作。
首先,我们需要定义循环链表中一个节点的结构体。该结构体包含两个成员变量,一个是存储数据的变量,另一个是指向下一个节点的指针。
typedef struct Node{
int data;
struct Node *next;
}Node;
创建循环链表需要定义一个头节点,并将尾节点的指针指向头节点。然后,将新节点插入到尾节点后面即可。
Node* createList(int data){
Node *head = (Node*)malloc(sizeof(Node)); // 创建头节点
Node *node = (Node*)malloc(sizeof(Node)); // 创建新节点
head->next = node; // 将尾节点的指针指向头节点
node->data = data; // 设置新节点的数据
node->next = head; // 将新节点指向头节点,形成循环链表
return head; // 返回头节点
}
在循环链表中插入新节点,需要找到插入的位置,然后将新节点插入到该位置。
Node* insertNode(Node *head, int data, int pos){
Node *node = (Node*)malloc(sizeof(Node)); // 创建新节点
node->data = data; // 设置新节点的数据
int count = 0; // 记录遍历到的节点数
Node *p = head->next; // 从第一个节点开始遍历
while(p && count < pos-1){ // 搜索插入位置
p = p->next;
count++;
}
node->next = p->next; // 将新节点插入到链表中
p->next = node;
return head; // 返回头节点
}
要从循环链表中删除节点,需要找到要删除的节点,并将它的前一个节点的指针指向它的后一个节点。
Node* deleteNode(Node *head, int data){
Node *p = head->next; // 从第一个节点开始遍历
Node *pre = head; // 记录p的前一个节点
while(p != head){ // 搜索需要删除的节点
if(p->data == data){
pre->next = p->next; // 将p的前一个节点指向p的后一个节点
free(p); // 释放p节点
return head; // 返回头节点
}
pre = p;
p = p->next;
}
return head; // 没有找到需要删除的节点
}
要修改循环链表中节点的数据,需要找到该节点,然后将它的data值修改即可。
Node* updateNode(Node *head, int oldData, int newData){
Node *p = head->next; // 从第一个节点开始遍历
while(p != head){ // 搜索需要修改的节点
if(p->data == oldData){
p->data = newData; // 修改节点数据
return head; // 返回头节点
}
p = p->next;
}
return head; // 没有找到需要修改的节点
}
要遍历循环链表,可以使用一个指针从第一个节点开始遍历,直到指针重新指向头节点为止。
void traverseList(Node *head){
Node *p = head->next; // 从第一个节点开始遍历
while(p != head){
printf("%d ", p->data); // 输出节点数据
p = p->next;
}
printf("\n");
}
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int data;
struct Node *next;
}Node;
Node* createList(int data){
Node *head = (Node*)malloc(sizeof(Node)); // 创建头节点
Node *node = (Node*)malloc(sizeof(Node)); // 创建新节点
head->next = node; // 将尾节点的指针指向头节点
node->data = data; // 设置新节点的数据
node->next = head; // 将新节点指向头节点,形成循环链表
return head; // 返回头节点
}
Node* insertNode(Node *head, int data, int pos){
Node *node = (Node*)malloc(sizeof(Node)); // 创建新节点
node->data = data; // 设置新节点的数据
int count = 0; // 记录遍历到的节点数
Node *p = head->next; // 从第一个节点开始遍历
while(p && count < pos-1){ // 搜索插入位置
p = p->next;
count++;
}
node->next = p->next; // 将新节点插入到链表中
p->next = node;
return head; // 返回头节点
}
Node* deleteNode(Node *head, int data){
Node *p = head->next; // 从第一个节点开始遍历
Node *pre = head; // 记录p的前一个节点
while(p != head){ // 搜索需要删除的节点
if(p->data == data){
pre->next = p->next; // 将p的前一个节点指向p的后一个节点
free(p); // 释放p节点
return head; // 返回头节点
}
pre = p;
p = p->next;
}
return head; // 没有找到需要删除的节点
}
Node* updateNode(Node *head, int oldData, int newData){
Node *p = head->next; // 从第一个节点开始遍历
while(p != head){ // 搜索需要修改的节点
if(p->data == oldData){
p->data = newData; // 修改节点数据
return head; // 返回头节点
}
p = p->next;
}
return head; // 没有找到需要修改的节点
}
void traverseList(Node *head){
Node *p = head->next; // 从第一个节点开始遍历
while(p != head){
printf("%d ", p->data); // 输出节点数据
p = p->next;
}
printf("\n");
}
int main(){
Node *head = createList(1);
insertNode(head, 2, 1);
insertNode(head, 3, 2);
traverseList(head);
deleteNode(head, 2);
traverseList(head);
updateNode(head, 3, 4);
traverseList(head);
return 0;
}