C语言建立双向链表,并实现其插入和删除的操作
时间: 2024-05-05 22:16:47 浏览: 99
双向链表是一种常见的数据结构,它可以用来表示一组有序的数据。在双向链表中,每个节点都包含一个指向前驱节点和后继节点的指针,这样可以方便地在链表中插入和删除节点。
以下是C语言实现双向链表的代码,其中包括插入和删除节点的操作:
```
#include <stdio.h>
#include <stdlib.h>
// 双向链表节点结构体
typedef struct _node {
int data; // 节点数据
struct _node* prev; // 前驱节点指针
struct _node* next; // 后继节点指针
} Node;
// 创建一个新节点
Node* create_node(int data) {
Node* node = (Node*)malloc(sizeof(Node));
if (node == NULL) {
printf("内存分配失败\n");
exit(1);
}
node->data = data;
node->prev = NULL;
node->next = NULL;
return node;
}
// 在双向链表末尾插入一个节点
void insert_node(Node* head, int data) {
Node* node = create_node(data);
Node* last = head;
while (last->next != NULL) {
last = last->next;
}
last->next = node;
node->prev = last;
}
// 从双向链表中删除一个节点
void delete_node(Node* head, int data) {
Node* node = head->next;
while (node != NULL) {
if (node->data == data) {
Node* prev = node->prev;
Node* next = node->next;
prev->next = next;
if (next != NULL) {
next->prev = prev;
}
free(node);
return;
}
node = node->next;
}
}
// 打印双向链表
void print_list(Node* head) {
Node* node = head->next;
printf("链表中的元素:");
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
// 测试双向链表的插入和删除操作
int main() {
Node* head = create_node(0);
insert_node(head, 1);
insert_node(head, 2);
insert_node(head, 3);
insert_node(head, 4);
print_list(head);
delete_node(head, 3);
print_list(head);
delete_node(head, 1);
print_list(head);
return 0;
}
```
在上面的代码中,我们定义了一个双向链表节点的结构体,包含了节点数据、前驱节点指针和后继节点指针。我们还定义了创建节点的函数create_node,以及在双向链表末尾插入节点的函数insert_node和在双向链表中删除节点的函数delete_node。最后,我们定义了一个打印双向链表的函数print_list,用于测试插入和删除操作。
在main函数中,我们创建了一个头节点,并插入了一些节点,然后调用print_list函数打印链表。接着,我们删除了一个节点,并再次打印链表。最后,我们删除了另一个节点,并再次打印链表。通过这个例子,我们可以看到双向链表的插入和删除操作是非常方便的。
阅读全文