双向链表是一种更复杂的链表结构,其中每个节点都有两个链接,一个指向前一个节点,另一个指向下一个节点。这种结构使得在双向链表中遍历数据更为高效,因为可以从两个方向进行遍历。
结构
- 数据域:存储实际数据。
- 指向前一个节点的链接(prev)。
- 指向下一个节点的链接(next)。
#include <stdio.h>
#include <stdlib.h>// 定义节点结构体
typedef struct Node {int data;struct Node* next;struct Node* prev;
} Node;// 创建新节点
Node* createNode(int data) {Node* newNode = (Node*)malloc(sizeof(Node));if (!newNode) {printf("内存分配失败\n");exit(0);}newNode->data = data;newNode->next = NULL;newNode->prev = NULL;return newNode;
}// 在双向链表末尾添加节点
void appendNode(Node** head, int data) {Node* newNode = createNode(data);if (*head == NULL) {*head = newNode;} else {Node* temp = *head;while (temp->next != NULL) {temp = temp->next;}temp->next = newNode;newNode->prev = temp;}
}// 在双向链表开头添加节点
void prependNode(Node** head, int data) {Node* newNode = createNode(data);if (*head == NULL) {*head = newNode;} else {newNode->next = *head;(*head)->prev = newNode;*head = newNode;}
}// 打印双向链表
void printList(Node* head) {Node* temp = head;printf("正向遍历:");while (temp != NULL) {printf("%d ", temp->data);temp = temp->next;}printf("\n");printf("反向遍历:");while (temp != NULL) {printf("%d ", temp->data);temp = temp->prev;}printf("\n");
}// 释放双向链表内存
void freeList(Node** head) {Node* temp = *head;Node* next;while (temp != NULL) {next = temp->next;free(temp);temp = next;}*head = NULL;
}int main() {Node* head = NULL;prependNode(&head, 1);appendNode(&head, 2);appendNode(&head, 3);printList(head);freeList(&head);return 0;
}