用c语言编写双链表的前插入、后插入、删除的代码
时间: 2024-02-07 12:03:35 浏览: 65
以下是使用 C 语言实现双向链表的前插入、后插入和删除的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 双向链表节点结构体
typedef struct node {
int data;
struct node* prev;
struct node* next;
} Node;
// 在双向链表的头部插入节点
Node* insertAtFront(Node* head, int data) {
// 创建一个新节点
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->prev = NULL;
// 如果链表为空,将新节点作为头节点
if (head == NULL) {
newNode->next = NULL;
head = newNode;
}
// 否则,在头节点之前插入新节点
else {
newNode->next = head;
head->prev = newNode;
head = newNode;
}
return head;
}
// 在双向链表的尾部插入节点
Node* insertAtEnd(Node* head, int data) {
// 创建一个新节点
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
// 如果链表为空,将新节点作为头节点
if (head == NULL) {
newNode->prev = NULL;
head = newNode;
}
// 否则,在尾节点之后插入新节点
else {
Node* temp = head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
newNode->prev = temp;
}
return head;
}
// 在双向链表中删除指定节点
Node* deleteNode(Node* head, Node* delNode) {
// 如果链表为空或删除节点为空,直接返回
if (head == NULL || delNode == NULL) {
return head;
}
// 如果删除的是头节点
if (head == delNode) {
head = delNode->next;
}
// 如果删除的是尾节点
if (delNode->next == NULL) {
delNode->prev->next = NULL;
}
// 如果删除的是中间节点
else {
delNode->next->prev = delNode->prev;
delNode->prev->next = delNode->next;
}
free(delNode);
return head;
}
// 打印双向链表
void printList(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
int main() {
Node* head = NULL;
head = insertAtEnd(head, 1);
head = insertAtEnd(head, 2);
head = insertAtEnd(head, 3);
head = insertAtFront(head, 0);
printList(head);
head = deleteNode(head, head);
head = deleteNode(head, head->next->next);
printList(head);
return 0;
}
```
上面的代码中,我们定义了一个 `Node` 结构体作为双向链表的节点,包含数据成员 `data`、前驱指针 `prev` 和后继指针 `next`。然后,我们实现了 `insertAtFront`、`insertAtEnd` 和 `deleteNode` 函数来进行前插入、后插入和删除操作。最后,在 `main` 函数中演示了如何使用这些函数来构建和操作双向链表。
阅读全文