GITHUB项目
https://github.com/zhouzhenhecv/linux_c_list
list.h
#include <sys/time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifndef LOG_TRACE
#define LOG_TRACE printf
#define LOG_INFO(msg) \
do{ \
LOG_TRACE msg; \
LOG_TRACE("[%s %d] \n",__FUNCTION__,__LINE__);\
}while(0)
#define LOG_ERROR(err_info) \
do{ \
LOG_TRACE("\033[1;40;31m ");\
LOG_TRACE err_info; \
LOG_TRACE("[%s %d] \033[0m \n",__FUNCTION__,__LINE__);\
}while(0)
#endif
typedef struct list_node_s
{
void *pData;
int nDataLen;
struct list_node_s *pNext;
} list_node_t;
typedef struct list_s
{
list_node_t *pNodeHead;
int nCountNum;
int nMaxCountNum;
}list_t;
int list_create( list_t *pList,int nMaxCount);
int list_destroy( list_t *pList);
int list_get_data(list_t *pList,const void *pKeyData,void *pDesData,int nDataLen,int (*compare)(void *A,void *B));
int list_get_node_address(list_t *pList,list_node_t ** ppListNode,
const void *pKeyData,int (*compare)(void *A,void *B));
int list_exist_node(list_t *pList,const void *pKeyData,int (*compare)(void *A,void *B));
int list_is_empty(list_t *pList);
int list_append( list_t *pList,void *pData,int nDataLen);
int list_delete_node(list_t *pList,const void *pKeyData,int (*compare)(void *A,void *B));
int list_delete_all(list_t *pList);
list.c
#include "list.h"
#include <sys/time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int list_create( list_t *pList,int nMaxCount)
{
if(NULL == pList ||
nMaxCount <= 0)
{
LOG_ERROR(("param error"));
return -1;
}
pList->nCountNum = 0;
pList->pNodeHead = NULL;
pList->nMaxCountNum = nMaxCount;
return 0;
}
int list_destroy( list_t *pList)
{
list_node_t *pListNode = NULL;
list_node_t *pCurListNode = NULL;
LOG_ERROR((" come in "));
if(NULL == pList)
{
LOG_ERROR(("param error"));
return -1;
}
if(NULL == pList->pNodeHead)
{
pList->nCountNum = 0;
return 0;
}
pListNode = pList->pNodeHead;
// 1.Node by node release
while(NULL != pListNode)
{
pCurListNode = pListNode;
pListNode = pListNode->pNext ;
if(NULL != pCurListNode->pData)
{
free(pCurListNode->pData); //free node data
}
free(pCurListNode);// free list node
}
pList->pNodeHead = NULL;
pList->nCountNum = 0;
pList->nMaxCountNum = 0;
return 0;
}
int list_get_data(list_t *pList,const void *pKeyData,void *pDesData,int nDataLen,int (*compare)(void *A,void *B))
{
list_node_t *pListNode = NULL;
list_node_t *pCurListNode = NULL;
list_node_t *pListNodeTmp = NULL;
if((NULL == pList) ||
(NULL == pList->pNodeHead) ||
(NULL == pDesData) ||
(nDataLen <= 0 )||
(NULL == pKeyData))
{
LOG_ERROR(("param error"));
return -1;
}
pListNode = pList->pNodeHead;
pCurListNode = pListNode;
while(NULL != pListNode)
{
if(0 == compare(pKeyData,pListNode->pData))
{
break;
}
pListNode = pListNode->pNext;
pCurListNode = pListNode;
}
if(NULL == pCurListNode)
{
LOG_ERROR(("not found"));
return -1;
}
//find pCurList
memset(pDesData, 0, nDataLen);
memcpy(pDesData, pCurListNode->pData,nDataLen);
return 0;
}
int list_get_node_address(list_t *pList,list_node_t ** ppListNode,const void *pKeyData,int (*compare)(void *A,void *B))
{
list_node_t *pListNode = NULL;
list_node_t *pCurListNode = NULL;
list_node_t *pListNodeTmp = NULL;
if((NULL == pList) ||
(NULL == pList->pNodeHead) ||
(NULL == ppListNode)||
(NULL == pKeyData) )
{
LOG_ERROR(("param error"));
return -1;
}
pListNode = pList->pNodeHead;
pCurListNode = pListNode;
while(NULL != pListNode)
{
if(0 == compare(pKeyData,pListNode->pData))
{
break;
}
pListNode = pListNode->pNext;
pCurListNode = pListNode;
}
if(NULL == pCurListNode)
{
LOG_ERROR(("not found"));
*ppListNode = NULL;
return -1;
}
//find pCurList
*ppListNode = pCurListNode;
return 0;
}
int list_exist_node(list_t *pList,const void *pKeyData,int (*compare)(void *A,void *B))
{
list_node_t *pListNode = NULL;
list_node_t *pCurListNode = NULL;
list_node_t *pListNodeTmp = NULL;
if((NULL == pList) ||
(NULL == pKeyData))
{
LOG_ERROR(("param error"));
return -1;
}
if((NULL == pList->pNodeHead) && (pList->nCountNum == 0))
{
LOG_ERROR(("not found in list "));
return -1;
}
pListNode = pList->pNodeHead;
pCurListNode = pListNode;
while(NULL != pListNode)
{
if(0 == compare(pKeyData,pListNode->pData))
{
break;
}
pListNode = pListNode->pNext;
pCurListNode = pListNode;
}
if(NULL == pCurListNode)
{
LOG_ERROR(("not found in list "));
return -1;
}
LOG_ERROR(("--------found in list "));
return 0;
}
int list_is_empty(list_t *pList)
{
if(NULL == pList)
{
LOG_ERROR(("param error"));
return -1;
}
if((NULL == pList->pNodeHead)
&& (0 == pList->nCountNum) )
{
return 1; // 1 is empty
}
return 0; //0 is not empty
}
int list_append( list_t *pList,void *pData,int nDataLen)
{
list_node_t *pListNode = NULL;
list_node_t *pCurListNode = NULL;
list_node_t *pListNodeTmp = NULL;
if((NULL == pList) ||
(NULL == pData) ||
(nDataLen <= 0))
{
LOG_ERROR(("param error"));
return -1;
}
if(pList->nCountNum >= pList->nMaxCountNum)
{
LOG_ERROR(("list is full ,error!"));
return -1;
}
pListNode = pList->pNodeHead;
pCurListNode = pListNode;
if(NULL != pListNode) //无节点,则不进入循环
{
while(NULL != pListNode->pNext)
{
pListNode = pListNode->pNext;
pCurListNode = pListNode;
}
}
pListNodeTmp = (list_node_t * )malloc(sizeof(list_node_t));
if(NULL == pListNodeTmp)
{
LOG_ERROR(("no enough memory!"));
return -1;
}
pListNodeTmp->pData= NULL;
pListNodeTmp->pNext = NULL;
pListNodeTmp->pData= (void *)malloc(nDataLen);
if(NULL == pListNodeTmp->pData)
{
LOG_ERROR(("no enough memory!"));
free(pListNodeTmp);
return -1;
}
memset(pListNodeTmp->pData, 0,nDataLen);
memcpy(pListNodeTmp->pData, pData,nDataLen);
if(NULL != pCurListNode)
{
pCurListNode->pNext = pListNodeTmp; //add list node 当前链表大于1个节点
}
else
{//add list node
pCurListNode = pListNodeTmp;//0个节点的时候
pList->pNodeHead = pListNodeTmp;;
}
pList->nCountNum++;
return 0;
}
int list_delete_node(list_t *pList,const void *pKeyData,int (*compare)(void *A,void *B))
{
list_node_t *pListNode = NULL;
list_node_t *pCurListNode = NULL;
list_node_t *pPreListNode = NULL;
list_node_t *pListNodeTmp = NULL;
if((NULL == pList) ||
(NULL == pList->pNodeHead) ||
(NULL == pKeyData))
{
LOG_ERROR(("param error"));
return -1;
}
pListNode = pList->pNodeHead;
pCurListNode = pListNode;
pPreListNode = pListNode;
while(NULL != pListNode)
{
if(0 == compare(pKeyData,pListNode->pData))
{
break;
}
pPreListNode = pListNode;
pListNode = pListNode->pNext;
pCurListNode = pListNode;
}
if(NULL == pCurListNode)
{
LOG_ERROR(("not found"));
return -1;
}
else
{
//(free)
if(pListNode == pPreListNode) //第一个节点
{
pList->pNodeHead = pPreListNode->pNext;
if(NULL != pPreListNode->pData)
{
free(pPreListNode->pData);
}
free(pPreListNode);
}
else
{
pPreListNode->pNext = pCurListNode->pNext;
if(NULL != pCurListNode->pData)
{
free(pCurListNode->pData);
}
free(pCurListNode);
}
}
pList->nCountNum--;
if(pList->nCountNum < 0)
{
LOG_ERROR((" pList->nCountNum error"));
return -1;
}
return 0;
}
int list_delete_all(list_t *pList)
{
list_node_t *pListNode = NULL;
list_node_t *pCurListNode = NULL;
if((NULL == pList) ||
((NULL != pList) && (NULL == pList->pNodeHead)))
{
LOG_ERROR(("param error"));
return -1;
}
pListNode = pList->pNodeHead;
pCurListNode = pListNode;
while(NULL != pListNode)
{
pListNode = pListNode->pNext;
if(NULL != pCurListNode->pData)
{
free(pCurListNode->pData);
}
free(pCurListNode);
pCurListNode = pListNode;
}
pList->pNodeHead = NULL;
pList->nCountNum = 0;
return 0;
}
int list_dump(list_t *pList,int (*print_list_dump)(void *))
{
list_node_t *pListNode = NULL;
int i = 0;
if((NULL == pList) ||
((NULL != pList) && (NULL == pList->pNodeHead)))
{
LOG_ERROR(("param error"));
return -1;
}
pListNode = pList->pNodeHead;
while(NULL != pListNode)
{
LOG_ERROR(("list node %d",i));
i++;
print_list_dump(pListNode->pData);
pListNode = pListNode->pNext;
}
return 0;
}
test.c
#include "list.h"
const char chData[10][100]={"123","124","125","126","666",
"234","345","456","567","678"};
int compare(void *A,void *B)
{
return strcmp((char *)A,(char*)B);
}
int print_list_dump(void *arg)
{
printf("\n [%s]\n",(char *)arg);
return 0;
}
int example()
{
static list_t s_List;
int MaxCountListNode = 30;
int ret = -1;
int i = 0;
char chTmp[255]={0};
//list_create(list_t * pList,int nMaxCount)
ret = list_create(&s_List,MaxCountListNode);
if(0 != ret)
{
LOG_ERROR(("list_create error"));
return -1;
}
LOG_ERROR(("list_create success"));
ret = list_is_empty(&s_List);
LOG_ERROR(("list_is_empty ret[%d]",ret));
for(i = 0; i< 10; i++)
{
//list_append(list_t * pList,void * pData,int nDataLen)
ret = list_append(&s_List,chData[i],sizeof(chData[i]));
if(0 != ret)
{
LOG_ERROR(("list_append error"));
list_destroy(&s_List);
return -1;
}
LOG_ERROR(("list_append [%s] success",chData[i]));
}
//int list_get_data(list_t *pList,const void *pKeyData,void *pDesData,int nDataLen,int (*compare)(void *A,void *B))
ret = list_get_data(&s_List,"666",chTmp,sizeof(chData[0]),compare);
if(0 == ret )
{
LOG_ERROR(("list_get_data chTmp [%s]",chTmp));
}
else
{
LOG_ERROR(("list_get_data failed"));
}
{
list_node_t * pListNode = NULL;
//list_get_node_address(list_t *pList,list_node_t ** ppListNode,const void *pKeyData,int (*compare)(void *A,void *B))
ret = list_get_node_address(&s_List,&pListNode,"456",compare);
if(0 == ret)
{
LOG_ERROR(("list_get_node_address pListNode->pData [%s]",(char *)(pListNode->pData)));
strncpy(pListNode->pData,"111",sizeof("111"));
}
else
{
LOG_ERROR(("list_get_node_address failed"));
}
}
ret = list_exist_node(&s_List,"111",compare);
if(0 == ret)
{
LOG_ERROR(("list_exist_node ret[%d]",ret));
}
// int list_is_empty(list_t *pList)
ret = list_is_empty(&s_List);
LOG_ERROR(("list_is_empty ret[%d]",ret));
list_dump(&s_List,print_list_dump);
#if 1
{
//int list_delete_node(list_t *pList,const void *pKeyData,int (*compare)(void *A,void *B))
list_delete_node(&s_List,"21xd",compare);
list_dump(&s_List,print_list_dump);
}
#endif
#if 1
{
list_delete_all(&s_List);
list_dump(&s_List,print_list_dump);
}
#endif
ret = list_destroy(&s_List);
if(0 != ret)
{
LOG_ERROR(("list_destroy error"));
return -1;
}
return 0;
}
int main()
{
example();
return 0;
}