偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

OpenHarmony中的HDF單鏈表及其迭代器

系統(tǒng) OpenHarmony
本文描述OpenAtom OpenHarmony(以下簡(jiǎn)稱“OpenHarmony”)中HDF軟件模塊自己定義的單鏈表,并學(xué)習(xí)其設(shè)計(jì)和實(shí)現(xiàn)方法。其中包含一些技巧,可以提高讀者的軟件開發(fā)能力。

??想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

概念

為了性能考慮,嵌入式系統(tǒng)一般使用C語言進(jìn)行開發(fā),由于C語言標(biāo)準(zhǔn)庫沒有封裝鏈表,所以嵌入式系統(tǒng)一般自己設(shè)計(jì)和實(shí)現(xiàn)鏈表這種數(shù)據(jù)結(jié)構(gòu)。單鏈表是鏈表中的一種,本文描述OpenAtom OpenHarmony(以下簡(jiǎn)稱“OpenHarmony”)中HDF軟件模塊自己定義的單鏈表,并學(xué)習(xí)其設(shè)計(jì)和實(shí)現(xiàn)方法。其中包含一些技巧,可以提高讀者的軟件開發(fā)能力。

單鏈表定義

在OpenHarmony的HDF軟件模塊中,單鏈表定義在hdf_slist.h中。

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

OpenHarmony中的HDF單鏈表及其迭代器-開源基礎(chǔ)軟件社區(qū)

如上圖所述,每個(gè)節(jié)點(diǎn)都是HdfSListNode,上圖共有5個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)內(nèi)部有一個(gè)next成員,其值為下一個(gè)節(jié)點(diǎn)在內(nèi)存中的地址。由于可以通過這個(gè)地址找到下一個(gè)節(jié)點(diǎn),所以在圖里面用紅色右箭頭來描述這個(gè)關(guān)系。整體來看,從1號(hào)節(jié)點(diǎn)可以通過next成員依次找到后面4個(gè)節(jié)點(diǎn),從圖形看,就是一個(gè)邏輯上的鏈關(guān)系,我們把這種結(jié)構(gòu)稱為鏈表。

單獨(dú)看5號(hào)節(jié)點(diǎn),5號(hào)節(jié)點(diǎn)沒有下一個(gè)節(jié)點(diǎn),所以設(shè)計(jì)上是需要給一個(gè)特定的值來表示,實(shí)現(xiàn)上一般把5號(hào)節(jié)點(diǎn)的next成員填成0值,表明其為最末尾的節(jié)點(diǎn)。

接下來我們看下面這個(gè)數(shù)據(jù)結(jié)構(gòu):

struct HdfSList {
struct HdfSListNode *root;
};

其示意圖如下:

OpenHarmony中的HDF單鏈表及其迭代器-開源基礎(chǔ)軟件社區(qū)

如上圖所示,圓角矩形表示的是HdfSList,其root成員記錄了鏈表中某節(jié)點(diǎn)的地址,為了訪問整個(gè)鏈表,需要將root成員的值設(shè)置成第1個(gè)節(jié)點(diǎn)的地址。因?yàn)閱捂湵碇恢С滞粋€(gè)方向查找,不支持往回查找,如上面的錯(cuò)誤范例。如果root記錄的是第二個(gè)節(jié)點(diǎn)地址,則第一個(gè)節(jié)點(diǎn)變得不可訪問。

迭代器簡(jiǎn)介

迭代器是伴隨集合概念產(chǎn)生的,意思是依次訪問集合中的每一個(gè)元素,迭代器提供訪問這些元素的方法。對(duì)于單鏈表而言,鏈表中的每一個(gè)節(jié)點(diǎn)都是一個(gè)元素,所有的節(jié)點(diǎn)組成集合。所以可以通過迭代器來訪問鏈表中的元素。

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

重復(fù)判斷(集合中還有未被訪問的元素)
獲取下一個(gè)元素的訪問方法
讀寫下一個(gè)元素(也可能是刪除這個(gè)元素)
結(jié)束

上述范式展示了迭代器的用法,通過迭代器,遍歷元素變得簡(jiǎn)單直接(將遍歷算法封裝在迭代器中),不用每次迭代都考慮數(shù)據(jù)結(jié)構(gòu)細(xì)節(jié)(數(shù)據(jù)結(jié)構(gòu)種類繁多,單鏈表只是其中之一)。

對(duì)于本文描述的單鏈表,其封裝了下面3個(gè)函數(shù)來支持迭代算法。這3個(gè)函數(shù)分別表示迭代器對(duì)象的初始化;集合中是否還有元素沒有參與迭代;取出集合中下一個(gè)可以參與迭代的元素。

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);

迭代器實(shí)現(xiàn)考慮

對(duì)于本文所描述的單鏈表迭代器。直觀上看,除了第一個(gè)節(jié)點(diǎn),其它節(jié)點(diǎn)都可以通過next訪問到,第一個(gè)節(jié)點(diǎn)通過root訪問到。那實(shí)際上會(huì)不會(huì)就是這么簡(jiǎn)單呢?其實(shí)不然,因?yàn)樾枰紤]到節(jié)點(diǎn)刪除的因素。如下圖,在鏈表迭代過程中,如果刪除了當(dāng)前節(jié)點(diǎn),那么怎么找到下一個(gè)節(jié)點(diǎn)呢?

OpenHarmony中的HDF單鏈表及其迭代器-開源基礎(chǔ)軟件社區(qū)

如上圖所示,當(dāng)在遍歷過程中刪除了curr節(jié)點(diǎn)時(shí),那么通過它找到下一個(gè)節(jié)點(diǎn)是不可能了。所以這個(gè)時(shí)候我們必須借助操作curr之前還在鏈表上的上一個(gè)節(jié)點(diǎn),即上圖的prev節(jié)點(diǎn),通過其next成員,找到需要迭代處理的下一個(gè)節(jié)點(diǎn)。所以,迭代過程中需要記錄prev、curr這2個(gè)節(jié)點(diǎn)的位置信息。迭代過程實(shí)際就是調(diào)整prev和curr的過程,對(duì)于不刪除的情況,prev和curr依次向后移動(dòng),刪除操作時(shí),只移動(dòng)curr。

另外,對(duì)于第1個(gè)節(jié)點(diǎn)的情況需要特殊處理,所以需要一個(gè)額外的信息來表示是不是迭代第1個(gè)元素,因?yàn)楸疚拿枋龅牡鲗?duì)象含有3個(gè)信息。如下代碼所示:

int stepOnNext;     //是否即將開始遍歷第二個(gè)以及之后的元素
struct HdfSListNode *prev; // points to the item before the current one 當(dāng)前被操作元素的前一個(gè)元素
struct HdfSListNode *curr; // points to the current item (to detect item removal) 當(dāng)前被操作的元素,可能剛操作完,被移除鏈表
};

上述代碼中prev和curr的作用已經(jīng)在前面詳細(xì)描述,而stepOnNext的意思就是是否已經(jīng)開始取第二個(gè)元素。即將第一個(gè)元素的獲取算法與第二個(gè)元素分開。

結(jié)論

在嵌入式開發(fā)中,在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)課程中,在進(jìn)行OpenHarmony項(xiàng)目開發(fā)中,單鏈表都是很重要的,而本文只是其中一個(gè)軟件模塊的單鏈表實(shí)現(xiàn)。通過對(duì)單鏈表的實(shí)現(xiàn)的圖示分析,特別是迭代器慣用法的分析,相信讀者對(duì)單鏈表以及迭代器的認(rèn)識(shí)都會(huì)進(jìn)一步提升。

??想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??。

責(zé)任編輯:jianghua 來源: ??51CTO開源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2023-03-20 16:05:49

HDF傳感器驅(qū)動(dòng)開發(fā)

2023-09-14 15:49:42

PWM鴻蒙

2021-09-10 15:12:04

鴻蒙HarmonyOS應(yīng)用

2023-09-06 15:35:14

2021-09-10 15:10:50

鴻蒙HarmonyOS應(yīng)用

2021-09-08 15:09:29

鴻蒙HarmonyOS應(yīng)用

2022-05-16 11:50:45

HDF驅(qū)動(dòng)框架

2022-04-20 20:28:40

HDF 驅(qū)動(dòng)框架鴻蒙操作系統(tǒng)

2022-03-10 17:02:51

Rust單鏈表數(shù)據(jù)結(jié)構(gòu)

2021-09-07 15:48:28

鴻蒙HarmonyOS應(yīng)用

2021-03-04 23:12:57

Node.js異步迭代器開發(fā)

2024-11-08 12:42:34

Rustmapfilter

2016-03-28 10:39:05

Python迭代迭代器

2021-11-28 08:03:41

Python迭代器對(duì)象

2023-09-13 15:33:57

I2C鴻蒙

2020-11-19 10:17:54

Python開發(fā)感知器

2023-03-01 00:07:32

JavaScript迭代器生成器

2009-11-25 10:31:35

PHP數(shù)組實(shí)現(xiàn)單鏈表

2020-02-07 11:07:53

數(shù)組鏈表單鏈表

2020-12-08 06:28:47

Node.js異步迭代器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)