|
|
本篇关键词:双向链表 、递减满栈、增删改查图、
|
|
|
|
|
|
[![](http://weharmonyos.com/resources/index/01.png)](http://weharmonyos.com/blog/01.html)
|
|
|
[![](https://gitee.com/weharmonyos/resources/raw/master/index/01.png)](http://weharmonyos.com/blog/01.html)
|
|
|
|
|
|
|
|
|
[下载 >> 离线文档.鸿蒙内核源码分析(百篇博客分析.挖透鸿蒙内核).pdf](http://weharmonyos.com/resources/pdf/鸿蒙内核源码分析(百篇博客分析.挖透鸿蒙内核).zip)
|
... | ... | @@ -33,7 +33,7 @@ typedef struct LOS_DL_LIST { |
|
|
* 基本概念:双向链表是指含有往前和往后两个方向的链表,即每个结点中除存放下一个节点指针外,还增加一个指向前一个节点的指针, 从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点,这种数据结构形式使得双向链表在查找时更加方便,特别是大量数据的遍历。由于双向链表具有对称性,能方便地完成各种插入、删除等操作。
|
|
|
* 使用场景:在内核的各个模块都能看到双向链表的身影,下图是初始化双向链表的操作,因为太多了,只截取了部分:
|
|
|
|
|
|
![](http://weharmonyos.com/resources/1/ListInit.png)
|
|
|
![](https://gitee.com/weharmonyos/resources/raw/master/1/ListInit.png)
|
|
|
|
|
|
* 可以豪不夸张的说理解`LOS_DL_LIST`及相关函数是读懂鸿蒙内核的关键。前后指针(左右触手)灵活的指挥着系统精准的运行,越是深挖内核代码越是能体会到它在内核举足轻重的地位, 笔者仿佛看到了无数双手前后相连,拉起了一个个双向循环链表,把指针的高效能运用到了极致,这也许就是编程的艺术吧!
|
|
|
|
... | ... | @@ -56,7 +56,7 @@ typedef struct LOS_DL_LIST { |
|
|
```
|
|
|
其插入 | 删除 | 遍历操作是它最常用的社交三大件,若不理解透彻在分析源码过程中很容易卡壳。虽在网上能找到很多它的图,但怎么看都不是自己想要的,干脆重画了它的主要操作。
|
|
|
|
|
|
![](http://weharmonyos.com/resources/100pic/1_list_100.png)
|
|
|
![](https://gitee.com/weharmonyos/resources/raw/master/100pic/1_list_100.png)
|
|
|
|
|
|
```c
|
|
|
//将指定节点初始化为双向链表节点
|
... | ... | @@ -95,7 +95,7 @@ LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListDelInit(LOS_DL_LIST *list) |
|
|
|
|
|
有好几个同学问数据在哪? 确实`LOS_DL_LIST`这个结构看起来怪怪的,它竟没有数据域!所以看到这个结构的人第一反应就是我们怎么访问数据?其实`LOS_DL_LIST`不是拿来单独用的,它是寄生在内容结构体上的,谁用它谁就是它的数据。看图就明白了。
|
|
|
|
|
|
![](http://weharmonyos.com/resources/1/list_head.jpg)
|
|
|
![](https://gitee.com/weharmonyos/resources/raw/master/1/list_head.jpg)
|
|
|
|
|
|
### 强大的宏
|
|
|
除了内联函数,对双向链表的初始化,偏移定位,遍历 等等操作提供了更强大的宏支持。使内核以极其简洁高效的代码实现复杂逻辑的处理。
|
... | ... | |