/**
*****************************************************************************
* @file zf_list.c
* @author Zorb
* @version V1.0.0
* @date 2018-06-28
* @brief 简单列表的实现
*****************************************************************************
* @history
*
* 1. Date:2018-06-28
* Author:Zorb
* Modification:建立文件
*
*****************************************************************************
*/
#include "zf_list.h"
#include "zf_assert.h"
#include "zf_debug.h"
#include "zf_malloc.h"
/******************************************************************************
* 描述 :创建列表(内部分配空间)
* 参数 :(out)-ppList 列表指针的指针
* 返回 :无
******************************************************************************/
bool List_create(List **ppList)
{
List *pList;
ZF_ASSERT(ppList != (List **)0)
/* 分配空间 */
pList = ZF_MALLOC(sizeof(List));
if (pList == NULL)
{
ZF_DEBUG(LOG_E, "malloc list space error\r\n");
return false;
}
/* 初始化成员 */
pList->pRootNode = NULL;
pList->Count = 0;
/* 初始化方法 */
pList->Add = List_add;
pList->Delete = List_delete;
pList->Remove = List_remove;
pList->GetElementAt = List_getElementAt;
pList->GetElementByData = List_getElementByData;
pList->GetElementDataAt = List_getElementDataAt;
pList->GetElementIndex = List_getElementIndex;
pList->AddElementAt = List_addElementAt;
pList->DeleteElementAt = List_deleteElementAt;
pList->RemoveElementAt = List_removeElementAt;
pList->Clear = List_clear;
pList->Dispose = List_dispose;
/* 输出 */
*ppList = pList;
return true;
}
/******************************************************************************
* 描述 :在尾端增加节点
* 参数 :(in)-pList 列表结构体指针
* (in)-pNode 要增加的节点
* 返回 :-true 成功
* -false 失败
******************************************************************************/
bool List_add(List * const pList, ListNode *pNode)
{
ZF_ASSERT(pList != (List *)0)
ZF_ASSERT(pNode != (ListNode *)0)
return List_addElementAt(pList, pList->Count, pNode);
}
/******************************************************************************
* 描述 :删除节点(内部释放空间)
* 参数 :(in)-pList 列表结构体指针
* (in)-pNode 要删除的节点
* 返回 :-true 成功
* -false 失败
******************************************************************************/
bool List_delete(List * const pList, ListNode *pNode)
{
/* 返回结果 */
bool res = false;
/* 要删除节点的前一个节点 */
ListNode *pPreviousNode;
ZF_ASSERT(pList != (List *)0)
ZF_ASSERT(pNode != (ListNode *)0)
/* 要删除的是根节点 */
if (pNode == pList->pRootNode)
{
pList->pRootNode = pNode->Next;
pList->Count--;
/* 释放空间 */
List_freeNode(pNode);
res = true;
}
/* 要删除的不是根节点 */
else
{
pPreviousNode = pList->pRootNode;
while (pPreviousNode->Next != pNode)
{
pPreviousNode = pPreviousNode->Next;
}
/* 找到要删除的节点 */
if(pPreviousNode != NULL || pPreviousNode->Next == pNode)
{
pPreviousNode->Next = pNode->Next;
pList->Count--;
/* 释放空间 */
List_freeNode(pNode);
res = true;
}
}
return res;
}
/******************************************************************************
* 描述 :移除节点(内部不释放空间)
* 参数 :(in)-pList 列表结构体指针
* (in)-pNode 要删除的节点
* 返回 :-true 成功
* -false 失败
******************************************************************************/
bool List_remove(List * const pList, ListNode *pNode)
{
/* 返回结果 */
bool res = false;
/* 要移除节点的前一个节点 */
ListNode *pPreviousNode;
ZF_ASSERT(pList != (List *)0)
ZF_ASSERT(pNode != (ListNode *)0)
/* 要移除的是根节点 */
if (pNode == pList->pRootNode)
{
pList->pRootNode = pNode->Next;
pList->Count--;
res = true;
}
/* 要移除的不是根节点 */
else
{
pPreviousNode = pList->pRootNode;
while (pPreviousNode->Next != pNode)
{
pPreviousNode = pPreviousNode->Next;
}
/* 找到要移除的节点 */
if(pPreviousNode != NULL || pPreviousNode->Next == pNode)
{
pPreviousNode->Next = pNode->Next;
pList->Count--;
res = true;
}
}
return res;
}
/******************************************************************************
* 描述 :返回指定索引处的节点的指针
* 参数 :(in)-pList 列表结构体指针
* (in)-index 索引
* (out)-ppNode 指定索引处的节点指针的指针
* 返回 :-true 成功
* -false 失败
******************************************************************************/
bool List_getElementAt(List * const pList, uint32_t index,
ListNode **ppNode)
{
/* 返回结果 */
bool res = true;
ListNode *pNode;
uint32_t i;
ZF_ASSERT(pList != (List *)0)
ZF_ASSERT(index < pList->Count)
pNode = pList->pRootNode;
for (i = 0; i < index; i++)
{
if (pNode->Next == NULL)
{
res = false;
break;
}
pNode = pNode->Next;
}
if(res == true)
{
*ppNode = pNode;
}
else
{
*ppNode = NULL;
}
return res;
}
/******************************************************************************
* 描述 :返回数据区指向data的节点的指针
* 参数 :(in)-pList 列表结构体指针
* (in)-pdata 数据缓冲区指针
* (out)-ppNode 节点指针的地址
* 返回 :-true 成功
* -false 失败
******************************************************************************/
bool List_getElementByData(List * const pList, void *pdata, ListNode **ppNode)
{
ListNode *pNode;
ZF_ASSERT(pList != (List *)0)
ZF_ASSERT(pdata != (void *)0)
pNode = pList->pRootNode;
while (pNode != NULL)
{
if (pNode->pData == pdata)
{
/* 输出 */
*ppNode = pNode;
return true;
}
pNode = pNode->Next;
}
/* 输出 */
*ppNode = NULL;
return false;
}
/******************************************************************************
* 描述 :返回指定索引处的节点的数据缓冲区的指针
* 参数 :(in)-pList 列表结构体指针
* (in)-index 索引
* 返回 :-成功 数据缓冲区的指针
* -失败 NULL
******************************************************************************/
void *List_getElementDataAt(List * const pList, uint32_t index)
{
ListNode *pNode;
List_getElementAt(pList, index, &pNode);
if (pNode != NULL)
{
return (void*)pNode->pData;
}
return NULL;
}
/******************************************************************************
* 描述 :返回节点的索引
* 参数 :(in)-pList 列表结构体指针
* (in)-pNode 节点
* (out)-pIndex 节点的索引的指针
* 返回 :-true 成功
* -false 失败
******************************************************************************/
bool List_getElementIndex(List * const pList, ListNode *pNode,
uint32_t *pIndex)
{
/* 返回结果 */
bool res = true;
uint32_t index = 0;
ListNode *pFindNode;
ZF_ASSERT(pList != (List *)0)
ZF_ASSERT(pNode != (ListNode *)0)
pFindNode = pList->pRootNode;
while (pFindNode != pNode && pFindNode != NULL)
{
pFindNode = pFindNode->Next;
index++;
}
/* 没找到节点 */
没有合适的资源?快使用搜索试试~ 我知道了~
人工智能-项目实践-嵌入式-一个轻量级嵌入式框架.zip
共24个文件
h:13个
c:10个
md:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 131 浏览量
2023-12-27
15:46:02
上传
评论
收藏 30KB ZIP 举报
温馨提示
人工智能-项目实践-嵌入式-一个轻量级嵌入式框架 Zorb Framework的初步设计功能有 1、时间系统功能zf_time 2、环形缓冲区功能zf_buffer 3、列表功能zf_list 4、状态机功能zf_fsm 5、事件功能zf_event 6、定时器功能zf_timer 7、任务功能zf_task
资源推荐
资源详情
资源评论
收起资源包目录
人工智能-项目实践-嵌入式-一个轻量级嵌入式框架.zip (24个子文件)
Zorb-Framework-master
inc
zf_includes.h 903B
zf_list.h 4KB
zf_time.h 2KB
zf_timer.h 2KB
zf_assert.h 1KB
zf_task_schedule.h 845B
zf_event.h 3KB
zf_buffer.h 3KB
zf_task.h 4KB
zf_fsm.h 4KB
doc
board_ports.md 71B
src
zf_time.c 2KB
zf_assert.c 986B
zf_timer.c 7KB
zf_event.c 11KB
zf_fsm.c 11KB
zf_task.c 13KB
zf_task_schedule.c 2KB
zf_buffer.c 8KB
zf_list.c 14KB
ports
zf_critical.h 2KB
zf_debug.h 2KB
zf_critical.c 6KB
zf_malloc.h 1KB
共 24 条
- 1
资源评论
博士僧小星
- 粉丝: 1840
- 资源: 5878
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功