首页 > 其他分享 >OpenHarmony中的HDF单链表及其迭代器

OpenHarmony中的HDF单链表及其迭代器

时间:2022-09-05 11:36:19浏览次数:98  
标签:OpenHarmony 单链 struct 迭代 next 链表 HDF 节点

概念

为了性能考虑,嵌入式系统一般使用C语言进行开发,由于C语言标准库没有封装链表,所以嵌入式系统一般自己设计和实现链表这种数据结构。单链表是链表中的一种,本文描述OpenAtom OpenHarmony(以下简称“OpenHarmony”)中HDF软件模块自己定义的单链表,并学习其设计和实现方法。其中包含一些技巧,可以提高读者的软件开发能力。

 

单链表定义

在OpenHarmony的HDF软件模块中,单链表定义在hdf_slist.h中。

 

struct HdfSListNode {
    struct HdfSListNode *next; // next element in list, or NULL
};

其示意图如下:

 

 

如上图所述,每个节点都是HdfSListNode,上图共有5个节点,每个节点内部有一个next成员,其值为下一个节点在内存中的地址。由于可以通过这个地址找到下一个节点,所以在图里面用红色右箭头来描述这个关系。整体来看,从1号节点可以通过next成员依次找到后面4个节点,从图形看,就是一个逻辑上的链关系,我们把这种结构称为链表。

单独看5号节点,5号节点没有下一个节点,所以设计上是需要给一个特定的值来表示,实现上一般把5号节点的next成员填成0值,表明其为最末尾的节点。

接下来我们看下面这个数据结构:

 

struct HdfSList {
    struct HdfSListNode *root;
};
 

  

其示意图如下:

 

 

如上图所示,圆角矩形表示的是HdfSList,其root成员记录了链表中某节点的地址,为了访问整个链表,需要将root成员的值设置成第1个节点的地址。因为单链表只支持往一个方向查找,不支持往回查找,如上面的错误范例。如果root记录的是第二个节点地址,则第一个节点变得不可访问。

 

迭代器简介

迭代器是伴随集合概念产生的,意思是依次访问集合中的每一个元素,迭代器提供访问这些元素的方法。对于单链表而言,链表中的每一个节点都是一个元素,所有的节点组成集合。所以可以通过迭代器来访问链表中的元素。

迭代器需要提供的基本能力以及操作范式是:

 

初始化迭代器
重复判断(集合中还有未被访问的元素)
     获取下一个元素的访问方法
     读写下一个元素(也可能是删除这个元素)
结束
 

  

上述范式展示了迭代器的用法,通过迭代器,遍历元素变得简单直接(将遍历算法封装在迭代器中),不用每次迭代都考虑数据结构细节(数据结构种类繁多,单链表只是其中之一)。

对于本文描述的单链表,其封装了下面3个函数来支持迭代算法。这3个函数分别表示迭代器对象的初始化;集合中是否还有元素没有参与迭代;取出集合中下一个可以参与迭代的元素。

 

/* * @brief initialize iterator * * @param[in] iterator the point of iterator. * @param[in] list the point of operation list. * * @return None */
void HdfSListIteratorInit(struct HdfSListIterator *iterator, struct HdfSList *list);

/* * @brief check whether list has next node. * * @param[in] iterator the point of iterator. * * @return the result of check next. */
bool HdfSListIteratorHasNext(struct HdfSListIterator *iterator);

/* * @brief get next link in the list and move iterator to next. * * @param[in] iterator the point of iterator. * * @return point to next element of it. */
struct HdfSListNode *HdfSListIteratorNext(struct HdfSListIterator *iterator);
 

  

 

迭代器实现考虑

对于本文所描述的单链表迭代器。直观上看,除了第一个节点,其它节点都可以通过next访问到,第一个节点通过root访问到。那实际上会不会就是这么简单呢?其实不然,因为需要考虑到节点删除的因素。如下图,在链表迭代过程中,如果删除了当前节点,那么怎么找到下一个节点呢?

 

 

如上图所示,当在遍历过程中删除了curr节点时,那么通过它找到下一个节点是不可能了。所以这个时候我们必须借助操作curr之前还在链表上的上一个节点,即上图的prev节点,通过其next成员,找到需要迭代处理的下一个节点。所以,迭代过程中需要记录prev、curr这2个节点的位置信息。迭代过程实际就是调整prev和curr的过程,对于不删除的情况,prev和curr依次向后移动,删除操作时,只移动curr。

另外,对于第1个节点的情况需要特殊处理,所以需要一个额外的信息来表示是不是迭代第1个元素,因为本文描述的迭代器对象含有3个信息。如下代码所示:

 

struct HdfSListIterator {
    int stepOnNext;     //是否即将开始遍历第二个以及之后的元素
    struct HdfSListNode *prev; // points to the item before the current one 当前被操作元素的前一个元素
    struct HdfSListNode *curr; // points to the current item (to detect item removal) 当前被操作的元素,可能刚操作完,被移除链表
};
 

  

上述代码中prev和curr的作用已经在前面详细描述,而stepOnNext的意思就是是否已经开始取第二个元素。即将第一个元素的获取算法与第二个元素分开。

 

结论

在嵌入式开发中,在学习数据结构课程中,在进行OpenHarmony项目开发中,单链表都是很重要的,而本文只是其中一个软件模块的单链表实现。通过对单链表的实现的图示分析,特别是迭代器惯用法的分析,相信读者对单链表以及迭代器的认识都会进一步提升,更详尽的代码分析和阅读留给读者自己进行,请参考如下代码文件:

https://gitee.com/openharmony/drivers_hdf_core/blob/master/framework/utils/include/hdf_slist.h

https://gitee.com/openharmony/drivers_hdf_core/blob/master/framework/utils/src/hdf_slist.c

 

标签:OpenHarmony,单链,struct,迭代,next,链表,HDF,节点
From: https://www.cnblogs.com/openharmony/p/16657510.html

相关文章

  • 【瞎口胡】多项式牛顿迭代
    前言如果完全不会求导和积分,以及泰勒展开,这里有一个实用性很强的教程3blue1brown-微积分的本质。多项式牛顿迭代给定函数\(G(x)\),求多项式\(F(x)\)使得\(G(F(x))......
  • 大数据分析常用组件、框架、架构介绍(Hadoop、Spark、Storm、Flume、Kafka、Logstash、
    首先,数据传输组件:①Kafka是用Scala编写的分布式消息处理平台。②Logstash是用JRuby编写的一种分布式日志收集框架。③Flume是用Java编写的分布式实时日志收集框架。......
  • 处理不同的数据源(端口,HDFS)
    端口//地址,端口号,级别(将数据存储在所设置的级别中,这里设置级别为spark的内存)valds:DStream[String]=ssc.socketTextStream("node1",44444,StorageLevel.MEMORY_......
  • 学习汇报7 hdfs集群角色属性
    主从角色namenode:核心,架构中的主角色管理和维护文件系统的元数据,包括目录树结构、文件和块的位置信息、访问权限等信息namenode是访问hdfs的唯一入口仅存储元数据知......
  • 有关迭代器erase后失效的问题
    序列式容器vector,deque使用erase删除迭代器后,后面的元素的迭代器会失效。但是erase会返回下一个有效的迭代器。intmain(){        vector<int>v{1......
  • OpenHarmony技术挑战课题征集
    OpenHarmony技术挑战课题征集OpenAtomOpenHarmony(以下简称“OpenHarmony”)是由开放原子开源基金会(OpenAtomFoundation)孵化及运营的开源项目,通过构建分布式全场景协同......
  • 通过迭代工具itertools.product快速得到多列表笛卡尔积(列表组合)
    1.核心代码importitertoolssubject=['我想','我要']action=['打开','关闭']target=['电视','冰箱','洗衣机']forresinitertools.product(subject,ac......
  • 暑假学习6 hdfs shell命令
    命令行操作:cliHadoop的命令shell:Hadoopfs-lsfile:          操作本地的文件系统hadoopfs-lshdfs://node1:8020         ......
  • 0032-Rust-自实现迭代器
    环境Time2022-05-21Rust1.61.0前言说明参考:https://doc.rust-lang.org/std/iter/index.html目标接前一节,在迭代的过程中,修改每个迭代的元素。自定义类型#[der......
  • 0033-Rust-实现递归迭代
    环境Time2022-05-21Rust1.61.0前言说明参考:https://fasterthanli.me/articles/recursive-iterators-rust目标对于递归类型的结构,实现递归迭代。自定义类型str......