一个通用链表模块(C语言)
来源:互联网 发布:淘宝西班牙代购真假 编辑:程序博客网 时间:2024/05/22 03:21
1)把所有DBG和ERR改成printf;
2)COMMOM_Malloc改成malloc;
3)COMMON_Free改成free;
4)所有的CHECK写一个空的宏即可(原来作为参数合法性检查);
5)编译Ok;
#ifndef __LIST_H__#define __LIST_H__#ifdef __cplusplus#if __cplusplusextern "C"{#endif#endiftypedef void* LIST_HANDLE;LIST_HANDLE LIST_Init(int _s32NodeDataSize);int LIST_Destroy(LIST_HANDLE _hndList);int LIST_AddToHead(LIST_HANDLE _hndList, void* _pData, int _s32DataSize);int LIST_AddToTail(LIST_HANDLE _hndList, void* _pData, int _s32DataSize);int LIST_Delete(LIST_HANDLE _hndList, void* pData);int LIST_DeleteHead(LIST_HANDLE _hndList);int LIST_DeleteTail(LIST_HANDLE _hndList);int LIST_Clear(LIST_HANDLE _hndList);int LIST_GetCnt(LIST_HANDLE _hndList);void* LIST_GetHead(LIST_HANDLE _hndList);void* LIST_GetTail(LIST_HANDLE _hndList);void* LIST_GetNextNode(LIST_HANDLE _hndList, void* pData);void* LIST_GetPrevNode(LIST_HANDLE _hndList, void* pData);int LIST_IsEmpty(LIST_HANDLE _hndList);#ifdef __cplusplus#if __cplusplus}#endif#endif#endif
#include "list.h"#include "debug.h"#include "common.h"#define LIST_MAGIC_NUM 0xabcd0000typedef struct LIST_NODE_S{ void* pData; struct LIST_NODE_S* pstNext; struct LIST_NODE_S* pstPrev;}LIST_NODE_S;typedef struct LIST_S{ unsigned int u32MagicNumer; int s32Cnt; // node numbers of list int s32NodeDataSize; // node size LIST_NODE_S* pstHead; LIST_NODE_S* pstTail;}LIST_S;static LIST_NODE_S* LIST_LookUp(LIST_HANDLE _hndList, void* pData){ LIST_S* pstList = (LIST_S*)_hndList; LIST_NODE_S* tmp = pstList->pstHead; while (NULL != tmp) { if (tmp->pData == pData) { return tmp; } tmp = tmp->pstNext; } ERR("the node is not exist.\n"); return NULL;}LIST_HANDLE LIST_Init(int s32NodeDataSize){ CHECK(s32NodeDataSize > 0, NULL, "invalid parameter.\n"); LIST_S* pstList = (LIST_S*)COMMON_Malloc(sizeof(LIST_S)); CHECK(NULL != pstList, NULL, "failed to malloc %d\n", sizeof(LIST_S)); memset(pstList, 0, sizeof(LIST_S)); pstList->s32NodeDataSize = s32NodeDataSize; pstList->s32Cnt = 0; pstList->pstHead = NULL; pstList->pstTail = NULL; pstList->u32MagicNumer = LIST_MAGIC_NUM; return (LIST_HANDLE)pstList;}int LIST_Destroy(LIST_HANDLE _hndList){ CHECK(NULL != _hndList, -1, "invalid parameter.\n"); int ret = -1; ret = LIST_Clear(_hndList); CHECK(!ret, ret, "error: ret is %d\n", ret); ret = COMMON_Free(_hndList); CHECK(!ret, ret, "error: ret is %d\n", ret); return ret;}int LIST_AddToHead(LIST_HANDLE _hndList, void* pData, int DataSize){ CHECK(NULL != _hndList, -1, "invalid parameter.\n"); CHECK(NULL != pData, -1, "invalid parameter.\n"); LIST_S* pstList = (LIST_S*)_hndList; CHECK(pstList->s32NodeDataSize == DataSize, -1, "invalid parameter.\n"); LIST_NODE_S* pstNewNode = (LIST_NODE_S*)COMMON_Malloc(sizeof(LIST_NODE_S) + pstList->s32NodeDataSize); CHECK(NULL != pstNewNode, -1, "failed to malloc %d\n", sizeof(LIST_NODE_S) + pstList->s32NodeDataSize); memset(pstNewNode, 0, sizeof(LIST_NODE_S) + pstList->s32NodeDataSize); pstNewNode->pData = (void*)(pstNewNode+1); memcpy(pstNewNode->pData, pData, pstList->s32NodeDataSize); if (NULL == pstList->pstTail && NULL == pstList->pstHead) { pstList->pstHead = pstNewNode; pstList->pstTail = pstNewNode; pstNewNode->pstNext = NULL; pstNewNode->pstPrev = NULL; } else { pstList->pstHead->pstPrev = pstNewNode; pstNewNode->pstNext = pstList->pstHead; pstList->pstHead = pstNewNode; pstNewNode->pstPrev = NULL; } pstList->s32Cnt++; return 0;}int LIST_AddToTail(LIST_HANDLE _hndList, void* pData, int DataSize){ CHECK(NULL != _hndList, -1, "invalid parameter.\n"); CHECK(NULL != pData, -1, "invalid parameter.\n"); LIST_S* pstList = (LIST_S*)_hndList; CHECK(pstList->s32NodeDataSize == DataSize, -1, "invalid parameter.\n"); LIST_NODE_S* pstNewNode = (LIST_NODE_S*)COMMON_Malloc(sizeof(LIST_NODE_S) + pstList->s32NodeDataSize); CHECK(NULL != pstNewNode, -1, "failed to malloc %d\n", sizeof(LIST_NODE_S) + pstList->s32NodeDataSize); memset(pstNewNode, 0, sizeof(LIST_NODE_S) + pstList->s32NodeDataSize); pstNewNode->pData = (void*)(pstNewNode+1); memcpy(pstNewNode->pData, pData, pstList->s32NodeDataSize); if (NULL == pstList->pstTail && NULL == pstList->pstHead) { pstList->pstHead = pstNewNode; pstList->pstTail = pstNewNode; pstNewNode->pstNext = NULL; pstNewNode->pstPrev = NULL; } else { pstList->pstTail->pstNext = pstNewNode; pstNewNode->pstPrev = pstList->pstTail; pstList->pstTail = pstNewNode; pstNewNode->pstNext = NULL; } pstList->s32Cnt++; return 0;}int LIST_Delete(LIST_HANDLE _hndList, void* pData){ CHECK(NULL != _hndList, -1, "invalid parameter.\n"); CHECK(NULL != pData, -1, "invalid parameter.\n"); int ret = -1; LIST_S* pstList = (LIST_S*)_hndList; LIST_NODE_S* pstFind = LIST_LookUp(pstList, pData); if (NULL != pstFind) { if (pstList->s32Cnt == 1) { pstList->pstHead = NULL; pstList->pstTail = NULL; } else { if (pstFind == pstList->pstHead) { pstList->pstHead->pstNext->pstPrev = NULL; pstList->pstHead = pstList->pstHead->pstNext; } else if (pstFind == pstList->pstTail) { pstList->pstTail->pstPrev->pstNext = NULL; pstList->pstTail = pstList->pstTail->pstPrev; } else { pstFind->pstPrev->pstNext = pstFind->pstNext; pstFind->pstNext->pstPrev = pstFind->pstPrev; } } ret = COMMON_Free(pstFind); CHECK(!ret, ret, "error: ret is %d\n", ret); pstList->s32Cnt--; } return ret;}int LIST_DeleteHead(LIST_HANDLE _hndList){ CHECK(NULL != _hndList, -1, "invalid parameter.\n"); int ret = -1; LIST_S* pstList = (LIST_S*)_hndList; if (NULL != pstList->pstHead) { if (pstList->s32Cnt == 1) // only one node { ret = COMMON_Free(pstList->pstHead); CHECK(!ret, ret, "error: ret is %d\n", ret); pstList->pstHead = NULL; pstList->pstTail = NULL; } else { LIST_NODE_S* tmp = pstList->pstHead; pstList->pstHead->pstNext->pstPrev = NULL; pstList->pstHead = pstList->pstHead->pstNext; ret = COMMON_Free(tmp); CHECK(!ret, ret, "error: ret is %d\n", ret); } pstList->s32Cnt--; //DBG("delete head node success.list size: %d\n", pstList->s32Cnt); } return ret;}int LIST_DeleteTail(LIST_HANDLE _hndList){ CHECK(NULL != _hndList, -1, "invalid parameter.\n"); int ret = -1; LIST_S* pstList = (LIST_S*)_hndList; if (NULL != pstList->pstTail) { if (pstList->s32Cnt == 1) // only one node { ret = COMMON_Free(pstList->pstTail); CHECK(!ret, ret, "error: ret is %d\n", ret); pstList->pstHead = NULL; pstList->pstTail = NULL; } else { LIST_NODE_S* tmp = pstList->pstTail; pstList->pstTail->pstPrev->pstNext = NULL; pstList->pstTail = pstList->pstTail->pstPrev; ret = COMMON_Free(tmp); CHECK(!ret, ret, "error: ret is %d\n", ret); } pstList->s32Cnt--; //DBG("delete tail node success.list size: %d\n", pstList->s32Cnt); } return ret;}int LIST_Clear(LIST_HANDLE _hndList){ CHECK(NULL != _hndList, -1, "invalid parameter.\n"); int ret = -1; while (LIST_GetCnt(_hndList) > 0) { ret = LIST_DeleteTail(_hndList); CHECK(!ret, ret, "error: ret is %d\n", ret); } return ret;}int LIST_GetCnt(LIST_HANDLE _hndList){ CHECK(NULL != _hndList, -1, "invalid parameter.\n"); LIST_S* pstList = (LIST_S*)_hndList; return pstList->s32Cnt;}void* LIST_GetHead(LIST_HANDLE _hndList){ CHECK(NULL != _hndList, NULL, "invalid parameter.\n"); LIST_S* pstList = (LIST_S*)_hndList; return (pstList->pstHead) ? pstList->pstHead->pData : NULL;}void* LIST_GetTail(LIST_HANDLE _hndList){ CHECK(NULL != _hndList, NULL, "invalid parameter.\n"); LIST_S* pstList = (LIST_S*)_hndList; return (pstList->pstTail) ? pstList->pstTail->pData : NULL;}int LIST_IsEmpty(LIST_HANDLE _hndList){ CHECK(NULL != _hndList, -1, "invalid parameter.\n"); LIST_S* pstList = (LIST_S*)_hndList; return (pstList->s32Cnt == 0);}void* LIST_GetNextNode(LIST_HANDLE _hndList, void* pData){ CHECK(NULL != _hndList, NULL, "invalid parameter.\n"); CHECK(NULL != pData, NULL, "invalid parameter.\n"); LIST_NODE_S* pstFind = LIST_LookUp(_hndList, pData); if (NULL != pstFind && NULL != pstFind->pstNext) { return pstFind->pstNext->pData; } return NULL;}void* LIST_GetPrevNode(LIST_HANDLE _hndList, void* pData){ CHECK(NULL != _hndList, NULL, "invalid parameter.\n"); CHECK(NULL != pData, NULL, "invalid parameter.\n"); LIST_NODE_S* pstFind = LIST_LookUp(_hndList, pData); if (NULL != pstFind && NULL != pstFind->pstPrev) { return pstFind->pstPrev->pData; } return NULL;}
0 0
- 一个通用链表模块(C语言)
- c语言实现通用数据结构(一):通用链表
- c语言实现通用数据结构(一):通用链表
- C语言的通用链表
- 用C语言实现通用链表
- C语言通用链表实现
- 纯c语言通用链表
- c语言数据结构之通用链表
- 通用双向链表的C语言实现
- C语言通用数据类型链表的实现
- 双向循环链表 C语言通用编程的思考
- C语言通用双向链表的实现
- C语言实现通用链表初步(一)
- C语言实现通用链表初步(二)
- C语言实现通用链表初步(三)----单元测试
- C语言通用双向循环链表操作函数集
- C语言中如何使用通用双向链表
- 实现通用的双向链表(c语言实现)
- Oracle trunc()函数的用法
- nodejs 阻塞与非阻塞
- 局部变量创建非模态对话框
- CSS相邻选择符
- iOS学习笔记27-摄像头
- 一个通用链表模块(C语言)
- 用Eclipse开发安卓-无法正常预览布局文件layout.xml
- [leetcode] 107. Binary Tree Level Order Traversal II
- mysql不同字段类型所占用的空间
- ios7 statusbar透明设置
- CodeForces 467C George and Job
- 弹出广告视图
- 模板的特化
- 实习笔记4