使用C语言封装链表函数

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;
}








  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值