本文主要是介绍SylixOS里的双向线形管理表实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
SylixOS里的双向线形管理表通过双向链表实现,与双向环形链表不同的是前向和后向的最后一项指向NULL而不是回环指向都链表首尾。
实现源码
- 类型定义
/*********************************************************************************************************双向线形管理表
*********************************************************************************************************/typedef struct __list_line {struct __list_line *LINE_plistNext; /* 线形表前向指针 */struct __list_line *LINE_plistPrev; /* 线形表后向指针 */
} LW_LIST_LINE;
typedef LW_LIST_LINE *PLW_LIST_LINE;
typedef PLW_LIST_LINE LW_LIST_LINE_HEADER; /* 线形表表头 */
- 初始化操作
#define _LIST_LINE_INIT(name) { LW_NULL, LW_NULL }
#define _LIST_LINE_HEAD(name) \LW_LIST_LINE name = _LIST_LINE_INIT(name)#define _LIST_LINE_INIT_IN_CODE(name) do { \(name).LINE_plistNext = LW_NULL; \(name).LINE_plistPrev = LW_NULL; \} while (0)#define _INIT_LIST_LINE_HEAD(ptr) do { \(ptr)->LINE_plistNext = LW_NULL; \(ptr)->LINE_plistPrev = LW_NULL; \} while (0)#define _LIST_LINE_IS_EMPTY(ptr) \((ptr) == LW_NULL)#define _LIST_LINE_IS_NOTLNK(ptr) \(((ptr)->LINE_plistNext == LW_NULL) && ((ptr)->LINE_plistPrev == LW_NULL))
- 基本操作
static LW_INLINE VOID _list_line_next (PLW_LIST_LINE *phead)
{*phead = (*phead)->LINE_plistNext;
}static LW_INLINE PLW_LIST_LINE _list_line_get_next (PLW_LIST_LINE pline)
{return (pline->LINE_plistNext);
}static LW_INLINE PLW_LIST_LINE _list_line_get_prev (PLW_LIST_LINE pline)
{return (pline->LINE_plistPrev);
}
- 插入和删除操作
/*********************************************************************************************************
** 函数名称: _List_Line_Add_Ahead
** 功能描述: 从表头插入一个节点 (Header 将指向这个节点)
** 输 入 : plingNew 新的节点
** pplingHeader 链表头
** 输 出 : NONE
*********************************************************************************************************/
VOID _List_Line_Add_Ahead (PLW_LIST_LINE plineNew, LW_LIST_LINE_HEADER *pplineHeader)
{REGISTER LW_LIST_LINE_HEADER plineHeader;plineHeader = *pplineHeader;plineNew->LINE_plistNext = plineHeader;plineNew->LINE_plistPrev = LW_NULL;if (plineHeader) { plineHeader->LINE_plistPrev = plineNew;}*pplineHeader = plineNew; /* 指向最新变量 */
}
/*********************************************************************************************************
** 函数名称: _List_Line_Add_Tail
** 功能描述: 从表尾插入一个节点 (Header 不变)
** 输 入 : plingNew 新的节点
** pplingHeader 链表头
** 输 出 : NONE
*********************************************************************************************************/
VOID _List_Line_Add_Tail (PLW_LIST_LINE plineNew, LW_LIST_LINE_HEADER *pplineHeader)
{REGISTER LW_LIST_LINE_HEADER plineHeader;plineHeader = *pplineHeader;if (plineHeader) {//链表不为空if (plineHeader->LINE_plistNext) {//链表不只有一项,插入到首项的后面,新节点不一定会是最后一项plineNew->LINE_plistNext = plineHeader->LINE_plistNext;plineNew->LINE_plistPrev = plineHeader;plineHeader->LINE_plistNext->LINE_plistPrev = plineNew;plineHeader->LINE_plistNext = plineNew;} else {//链表只有一项,插首项项后面,即新节点为最后一项plineHeader->LINE_plistNext = plineNew;plineNew->LINE_plistPrev = plineHeader;plineNew->LINE_plistNext = LW_NULL;}} else {//链表为空,则表头指向新节点即可,节点前后项初始化为空,即新节点为最后一项plineNew->LINE_plistPrev = LW_NULL;plineNew->LINE_plistNext = LW_NULL;*pplineHeader = plineNew;}
}
/*********************************************************************************************************
** 函数名称: _List_Line_Add_Left
** 功能描述: 将新的节点插入指定节点的左侧.
** 输 入 : plineNew 新的节点
** plineRight 右侧节点
** 输 出 : NONE
*********************************************************************************************************/
VOID _List_Line_Add_Left (PLW_LIST_LINE plineNew, PLW_LIST_LINE plineRight)
{REGISTER PLW_LIST_LINE plineLeft = plineRight->LINE_plistPrev;plineNew->LINE_plistNext = plineRight;plineNew->LINE_plistPrev = plineLeft;if (plineLeft) {plineLeft->LINE_plistNext = plineNew;}plineRight->LINE_plistPrev = plineNew;
}
/*********************************************************************************************************
** 函数名称: _List_Line_Add_Right
** 功能描述: 将新的节点插入指定节点的右侧.
** 输 入 : plineNew 新的节点
** plineLeft 左侧节点
** 输 出 : NONE
*********************************************************************************************************/
VOID _List_Line_Add_Right (PLW_LIST_LINE plineNew, PLW_LIST_LINE plineLeft)
{REGISTER PLW_LIST_LINE plineRight = plineLeft->LINE_plistNext;plineNew->LINE_plistNext = plineRight;plineNew->LINE_plistPrev = plineLeft;if (plineRight) {plineRight->LINE_plistPrev = plineNew;}plineLeft->LINE_plistNext = plineNew;
}
/*********************************************************************************************************
** 函数名称: _List_Line_Del
** 功能描述: 删除一个节点
** 输 入 : plingDel 需要删除的节点
** pplingHeader 链表头
** 输 出 : NONE
*********************************************************************************************************/
VOID _List_Line_Del (PLW_LIST_LINE plineDel, LW_LIST_LINE_HEADER *pplineHeader)
{if (plineDel->LINE_plistPrev == LW_NULL) { /* 表头 */*pplineHeader = plineDel->LINE_plistNext;} else {plineDel->LINE_plistPrev->LINE_plistNext = plineDel->LINE_plistNext;}if (plineDel->LINE_plistNext) {plineDel->LINE_plistNext->LINE_plistPrev = plineDel->LINE_plistPrev;}
}
这篇关于SylixOS里的双向线形管理表实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!