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编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。

全部评论

相关推荐

10-21 17:42
酷酷的喜马拉雅山:你为什么发我的offer列表?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务