双链表实现

dll_pub.h

#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif 
#endif 

#ifndef __INC_DLL_PUB_H__
#define __INC_DLL_PUB_H__


#define DLL_GET_HANDLE(pNode)	((pNode)->ulHandle)
#define DLL_SET_HANDLE(pNode, ulValue)	((pNode)->ulHandle = (U32)(ulValue))


#define DLL_Init(pList) \
    {\
        (pList)->Head.pNext = &(pList)-> Head; \
        (pList)->Head.pPrev = &(pList)-> Head; \
        (pList)->ulCount   = 0; \
    }


#define DLL_Init_Node(pNode) \
        (pNode)->pPrev = (pNode)->pNext = NULL;

#define DLL_Add(pList,pNode) \
        dll_insert_in_middle((pList),(pList)->Head.pPrev,(pNode),&(pList)->Head)

#define DLL_Count(pList) ((pList)->ulCount)

#define DLL_First(pList) \
        ((DLL_Count((pList)) == 0) ? NULL: (pList)->Head.pNext)

#define DLL_Last(pList) \
        ((DLL_Count((pList)) == 0) ? NULL : (pList)->Head.pPrev)

#define DLL_Next(pList,pNode) \
        (((pNode) == NULL) ? DLL_First(pList) : \
        (((pNode)->pNext == &(pList)->Head) ? NULL : (pNode)->pNext))

#define DLL_Previous(pList,pNode) \
        (((pNode) == NULL) ? DLL_Last(pList) : \
        (((pNode)->pPrev == &(pList)->Head) ? NULL : (pNode)->pPrev))

#define DLL_Is_Node_In_List(pNode) \
        (((pNode)->pNext != NULL) && \
         ((pNode)->pPrev != NULL) && \
         ((pNode)->pNext->pPrev == pNode) && \
         ((pNode)->pPrev->pNext == pNode))

#define DLL_Scan(pList,pNode,TypeCast) \
        for(pNode = (TypeCast)(DLL_First((pList))); \
            pNode != NULL; \
            pNode = (TypeCast)(DLL_Next((pList),((DLL_NODE_S *)(pNode)))))
            





typedef struct dll_node
{
    struct dll_node *pNext; 
    struct dll_node*pPrev; 
    U32 ulHandle;	
}DLL_NODE_S;

typedef struct DLL{
    DLL_NODE_S Head;  
    U32      ulCount; 
}DLL_S;




DLL_NODE_S *dll_find(DLL_S *pList, VOID *pKey, 
	S32 (*fnValCmp)(VOID *, DLL_NODE_S *));
VOID  dll_insert_in_middle (DLL_S *pList, DLL_NODE_S *pPrev, DLL_NODE_S *pMid, DLL_NODE_S *pNext);
#undef dll_insert 
VOID  dll_insert (DLL_S *pList, DLL_NODE_S *pPrev, DLL_NODE_S *pNode);
VOID  dll_delete_in_middle (DLL_S *pList, DLL_NODE_S *pPrev, DLL_NODE_S *pNode, DLL_NODE_S *pNext);
VOID  dll_delete(DLL_S *pList, DLL_NODE_S *pNode);
DLL_NODE_S *dll_get (DLL_S *pList);
VOID dll_free_all (DLL_S *pList, VOID (*fnFree)(VOID *));
S32 dll_walk(DLL_S *pList, VOID (*fnVisit)(DLL_NODE_S *));

#endif

#ifdef __cplusplus
#if __cplusplus
}
#endif 
#endif 

ssp_dll.c

#include "syscfg.h"

#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif 
#endif 

#include "aos.h"

DLL_NODE_S *dll_find(DLL_S *pList, VOID *pKey, 
	S32 (*fnValCmp)(VOID *, DLL_NODE_S *))
{
	DLL_NODE_S *pNode;
	
	DLL_Scan(pList, pNode, DLL_NODE_S *)
	{
		if (!fnValCmp(pKey, pNode))
			return pNode;
	}

	return NULL;
}

VOID dll_insert_in_middle (DLL_S  *pList, DLL_NODE_S *pPrev, DLL_NODE_S *pMid, DLL_NODE_S *pNext)
{
    pList->ulCount++;
    pMid->pNext  = pNext;
    pMid->pPrev  = pPrev;
    pPrev->pNext = pMid;
    pNext->pPrev = pMid;
}

VOID dll_delete_in_middle (DLL_S  *pList, DLL_NODE_S *pPrev, DLL_NODE_S *pNode, DLL_NODE_S *pNext)
{
    pPrev->pNext = pNext;
    pNext->pPrev = pPrev;
    DLL_Init_Node(pNode);
    (pList)->ulCount--;
}

VOID dll_insert (DLL_S  *pList, DLL_NODE_S *pPrev, DLL_NODE_S *pNode)
{
    if(pPrev == NULL)
    {
        pPrev = &pList->Head;
    }
    dll_insert_in_middle(pList,pPrev,pNode,pPrev->pNext);
}


VOID dll_delete(DLL_S *pList, DLL_NODE_S *pNode)
{
    if (DLL_Is_Node_In_List(pNode))
    {
        dll_delete_in_middle(pList, pNode->pPrev, pNode, pNode->pNext);
    }
}

DLL_NODE_S *dll_get (DLL_S *pList)
{
    DLL_NODE_S *pRetNode;

    if(DLL_Count(pList) == 0)
    {
        return(NULL);
    }

    pRetNode = pList->Head.pNext;
    dll_delete_in_middle(pList,&pList->Head,pList->Head.pNext,pList->Head.pNext->pNext);

    return(pRetNode);
}

VOID dll_free_all(DLL_S *pList, VOID (*fnFree)(VOID *))
{
    DLL_NODE_S *pTempNode,*pNode,*pHead;

    for(pHead = &pList->Head,pNode = pList->Head.pNext; pNode != pHead; pNode = pTempNode)
    {
        pTempNode = pNode->pNext;
        fnFree(pNode);
    }

    DLL_Init(pList);
}

S32 dll_walk(DLL_S *pList, VOID (*fnVisit)(DLL_NODE_S *))
{
    DLL_NODE_S *pNode;
    S32 nCnt;
    
    nCnt = 0;
    DLL_Scan(pList, pNode, DLL_NODE_S *)
    {
        fnVisit(pNode);
        nCnt++;
    }

    return nCnt;
}

#ifdef __cplusplus
#if __cplusplus
}
#endif 
#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值