wow-slist文件说明

wow-slist文件说明

  • 项目地址:https://gitee.com/wow-iot/wow-iot7
  • 本文件的的功能主要用于链表相关操作,主要涉及创建、销毁、插入、查找、移除、替换、获取、清空、遍历;

创建与销毁:

Slist_T* wow_slist_create(void)
{
	Slist_T *slist = CALLOC(1,Slist_T);
	CHECK_RET_VAL_ERRNO_P(slist,-SYSTEM_MALLOC_FAILED,"malloc Slist_T failed!\n");
	memset(slist,0,sizeof(Slist_T));

	slist->head = NULL;
	slist->tail = NULL;
	slist->entries = 0;

	return (Slist_T*)slist;
}

void wow_slist_destroy(Slist_T** pptSlist, slist_destroy_func_t destroy)
{
	CHECK_RET_VOID(pptSlist && *pptSlist);

	Slist_T* slist = (Slist_T*)*pptSlist;
	wow_slist_clear(slist, destroy);

	FREE(slist);
	*pptSlist = NULL;
}

在索引出插入

int wow_slist_insert_by_index(Slist_T* ptSlist, int nIdx, void *pData)
{
	SlistEntry_T *new_entry = NULL;
	CHECK_RET_VAL_P(ptSlist,-PARAM_INPUT_STRUCT_IS_NULL,"param input struct invalid!\n");
	CHECK_RET_VAL_P(pData,-PARAM_INPUT_DATA_IS_NULL,"param input data invalid!\n");

	new_entry = CALLOC(1, SlistEntry_T);
	CHECK_RET_VAL_P(new_entry,-SYSTEM_MALLOC_FAILED,"malloc SlistEntry_T faild!\n");
	memset(new_entry,0,sizeof(SlistEntry_T));
	new_entry->data = pData;

	if(nIdx <= 0){
		new_entry->next = ptSlist->head;
		ptSlist->head = new_entry;
		if (ptSlist->tail == NULL){
			ptSlist->tail = new_entry;
		}		
	}else if(nIdx > ptSlist->entries){	
		if (ptSlist->tail){
			ptSlist->tail->next = new_entry;
		}

		ptSlist->tail = new_entry;
		if (ptSlist->head == NULL){
			ptSlist->head = new_entry;
		}
	}else{
		//查找索引位置
		SlistEntry_T *entry = NULL;
		for (entry = ptSlist->head; entry && nIdx > 1; entry = entry->next,nIdx--);
		if(entry == NULL){
			FREE(new_entry);
			return -WOW_FAILED;
		}
		new_entry->next = entry->next;

		if (!entry->next)
			ptSlist->tail = new_entry;

		entry->next = new_entry;
	}

	ptSlist->entries++;
return WOW_SUCCESS;

}

获取内容

void* wow_slist_peek_by_match(Slist_T* ptSlist,slist_match_func_t fMatch,const void *pArg)
{
	SlistEntry_T *entry;

	CHECK_RET_VAL_ERRNO_P(ptSlist,-PARAM_INPUT_STRUCT_IS_NULL,"param input struct invalid!\n");
	CHECK_RET_VAL_ERRNO_P(fMatch,-PARAM_INPUT_DATA_IS_NULL,"param input func invalid!\n");	
	CHECK_RET_VAL_ERRNO_P(pArg,-PARAM_INPUT_DATA_IS_NULL,"param input data invalid!\n");	

	for (entry = ptSlist->head; entry; entry = entry->next)
		if (fMatch(entry->data, pArg))
			return entry->data;

	return NULL;
}

移除内容

int wow_slist_remove_by_index(Slist_T* ptSlist, int nIdx)
{
SlistEntry_T *entry = NULL;
SlistEntry_T *prev	= NULL;

CHECK_RET_VAL_P(ptSlist,PARAM_INPUT_STRUCT_IS_NULL,"param input struct invalid!\n");
CHECK_RET_VAL_P(nIdx >= 0 && nIdx < ptSlist->entries,PARAM_INPUT_ARG_INVALID,"param input arg invalid!\n");	

for (entry = ptSlist->head; entry && nIdx--;prev = entry, entry = entry->next);
CHECK_RET_VAL_P(entry,-1,"remove nIdx entry failed!\n");

if (prev)
	prev->next = entry->next;
else
	ptSlist->head = entry->next;

if (!entry->next) ptSlist->tail = prev;

FREE(entry);
ptSlist->entries--;

return WOW_SUCCESS;
}

替换链表数据内容

int wow_slist_replace_by_index(Slist_T* ptSlist,int nIdx,void *pData)
{
	SlistEntry_T *entry = NULL;

	CHECK_RET_VAL_P(ptSlist,PARAM_INPUT_STRUCT_IS_NULL,"param input struct invalid!\n");
	CHECK_RET_VAL_P(nIdx >= 0 && nIdx < ptSlist->entries,PARAM_INPUT_ARG_INVALID,"param input arg invalid!\n");	

	for (entry = ptSlist->head; entry && nIdx--; entry = entry->next);
	CHECK_RET_VAL_P(entry,-1,"peek nIdx entry failed!\n");

	entry->data = pData;
	return WOW_SUCCESS;
}

清空链表

 int wow_slist_clear(Slist_T* ptSlist,  slist_destroy_func_t fDestroy)
{
	SlistEntry_T *entry = NULL;
	SlistEntry_T *tmp   = NULL;

	CHECK_RET_VAL_P(ptSlist,-PARAM_INPUT_STRUCT_IS_NULL,"param input struct invalid!\n");
	CHECK_RET_VAL(ptSlist->head,0);


	for (entry = ptSlist->head; entry; entry = tmp){
		if(fDestroy) {
			fDestroy(entry->data);
		}
		tmp = entry->next;
		FREE(entry);
	}

	memset(ptSlist, 0, sizeof(Slist_T));

	ptSlist->head = NULL;
	ptSlist->tail = NULL;
	ptSlist->entries = 0; 
	return WOW_SUCCESS;
}

相关推荐

  1. wow-slist文件说明

    2024-04-27 13:24:03       16 阅读
  2. wow-type文件说明

    2024-04-27 13:24:03       16 阅读
  3. wow-socket文件说明

    2024-04-27 13:24:03       17 阅读
  4. wow-string-list文件说明

    2024-04-27 13:24:03       18 阅读
  5. wow_iot模块说明

    2024-04-27 13:24:03       8 阅读
  6. slint1.32 官方文档翻译00

    2024-04-27 13:24:03       31 阅读
  7. slint 1.3.2 官方文档翻译06

    2024-04-27 13:24:03       31 阅读
  8. .gitignore 文件说明文档

    2024-04-27 13:24:03       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-27 13:24:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-27 13:24:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-27 13:24:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-27 13:24:03       20 阅读

热门阅读

  1. android 上传视频

    2024-04-27 13:24:03       12 阅读
  2. 信息的定义及其分类分级

    2024-04-27 13:24:03       14 阅读
  3. 20个 Golang 常见面试问题

    2024-04-27 13:24:03       10 阅读
  4. 关于深度学习图像数据集的主要问题和考虑事项

    2024-04-27 13:24:03       13 阅读
  5. 并行计算+Linux process

    2024-04-27 13:24:03       13 阅读
  6. Docker 容器创建与使用问题汇总

    2024-04-27 13:24:03       10 阅读
  7. git分支更新

    2024-04-27 13:24:03       10 阅读
  8. MATLAB初学者入门(22)—— 哈希算法

    2024-04-27 13:24:03       10 阅读
  9. 2024版GB4806.15直接接触粘合剂第三方检测机构

    2024-04-27 13:24:03       12 阅读
  10. WPF之Label

    2024-04-27 13:24:03       10 阅读