双向链表是一种更复杂的链表结构,其中每个节点都有两个链接,一个指向前一个节点,另一个指向下一个节点。这种结构使得在双向链表中遍历数据更为高效,因为可以从两个方向进行遍历。
结构
- 数据域:存储实际数据。
- 指向前一个节点的链接(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;
}