单链表实现

http://www.pudn.com/downloads129/sourcecode/embed/detail552605.html

http://www.verysource.com/abstractrtos-122247.html

sll_pub.h

#ifndef _UTLSLL_H_
#define _UTLSLL_H_

#ifdef  __cplusplus
extern "C" {
#endif

typedef struct SLL_NODE{
   struct SLL_NODE *pNext;
   U32 ulHandle;
}SLL_NODE_S;

typedef struct SLL{
   SLL_NODE_S Head;     
   SLL_NODE_S *Tail;    
   U32         u4_Count; 
}SLL_S;

#define SLL_GET_HANDLE(pNode)	((pNode)->ulHandle)
#define SLL_SET_HANDLE(pNode, ulValue)	((pNode)->ulHandle = (U32)(ulValue))
#define SLL_Init(pList) \
    {\
        (pList)->Head.pNext = &(pList)->Head; \
        (pList)->Tail       = &(pList)->Head; \
        (pList)->u4_Count   = 0;\
    }

#define SLL_Init_Node(pNode) \
        (pNode)->pNext = 0;

#define SLL_Add(pList,pNode) \
        SLL_Insert_In_Middle((pList),(pList)->Tail,(pNode),&(pList)->Head)

#define SLL_Count(pList) ((pList)->u4_Count)

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

#define SLL_Last(pList) \
        ((SLL_Count((pList)) == 0) ? NULL : (pList)->Tail)

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

#define SLL_Is_Node_In_List(pNode) \
        (pNode->pNext != NULL)

#define SLL_Scan(pList,pNode,TypeCast) \
        for(pNode = (TypeCast)(SLL_First((pList))); \
            pNode != NULL; \
            pNode = (TypeCast)SLL_Next((pList),((SLL_NODE_S *)(pNode))))



SLL_NODE_S *SLL_Find(SLL_S *pList, VOID *pKey, S32 (*fnValCmp)(VOID *, SLL_NODE_S *));
VOID SLL_Insert_In_Middle (SLL_S *pList, SLL_NODE_S *pPrev, SLL_NODE_S *pMid, SLL_NODE_S *pNext);
VOID SLL_Delete_In_Middle (SLL_S *pList, 
						   SLL_NODE_S *pPrev, 
                           SLL_NODE_S *pNode, 
                           SLL_NODE_S *pNext);
VOID SLL_Delete (SLL_S *pList, SLL_NODE_S *pNode);
SLL_NODE_S *SLL_Get (SLL_S *pList);
VOID SLL_Insert (SLL_S *pList,SLL_NODE_S *pPrev,SLL_NODE_S *pNode);
SLL_NODE_S *SLL_Previous (SLL_S *pList,SLL_NODE_S *pNode);
VOID SLL_FreeAll (SLL_S *pList, VOID (*fnFree)(VOID *));
S32 SLL_Walk(SLL_S *pList, VOID (*fnVisit)(SLL_NODE_S *));

#ifdef  __cplusplus
}
#endif

#endif

ssp_sll.c

#include "syscfg.h"

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


#include "aos.h"


SLL_NODE_S *SLL_Find(SLL_S *pList, VOID *pKey, 
	S32 (*fnValCmp)(VOID *, SLL_NODE_S *))
{
	SLL_NODE_S *pNode;
	
	SLL_Scan(pList, pNode, SLL_NODE_S *)
	{
		if (!fnValCmp(pKey, pNode))
			return pNode;
	}

	return NULL;
}














VOID SLL_Insert_In_Middle (SLL_S *pList, SLL_NODE_S *pPrev, SLL_NODE_S *pMid, SLL_NODE_S *pNext)
{
 pList->u4_Count++;
 pMid->pNext  = pNext;
 pPrev->pNext = pMid;
 if(pNext == &pList->Head) pList->Tail = pMid;
}
















VOID SLL_Delete_In_Middle (SLL_S *pList, SLL_NODE_S *pPrev, SLL_NODE_S *pNode, SLL_NODE_S *pNext)
{
 
 if(pNext == &pList->Head) pList->Tail = pPrev;
 pPrev->pNext = pNext;
 SLL_Init_Node(pNode);
 pList->u4_Count--;
}











VOID SLL_Delete (SLL_S *pList, SLL_NODE_S *pNode)
{
 SLL_NODE_S *pPrev;

 
 if(!(SLL_Is_Node_In_List(pNode))) return;
 if((pPrev = SLL_Previous(pList,pNode)) == NULL)
    pPrev = &pList->Head;
 SLL_Delete_In_Middle(pList,pPrev,pNode,pNode->pNext);
}











SLL_NODE_S *SLL_Get (SLL_S  *pList)
{
 SLL_NODE_S *pRetNode;

 if(SLL_Count(pList) == 0) return(NULL);
 pRetNode = pList->Head.pNext;
 SLL_Delete_In_Middle(pList,&pList->Head,pList->Head.pNext,pList->Head.pNext->pNext);
 return(pRetNode);
}














VOID SLL_Insert (SLL_S *pList, SLL_NODE_S *pPrev, SLL_NODE_S *pNode)
{
 if(pPrev == NULL) pPrev = &pList->Head;
 SLL_Insert_In_Middle(pList,pPrev,pNode,pPrev->pNext);
}












SLL_NODE_S *SLL_Previous (SLL_S *pList, SLL_NODE_S *pNode)
{
 SLL_NODE_S *pPrev;

 if(pNode == NULL) return(SLL_Last(pList));
 if (!SLL_Count(pList))
	 return NULL;
 for(pPrev = &pList->Head; pNode != pPrev->pNext ; pPrev = pPrev->pNext)
 {
 }
 return((pPrev == &pList->Head) ? NULL : pPrev);
}









VOID SLL_FreeAll (SLL_S *pList, VOID (*fnFree)(VOID *))
{
 SLL_NODE_S *pTempNode,*pNode,*pHead;

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

S32 SLL_Walk(SLL_S *pList, VOID (*fnVisit)(SLL_NODE_S *))
{
	SLL_NODE_S *pNode;
	S32 nCnt;

	nCnt = 0;
	SLL_Scan(pList, pNode, SLL_NODE_S *)
	{
		fnVisit(pNode);
		nCnt++;
	}

	return nCnt;
}

#ifdef __cplusplus
#if __cplusplus
}
#endif 
#endif 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值