昨天公众号后台收到一位小友的惊喜问题:
“为何鸿蒙内核源码分析系列开篇就说 LOS_DL_LIST ?”
平常很少收到技术问题,大家都喜欢问老王鸿蒙认证问题,老王都还有点不习惯。
这个问题呢,是因为它在鸿蒙 LOS 内核中无处不在,在整个内核占了极大的比重,豪不夸张的说理解 LOS_DL_LIST 及相关函数是读懂鸿蒙内核的关键。
前后指针就像人的两只左右手一样灵活的指挥着系统精准的运行,越是深入分析内核源码,越能感受到内核开发者对 LOS_DL_LIST 非凡的驾驭能力,笔者仿佛看到了无数双手前后相连,拉起了一个个双向循环链表,把指针的高效能运用到了极致,这也许就是编程的艺术吧!
致敬鸿蒙内核开发者贡献了如此优秀的源码,鸿蒙内核源码可作为大学 C 语言, 操作系统,数据结构,汇编语言四门课的教学项目。
1. /**
2. * @ingroup los_list
3. * Structure of a node in a doubly linked list.
4. */
5. typedef struct LOS_DL_LIST {
6. struct LOS_DL_LIST *pstPrev; /**< Current node's pointer to the previous node */
7. struct LOS_DL_LIST *pstNext; /**< Current node's pointer to the next node */
8. } LOS_DL_LIST;
9.
10.LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListInit(LOS_DL_LIST *list)
11.{
12. list->pstNext = list;
13. list->pstPrev = list;
14.}
结构体很简单,就前后两个指向自己的指针,因简单才经典,因太简单才太不简单. 真的是无处不在吗?
答:是真的,看看这些使用它的源码吧,无处不在。
1、基本概念
双向链表是指含有往前和往后两个方向的链表,即每个结点中除存放下一个节点指针外,还增加一个指向其前一个节点的指针。
其头指针 head 是唯一确定的。从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点,这种数据结构形式使得双向链表在查找时更加方便,特别是大量数据的遍历。
由于双向链表具有对称性,能方便地完成各种插入、删除等操作,但需要注意前后