FreeRTOS源码解析(双向链表)
2.1什么是双向链表
双向链表(Doubly Linked List) 是一种特殊的链表结构。每个节点除了存放数据外,还包含两个指针:
- prev → 指向前一个节点
- next → 指向后一个节点
因此,双向链表既可以 从前往后遍历,也可以 从后往前遍历。
HeadNode ↓ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌──────┐ │ data: 0 │ ⇄ │ data: 10 │ ⇄ │ data: 20 │ ⇄ │ NULL │ │ prev: - │ │ prev: * │ │ prev: * │ └──────┘ │ next: * │ │ next: * │ │ next: * │ └───────────┘ └───────────┘ └───────────┘
双向链表的节点需要保存:
- 数据域:存放数据
- 前驱指针:指向前一个节点
- 后继指针:指向下一个节点
双向链表结构:
typedef struct dnode { int data; // 节点存放的数据 struct dnode* prev; // 指向前一个节点 struct dnode* next; // 指向后一个节点 } DNode;
2.2双向链表的添加
1.创建新节点
- 申请内存
malloc
,填充数据域data
。 - 新节点的
next
初始化为NULL
(因为它将成为新的尾节点)。
2.找到当前尾节点
- 从头结点开始,沿着
next
指针一直遍历,直到找到next == NULL
的节点,这个就是当前尾节点。
3.修改指针完成插入
- 让当前尾节点的
next
指向新节点。 - 让新节点的
prev
指向当前尾节点。
4.结束
- 新节点已经挂在链表尾部,链表结构完整。
- 如果有返回值,通常返回
0
表示成功,-1
表示失败(如内存分配失败)。
HeadNode ↓ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌──────┐ │ data: 0 │ ⇄ │ data: 10 │ ⇄ │ data: 20 │ ⇄ │ data: 30 │ ⇄ │ NULL │ │ prev: - │ │ prev: * │ │ prev: * │ │ prev: * │ │ next: * │ │ next: * │ │ next: * │ │ next: NULL│ └───────────┘ └───────────┘ └───────────┘ └───────────┘
代码:
int Add(DNode* ListHead, int data) { // 1. 申请新节点 DNode* PNode = (DNode*)malloc(sizeof(DNode)); if (PNode == NULL) { return -1; // 内存申请失败 } PNode->data = data; PNode->next = NULL; // 2. 找到链表尾 DNode* PTemp
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
嵌入式面试八股文全集 文章被收录于专栏
这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。