用C语言实现循环双向链表的新增插入和删除操作
循环双向链表的定义如下:
typedef struct node {
int data; // 数据域
struct node *prev; // 前驱指针
struct node *next; // 后继指针
} Node, *LinkedList;
其中,LinkedList 表示链表的头指针,指向链表的第一个结点。链表的最后一个结点的 next 指针指向头结点,头结点的 prev 指针指向链表的最后一个结点。
循环双向链表的新增操作可以实现如下:
// 在链表尾部插入一个新结点
void insertNode(LinkedList list, int data) {
Node *newNode = (Node *) malloc(sizeof(Node));
newNode->data = data;
newNode->prev = list->prev;
newNode->next = list;
list->prev->next = newNode;
list->prev = newNode;
}
// 创建一个新的循环双向链表
LinkedList createList() {
LinkedList list = (LinkedList) malloc(sizeof(Node));
list->data = 0;
list->prev = list;
list->next = list;
return list;
}
其中,createList 函数创建一个新的链表,并返回链表的头指针。insertNode 函数在链表的尾部插入一个新结点,其中 list->prev 表示链表的最后一个结点。
循环双向链表的删除操作可以实现如下:
// 删除链表中第一个值为 data 的结点
void deleteNode(LinkedList list, int data) {
Node *p = list->next;
while (p != list && p->data != data) {
p = p->next;
}
if (p == list) {
printf("Not found!\n");
return;
}
p->prev->next = p->next;
p->next->prev = p->prev;
free(p);
}
其中,deleteNode 函数用于删除链表中第一个值为 data 的结点。首先从头结点开始遍历链表,找到第一个值为 data 的结点。如果不存在这样的结点,则输出提示信息并返回。否则,将该结点从链表中删除,并释放空间。
循环双向链表的插入操作可以实现如下:
// 在链表中第一个值为 data 的结点后面插入一个新结点
void insertAfter(LinkedList list, int data, int newData) {
Node *p = list->next;
while (p != list && p->data != data) {
p = p->next;
}
if (p == list) {
printf("Not found!\n");
return;
}
Node *newNode = (Node *) malloc(sizeof(Node));
newNode->data = newData;
newNode->prev = p;
newNode->next = p->next;
p->next->prev = newNode;
p->next = newNode;
}
其中,insertAfter 函数用于在链表中第一个值为 data 的结点后面插入一个新结点。首先从头结点开始遍历链表,找到第一个值为 data 的结点。如果不存在这样的结点,则输出提示信息并返回。否则,在该结点后面插入一个新结点,并更新指针
原文地址: https://www.cveoy.top/t/topic/fTpM 著作权归作者所有。请勿转载和采集!