雙向鏈表是指含有往前和日後兩個方向的鏈表,即每一個結點中除存放下一個節點指針外,還增長一個指向其前一個節點的指針。其頭指針head是惟一肯定的。node
從雙向鏈表中的任意一個結點開始,均可以很方便地訪問它的前驅結點和後繼結點,這種數據結構形式使得雙向鏈表在查找時更加方便,特別是大量數據的遍歷。因爲雙向鏈表具備對稱性,能方便地完成各類插入、刪除等操做,但須要注意先後方向的操做。編程
Huawei LiteOS系統中的雙向鏈表模塊爲用戶提供下面幾個接口。數據結構
功能分類 | 接口名 | 描述 |
---|---|---|
初始化鏈表 | LOS_ListInit | 對鏈表進行初始化 |
增長節點 | LOSListAdd | 將新節點添加到鏈表中 |
在鏈表尾端插入節點 | LOS_ListTailInsert | 將節點插入到雙向鏈表尾端 |
刪除節點 | LOS_ListDelete | 將指定的節點從鏈表中刪除 |
判斷雙向鏈表是否爲空 | LOS_ListEmpty | 判斷鏈表是否爲空 |
刪除節點並初始化鏈表 | LOS_ListDelInit | 將指定的節點從鏈表中刪除使用該節點初始化鏈表 |
雙向鏈表的典型開發流程:函數
使用雙向鏈表,首先要申請內存,刪除節點的時候要注意釋放掉內存。測試
本實例實現以下功能:指針
代碼實現以下:code
#include "los_list.h" #include<stdio.h> VOID list_test(void) { /*初始化,判斷是否爲空*/ printf("initial......\n"); LOS_DL_LIST* head; head = (LOS_DL_LIST*)malloc(sizeof(LOS_DL_LIST)); LOS_ListInit(head); if (!ListEmpty(head)) { printf("initial failed\n"); return; } /*增長一個節點,在尾端插入一個節點*/ printf("node add and tail add......\n"); LOS_DL_LIST* node1 = (LOS_DL_LIST*)malloc(sizeof(LOS_DL_LIST)); LOS_DL_LIST* node2 = (LOS_DL_LIST*)malloc(sizeof(LOS_DL_LIST)); LOS_DL_LIST* tail = (LOS_DL_LIST*)malloc(sizeof(LOS_DL_LIST)); LOS_ListAdd(node1,head); LOS_ListAdd(node2,node1); if((node1->pstPrev == head) || (node2->pstPrev == node1)){ printf("add node success\n"); } LOS_ListTailInsert(tail,head); if(tail->pstPrev == node2){ printf("add tail success\n"); } /*刪除雙向鏈表節點*/ printf("delete node......\n"); LOS_ListDelete(node1); free(node1); if(head->pstNext == node2){ printf("delete node success\n"); } }
編譯運行獲得的結果爲:
blog