好的,以下是用C语言实现双向循环链表的代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct Node {
int data;
struct Node *prev;
struct Node *next;
} Node;
typedef struct List {
Node *head;
Node *tail;
} List;
List* createList() {
List *list = (List*) malloc(sizeof(List));
list->head = NULL;
list->tail = NULL;
return list;
}
void insertAtHead(List *list, int data) {
Node *newNode = (Node*) malloc(sizeof(Node));
newNode->data = data;
newNode->prev = NULL;
newNode->next = list->head;
if (list->head != NULL) {
list->head->prev = newNode;
}
list->head = newNode;
if (list->tail == NULL) {
list->tail = newNode;
}
}
void insertAtTail(List *list, int data) {
Node *newNode = (Node*) malloc(sizeof(Node));
newNode->data = data;
newNode->prev = list->tail;
newNode->next = NULL;
if (list->tail != NULL) {
list->tail->next = newNode;
}
list->tail = newNode;
if (list->head == NULL) {
list->head = newNode;
}
}
void deleteAtHead(List *list) {
Node *temp = list->head;
list->head = temp->next;
if (list->head != NULL) {
list->head->prev = NULL;
}
free(temp);
}
void deleteAtTail(List *list) {
Node *temp = list->tail;
list->tail = temp->prev;
if (list->tail != NULL) {
list->tail->next = NULL;
}
free(temp);
}
void printList(List *list) {
Node *temp = list->head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
int main() {
List *list = createList();
insertAtHead(list, 1);
insertAtHead(list, 2);
insertAtTail(list, 3);
insertAtTail(list, 4);
printList(list); // 输出:2 1 4 3
deleteAtHead(list);
printList(list); // 输出:1 4 3
deleteAtTail(list);
printList(list); // 输出:1 4
return 0;
}
以上代码中,我们定义了一个 Node
结构体来表示链表中的节点,包含一个整型数据域 data
和两个指向前后节点的指针 prev
和 next
。然后定义了一个 List
结构体来表示整个链表,包含一个头节点指针 head
和一个尾节点指针 tail
。
接下来,我们实现了几个基本的操作函数,包括创建链表、在链表头部插入节点、在链表尾部插入节点、删除链表头部节点和删除链表尾部节点。最后,我们还实现了一个打印链表的函数,用于输出链表中所有节点的值。
在主函数中,我们首先创建了一个空链表,然后在链表头部插入了两个节点,在链表尾部插入了两个节点。接着,我们打印了整个链表,然后删除了链表头部的节点和尾部的节点,并再次打印了链表。