使用C语言封装链表函数

来源:互联网 发布:淘宝开零食店需要什么 编辑:程序博客网 时间:2024/05/22 07:42

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)#endiftypedef 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 releasewhile(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 pCurListmemset(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 nodepCurListNode = 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);}#endifret = list_destroy(&s_List);if(0 != ret){LOG_ERROR(("list_destroy error"));return -1;}return 0;}int main(){example();return 0;}







原创粉丝点击