使用C语言实现循环双链表的基本操作

#include <stdio.h>
#include <stdlib.h>

// 双向链表结点结构
typedef struct Node {
int data;
struct Node* prev;
struct Node* next;
} Node;

// 新建结点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("内存分配失败!\n");
exit(1);
}
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL;
return newNode;
}

// 插入结点到头部
void insertAtHead(Node** head, int data) {
Node* newNode = createNode(data);
if (*head == NULL) {
// 如果链表为空
newNode->next = newNode;
newNode->prev = newNode;
} else {
// 如果链表不为空
newNode->next = *head;
newNode->prev = (*head)->prev;
(*head)->prev->next = newNode;
(*head)->prev = newNode;
}
*head = newNode;
}

// 插入结点到尾部
void insertAtTail(Node** head, int data) {
Node* newNode = createNode(data);
if (*head == NULL) {
// 如果链表为空
newNode->next = newNode;
newNode->prev = newNode;
*head = newNode;
} else {
// 如果链表不为空
newNode->next = *head;
newNode->prev = (*head)->prev;
(*head)->prev->next = newNode;
(*head)->prev = newNode;
}
}

// 删除头部结点
void deleteAtHead(Node** head) {
if (*head == NULL) {
printf("链表为空!无法删除。\n");
return;
}
Node* temp = *head;
if ((*head)->next == *head) {
// 只有一个结点的情况
*head = NULL;
} else {
*head = (*head)->next;
(*head)->prev = temp->prev;
temp->prev->next = *head;
}
free(temp);
}

// 删除尾部结点
void deleteAtTail(Node** head) {
if (*head == NULL) {
printf("链表为空!无法删除。\n");
return;
}
Node* temp = (*head)->prev;
if ((*head)->next == *head) {
// 只有一个结点的情况
*head = NULL;
} else {
temp->prev->next = *head;
(*head)->prev = temp->prev;
}
free(temp);
}

// 打印链表
void printList(Node* head) {
if (head == NULL) {
printf("链表为空!\n");
return;
}
Node* curr = head;
printf("链表内容:");
do {
printf("%d ", curr->data);
curr = curr->next;
} while (curr != head);
printf("\n");
}

// 测试主函数
int main() {
Node* head = NULL;

// 插入结点到头部
insertAtHead(&head, 1);
insertAtHead(&head, 2);
insertAtHead(&head, 3);
printList(head); // 输出:链表内容:3 2 1

// 插入结点到尾部
insertAtTail(&head, 4);
insertAtTail(&head, 5);
insertAtTail(&head, 6);
printList(head); // 输出:链表内容:3 2 1 4 5 6

// 删除头部结点
deleteAtHead(&head);
printList(head); // 输出:链表内容:2 1 4 5 6

// 删除尾部结点
deleteAtTail(&head);
printList(head); // 输出:链表内容:2 1 4 5

return 0;
}

posted @ 2023-07-03 23:07  nullIsland01  阅读(38)  评论(0)    收藏  举报