以下是使用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 insertNode(Node** head, int data) {
Node* newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
return;
}
if (data < (*head)->data) {
newNode->next = *head;
(*head)->prev = newNode;
*head = newNode;
return;
}
Node* curr = *head;
while (curr->next != NULL && data > curr->next->data) {
curr = curr->next;
}
newNode->next = curr->next;
if (curr->next != NULL) {
curr->next->prev = newNode;
}
curr->next = newNode;
newNode->prev = curr;
}
void deleteNode(Node** head, int data) {
if (*head == NULL) {
printf("链表为空!\n");
return;
}
if ((*head)->data == data) {
Node* temp = *head;
*head = (*head)->next;
if (*head != NULL) {
(*head)->prev = NULL;
}
free(temp);
return;
}
Node* curr = *head;
while (curr != NULL && curr->data != data) {
curr = curr->next;
}
if (curr == NULL) {
printf("找不到要删除的节点!\n");
return;
}
Node* prevNode = curr->prev;
prevNode->next = curr->next;
if (curr->next != NULL) {
curr->next->prev = prevNode;
}
free(curr);
}
void printList(Node* head) {
Node* curr = head;
while (curr != NULL) {
printf("%d ", curr->data);
curr = curr->next;
}
printf("\n");
}
int main() {
Node* head = NULL;
// 创建1到10的双向链表
for (int i = 1; i <= 10; i++) {
insertNode(&head, i);
}
printf("原始链表:");
printList(head);
// 删除节点5
deleteNode(&head, 5);
printf("删除节点5后的链表:");
printList(head);
// 删除节点1
deleteNode(&head, 1);
printf("删除节点1后的链表:");
printList(head);
// 插入节点8
insertNode(&head, 8);
printf("插入节点8后的链表:");
printList(head);
// 插入节点6
insertNode(&head, 6);
printf("插入节点6后的链表:");
printList(head);
// 插入节点4
insertNode(&head, 4);
printf("插入节点4后的链表:");
printList(head);
// 插入节点2
insertNode(&head, 2);
printf("插入节点2后的链表:");
printList(head);
return 0;
}
在上述代码中,我们首先定义了一个双向链表的结构体 `Node`,包含一个数据域 `data`,以及两个指针域 `prev` 和 `next` 分别指向前一个节点和后一个节点。然后,我们实现了创建节点、插入节点、删除节点和打印链表的函数。
在 `main` 函数中,我们先创建了一个包含1到10的双向链表。然后,删除了节点5和节点1,插入了节点8、6、4和2。最后,分别打印链表的输出结果。此代码是将节点删除插入的方式进行操作,并且插入时顺序输出。