双向链表是一种链式数据结构,其中每个节点包含数据、前驱指针和后继指针。这种结构允许从任意节点向前或向后遍历列表。
双向链表的组成部分
-
节点(Node) :包含三个部分:
- 数据域(data):存储实际的数据。
- 前驱指针(prev):指向链表中的前一个节点。
- 后继指针(next):指向链表中的后一个节点。
双向链表的基本操作
-
插入:
- 在指定位置插入新节点。
-
删除:
- 删除指定位置的节点。
-
查找:
- 查找指定值的节点。
-
遍历:
- 从头到尾或从尾到头遍历链表。
C语言实现双向链表
下面是一个简单的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) {
printf("内存分配失败\n");
return NULL;
}
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL;
return newNode;
}
// 在指定位置插入节点
void insertAfter(Node* prevNode, int newData) {
if (prevNode == NULL) {
printf("前驱节点不能为空\n");
return;
}
Node* newNode = createNode(newData);
newNode->next = prevNode->next;
newNode->prev = prevNode;
if (prevNode->next != NULL)
prevNode->next->prev = newNode;
prevNode->next = newNode;
}
// 删除节点
void deleteNode(Node** head, Node* delNode) {
if (*head == NULL || delNode == NULL)
return;
if (*head == delNode)
*head = delNode->next;
if (delNode->next != NULL)
delNode->next->prev = delNode->prev;
if (delNode->prev != NULL)
delNode->prev->next = delNode->next;
free(delNode);
}
// 打印链表(从头到尾)
void printList(Node* node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
int main() {
Node* head = createNode(1);
insertAfter(head, 2);
insertAfter(head->next, 3);
printList(head); // 输出: 1 2 3
deleteNode(&head, head->next); // 删除节点2
printList(head); // 输出: 1 3
return 0;
}
代码解释
-
定义节点结构体:
Node
结构体包含data
、prev
和next
。
-
创建新节点:
createNode
函数用于分配内存并初始化节点。
-
插入节点:
insertAfter
函数在指定的前驱节点之后插入一个新节点。- 需要处理特殊情况:链表为空或插入位置为第一个节点。
-
删除节点:
deleteNode
函数用于删除指定的节点,并重新连接相邻节点。- 处理链表头和尾的情况。
-
打印链表:
printList
函数从头到尾遍历链表并打印每个节点的数据。
运行结果
1 2 3
1 3