上一篇
在学习C语言数据结构的过程中,双向链表是一个非常重要的基础结构。与单向链表不同,双向链表的每个节点不仅包含指向下一个节点的指针,还包含指向前一个节点的指针。这种结构使得我们在遍历时可以向前或向后移动,大大提高了操作的灵活性。
双向链表(Doubly Linked List)是一种线性数据结构,其中每个节点包含三个部分:
首先,我们需要用 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 insertAtEnd(Node** head, int data) { Node* newNode = createNode(data); if (*head == NULL) { *head = newNode; return; } Node* temp = *head; while (temp->next != NULL) { temp = temp->next; } temp->next = newNode; newNode->prev = temp;} 我们可以从头到尾遍历链表并打印所有元素:
// 从头到尾打印链表void printList(Node* head) { if (head == NULL) { printf("链表为空!\n"); return; } Node* temp = head; printf("正向遍历: "); while (temp != NULL) { printf("%d ", temp->data); temp = temp->next; } printf("\n");} 下面是一个完整的可运行示例,演示如何使用上述函数:
int main() { Node* head = NULL; insertAtEnd(&head, 10); insertAtEnd(&head, 20); insertAtEnd(&head, 30); printList(head); // 输出: 正向遍历: 10 20 30 return 0;} 掌握C语言双向链表不仅能帮助你深入理解指针和内存管理,还能为学习更复杂的数据结构(如树、图等)打下坚实基础。此外,在实际开发中,双向链表常用于实现浏览器历史记录、撤销/重做功能、LRU缓存等场景。
通过本教程,你应该已经掌握了双向链表实现的基本方法。建议你动手编写代码,尝试添加更多功能,比如在头部插入、删除指定节点、反向遍历等,以加深理解。
记住,实践是掌握链表操作教程的关键。多写、多调试,你会越来越熟练!
本文由主机测评网于2025-12-06发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025123630.html