单循环链表的结构体

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单循环链表的结构体
在计算机科学中,链表是一种常见的数据结构,用于存储和操作数据。

链表由一系列的节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。

链表中的节点可以按任意顺序存储,并且可以轻松插入和删除节点,而无需移动其他节点。

而在链表的基础上,还有一种特殊的链表结构,即单循环链表。

单循环链表与普通链表相似,唯一的区别在于最后一个节点的指针不为NULL,而是指向链表的起始
节点,形成一个循环。

这意味着可以从任意一个节点开始遍历整个链表。

结构体定义
为了在编程中表示和操作单循环链表,我们可以使用结构体来定义链表的节点。

结构体是一种用户自定义的数据类型,它可以包含不同类型的数据,并可以按需定义各种操作。

下面是一个使用C语言定义单循环链表结构体的示例:
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
typedef struct CircularLinkedList {
ListNode* head;
} CircularLinkedList;
在上面的示例中,我们定义了两个结构体,分别是ListNode和CircularLinkedList。

ListNode结构体表示链表的一个节点,其中data字段用于存储节点的数据,next
字段是指向下一个节点的指针。

CircularLinkedList结构体表示整个单循环链表,其中head字段指向链表的起始节点。

操作函数
为了操作单循环链表,我们需要定义一些函数来实现常见的操作,如插入、删除和遍历节点。

下面是一些常用的操作函数的示例:
创建链表
CircularLinkedList* createCircularLinkedList() {
CircularLinkedList* list = (CircularLinkedList*)malloc(sizeof(CircularLink edList));
list->head = NULL;
return list;
}
上述代码创建了一个空的单循环链表,并返回指向链表的指针。

插入节点
void insertNode(CircularLinkedList* list, int data) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->data = data;
if (list->head == NULL) {
list->head = newNode;
newNode->next = newNode;
} else {
ListNode* curr = list->head;
while (curr->next != list->head) {
curr = curr->next;
}
curr->next = newNode;
newNode->next = list->head;
}
}
上述代码插入一个新节点到单循环链表中。

如果链表为空,直接将该节点作为头节点,并使其指向自己形成循环。

否则,找到最后一个节点,将其next指针指向新节点,并使新节点的next指向头节点。

删除节点
void deleteNode(CircularLinkedList* list, int data) {
if (list->head == NULL) {
return;
}
if (list->head->data == data) {
ListNode* curr = list->head;
while (curr->next != list->head) {
curr = curr->next;
}
curr->next = list->head->next;
free(list->head);
list->head = curr->next;
return;
}
ListNode* curr = list->head;
ListNode* prev = NULL;
while (curr->next != list->head) {
if (curr->data == data) {
prev->next = curr->next;
free(curr);
return;
}
prev = curr;
curr = curr->next;
}
if (curr->data == data) {
prev->next = curr->next;
free(curr);
}
}
上述代码从单循环链表中删除指定数据的节点。

首先检查链表是否为空,如果是则直接返回。

然后,检查头节点是否包含指定数据,如果是,则找到最后一个节点,将其next指针指向头节点的下一个节点,并删除头节点。

否则,则遍历链表,找
到包含指定数据的节点,将其前一个节点的next指针指向当前节点的下一个节点,并删除当前节点。

遍历节点
void traverse(CircularLinkedList* list) {
if (list->head == NULL) {
return;
}
ListNode* curr = list->head;
do {
printf("%d ", curr->data);
curr = curr->next;
} while (curr != list->head);
printf("\n");
}
上述代码遍历并打印单循环链表中的所有节点的数据。

首先检查链表是否为空,如果是则直接返回。

然后,从头节点开始,逐个打印节点的数据,直到回到头节点。

示例
下面是一个使用单循环链表结构体实现的示例:
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
typedef struct CircularLinkedList {
ListNode* head;
} CircularLinkedList;
CircularLinkedList* createCircularLinkedList() {
CircularLinkedList* list = (CircularLinkedList*)malloc(sizeof(CircularLink edList));
list->head = NULL;
return list;
}
void insertNode(CircularLinkedList* list, int data) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->data = data;
if (list->head == NULL) {
list->head = newNode;
newNode->next = newNode;
} else {
ListNode* curr = list->head;
while (curr->next != list->head) {
curr = curr->next;
}
curr->next = newNode;
newNode->next = list->head;
}
}
void deleteNode(CircularLinkedList* list, int data) { if (list->head == NULL) {
return;
}
if (list->head->data == data) {
ListNode* curr = list->head;
while (curr->next != list->head) {
curr = curr->next;
}
curr->next = list->head->next;
free(list->head);
list->head = curr->next;
return;
}
ListNode* curr = list->head;
ListNode* prev = NULL;
while (curr->next != list->head) {
if (curr->data == data) {
prev->next = curr->next;
free(curr);
return;
}
prev = curr;
curr = curr->next;
}
if (curr->data == data) {
prev->next = curr->next;
free(curr);
}
}
void traverse(CircularLinkedList* list) {
if (list->head == NULL) {
return;
}
ListNode* curr = list->head;
do {
printf("%d ", curr->data);
curr = curr->next;
} while (curr != list->head);
printf("\n");
}
int main() {
CircularLinkedList* list = createCircularLinkedList();
insertNode(list, 1);
insertNode(list, 2);
insertNode(list, 3);
insertNode(list, 4);
printf("Initial List: ");
traverse(list);
deleteNode(list, 2);
printf("After Deleting 2: ");
traverse(list);
deleteNode(list, 1);
printf("After Deleting 1: ");
traverse(list);
return 0;
}
上述示例演示了如何使用单循环链表结构体实现插入和删除节点,并打印出链表的内容。

总结
通过使用结构体和相关操作函数,我们可以非常方便地实现单循环链表的创建、插入、删除和遍历操作。

使用单循环链表可以在一定程度上简化某些问题的解决方案,
例如旅行商问题(TSP)的近似解法等。

因此,在编程中灵活运用单循环链表结构体是非常有益的。

相关文档
最新文档