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

全部评论

相关推荐

面试时间:2025年10月中旬面试时长:50分钟左右面试方式:腾讯会议,两位面试官,开启摄像头面试问题:1.自我介绍2.C语言内存对齐的概念,是否了解单字节对齐,应用场景是什么?3.如何定义双向链表?数据域的话,如果我要定义一个通用的数据域,你会怎么定义?如何确定数据长度?如果现在有个 A 和 B,我在 A B 之间插入一个 C,我的流程是什么?4.C 语言编译出来了过后,以及它运行,它整个的一个程序的内存分布分为哪些段?5.static 关键字的职责?C 语言有多少个关键字啊?6.如何去设计一个跨平台的 C 和 C + 模块?7.MCU 的启动流程是什么?8.用过这个 RTOS 吗?9.MCU 的最小系统是由哪些东西组成?10.时钟一般有哪些时钟源?外部晶振为什么为什么精度高?11.USB 的线序以及它的时序的协议方面的这些这些了解吗?12.TF 卡你能讲一下有多少个引脚,然后每个引脚是干嘛的?13.示波器怎么去接差分?就是接线上怎么去捕捉差分的信号?14.你有没有抓过包?分析过比如 TCP 的报文?TCP 有多少种状态,以及状态之间是怎么迁移的,这个了解吗? 15.项目的工作强度,消耗的时间?模式切换逻辑?低功耗策略?算法处理时间?项目结果?芯片选型参考?价格?16.对公司的了解17.offer情况18.反问很特别,或者说很奇葩的一次面试。说实话这个面试让我感觉回到了本科找工作的状态,基本只问八股,项目了解的都很浅显,和隔壁瑞晟二面对比起来实在是太鲜明了……很遗憾,明明最开始约的九月底,却由于面试官有事改到了十月中旬,毫不意外的导致了一个结果,没有hc啦~虽然八股都答上来了,不妨碍面完就收到挂信,不服啊~
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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