这是代码主要部分
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "utils_def.h"
#include "utils_errcode.h"
typedef struct tagListNodeData
{
CHAR szName[STR_LEN_32];
ULONG ulAge;
// 如有增加,请在此处添加
}LIST_NODE_DATA_S;
typedef struct tagNode
{
struct NODE_S *pstNext;
LIST_NODE_DATA_S stData;
}NODE_S;
typedef struct tagSingleList
{
ULONG ulNodeNum; // 减少链表遍历,如果链表过大,耗时过久
NODE_S *pstHead;
#if 0
// MUTEX
#endif
}SINGLE_LIST_S;
static SINGLE_LIST_S g_stList = {
0 };
SINGLE_LIST_S * GetList()
{
return &g_stList;
}
// 获取链表节点个数
ULONG GetListNodeNum()
{
return GetList()->ulNodeNum;
}
// 通过遍历来获取个数
ULONG GetListNodeNumByTraverse()
{
ULONG ulLen = 0;
SINGLE_LIST_S *pstList = GetList();
// 当前节点,默认为head
NODE_S *pstCurNode = pstList->pstHead;
while (NULL != pstCurNode)
{
ulLen++;
pstCurNode = pstCurNode->pstNext;
}
return ulLen;
}
// 在位置pos处插入链表,pstNewNode必须是malloc出来的空间
LONG InsertInList(IN ULONG ulPos, IN LIST_NODE_DATA_S *pstData)
{
if (NULL == pstData) return EC_COMMON_INVALID_ARGS;
ULONG ulNodeNum = GetListNodeNum();
if ((ulPos > ulNodeNum + 1) || (ulPos < 1))
{
return EC_COMMON_INVALID_ARGS;
}
SINGLE_LIST_S *pstList = GetList();
NODE_S *pstNewNode = NULL;
ULONG ulDataLen = 0;
pstNewNode = (NODE_S *)malloc(sizeof(NODE_S));
if (NULL == pstNewNode)
{
// log
return EC_COMMON_OUT_MEM;
}
memcpy(&(pstNewNode->stData), pstData, sizeof(LIST_NODE_DATA_S));
// 在表头或表尾插入数据时不一样的
if (1 == ulPos)
{
pstNewNode->pstNext = pstList->pstHead;
pstList->pstHead = pstNewNode;
}
else
{
NODE_S *pstPre = pstList->pstHead;
ULONG ulCnt = 1;
while (ulCnt < ulPos - 1)
{
pstPre = pstPre->pstNext;
ulCnt++;
}
NODE_S *pstCur = pstPre->pstNext;
pstNewNode->pstNext = pstCur;
pstPre->pstNext = pstNewNode;
}
// update 数据
pstList->ulNodeNum += 1;
return EC_COMMON_OK;
}
// 删除某个节点
LONG DelListNode(ULONG ulPos)
{