嵌入式框架Zorb Framework搭建三:列表的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮。
嵌入式框架Zorb Framework搭建过程
嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调试输出和建立时间系统
嵌入式框架Zorb Framework搭建二:环形缓冲区的实现
一、前言
在这一篇中,我们将为Zorb Framework提供列表功能。列表是我最喜欢用的数据结构,没有之一。在只要涉及到管理对象不止一个的时候,我就会想到列表。后面将要设计的状态机、事件、定时器和任务等等都需要列表的支持,可以说列表在整个框架里边是必不可少的一个功能。
二、列表设计
我们先来看看要实现的列表提供什么功能:
初步要提供的功能如下:
1、可以在指定位置增加数据
2、可以在指定位置删除数据
3、可以知道列表数据的个数
4、可以清空列表
5、可以不释放数据,仅仅把数据移出列表
6、可以根据数据获取它所在的索引
因此,初步设计的数据结构如下:
/* 列表节点结构 */
typedef struct _ListNode
{
bool IsExternData; /* 是否外部数据,是则销毁时不释放 */
uint8_t *pData; /* 指向数据的指针 */
uint32_t Size; /* 数据的大小 */
struct _ListNode *Next; /* 指向下一个节点 */
} ListNode; /* 列表结构 */
typedef struct _List
{
ListNode *pRootNode; /* 指向根节点数据 */
uint32_t Count; /* 节点个数 */ /* 在尾端增加节点 */
bool (*Add)(struct _List * const pList, ListNode *pNode); /* 删除节点(释放空间) */
bool (*Delete)(struct _List * const pList, ListNode *pNode); /* 移除节点(不释放空间) */
bool (*Remove)(struct _List * const pList, ListNode *pNode); /* 返回指定索引处的节点的指针 */
bool (*GetElementAt)(struct _List * const pList, uint32_t index,
ListNode **ppNode); /* 返回数据区指向data的节点的指针 */
bool (*GetElementByData)(struct _List * const pList, void *pdata,
ListNode **ppNode); /* 返回指定索引处的节点的数据缓冲区的指针 */
void *(*GetElementDataAt)(struct _List * const pList, uint32_t index); /* 返回节点的索引 */
bool (*GetElementIndex)(struct _List * const pList, ListNode *pNode,
uint32_t *pIndex); /* 在指定索引处增加节点 */
bool (*AddElementAt)(struct _List * const pList, uint32_t index,
ListNode *pNode); /* 在指定索引处删除节点(释放空间) */
bool (*DeleteElementAt)(struct _List * const pList, uint32_t index); /* 在指定索引处移除节点(不释放空间) */
bool (*RemoveElementAt)(struct _List * const pList, uint32_t index); /* 清空列表(释放空间) */
bool (*Clear)(struct _List * const pList); /* 释放列表(释放空间) */
bool (*Dispose)(struct _List * const pList);
} List;
为了实现动态列表,在列表中提供了一个Dispose的功能。
列表已经设计好了,具体实现请看附件代码或在文末的github地址拉框架源码。
三、列表结果测试
简单的测试代码如下:
/**
*****************************************************************************
* @file app_list.c
* @author Zorb
* @version V1.0.0
* @date 2018-06-28
* @brief 列表测试的实现
*****************************************************************************
* @history
*
* 1. Date:2018-06-28
* Author:Zorb
* Modification:建立文件
*
*****************************************************************************
*/ #include "app_list.h"
#include "zf_includes.h"
#include "string.h" /* 列表指针 */
List *pBookList; /* 书本数据结构 */
typedef struct _Book
{
uint32_t Index; /* 索引 */
char Name[]; /* 书名 */
} Book; /******************************************************************************
* 描述 :任务初始化
* 参数 :无
* 返回 :无
******************************************************************************/
void App_List_init(void)
{
/* 创建列表 */
List_create(&pBookList);
} /******************************************************************************
* 描述 :任务程序
* 参数 :无
* 返回 :无
******************************************************************************/
void App_List_process(void)
{
uint32_t i;
ListNode *pNode;
Book *pBook; ZF_DEBUG(LOG_D, "book list count before adding data is %d\r\n",
pBookList->Count); /* 填充10个数据 */
for (i = ; i < ; i++)
{
/* 创建节点 */
List_mallocNode(&pNode, (void **)&pBook, sizeof(Book)); /* 填充节点内容 */
pBook->Index = i;
strcpy(pBook->Name, "book x");
pBook->Name[] = '' + i; /* 添加到列表 */
pBookList->Add(pBookList, pNode);
} ZF_DEBUG(LOG_D, "book list count after adding data is %d\r\n",
pBookList->Count); /* 读出第3个数据看是否正确 */
pBook = (Book *)pBookList->GetElementDataAt(pBookList, ); ZF_DEBUG(LOG_D, "book index is %d\r\n", pBook->Index);
ZF_DEBUG(LOG_D, "book name is %s\r\n", pBook->Name); ZF_DEBUG(LOG_D, "\r\n"); /* 删除第5个数据 */
pBookList->DeleteElementAt(pBookList, ); ZF_DEBUG(LOG_D, "book list count after deleteing data is %d\r\n",
pBookList->Count); /* 显示现有数据 */
for (i = ; i < pBookList->Count; i++)
{
pBook = (Book *)pBookList->GetElementDataAt(pBookList, i); ZF_DEBUG(LOG_D, "\r\n");
ZF_DEBUG(LOG_D, "book index is %d\r\n", pBook->Index);
ZF_DEBUG(LOG_D, "book name is %s\r\n", pBook->Name);
} while();
} /******************************** END OF FILE ********************************/
结果:
book list count before adding data is
book list count after adding data is
book index is
book name is book book list count after deleteing data is book index is
book name is book book index is
book name is book book index is
book name is book book index is
book name is book book index is
book name is book book index is
book name is book book index is
book name is book book index is
book name is book book index is
book name is book
四、最后
本篇为Zorb Framework提供了列表功能,而且这个列表可以装载不同类型的数据。可以说是小功能,大作用。
Zorb Framework github:https://github.com/54zorb/Zorb-Framework
版权所有,转载请打赏哟
如果你喜欢我的文章,可以通过微信扫一扫给我打赏哟

嵌入式框架Zorb Framework搭建三:列表的实现的更多相关文章
- 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调试输出和建立时间系统
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 嵌入式框架Zorb Framework搭建二:环形缓冲区的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 嵌入式框架Zorb Framework搭建四:状态机的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 嵌入式框架Zorb Framework搭建五:事件的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 嵌入式框架Zorb Framework搭建六:定时器的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 嵌入式框架Zorb Framework搭建七:任务的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- iOS9全新的联系人相关框架——Contacts Framework
iOS9全新的联系人相关框架——Contacts Framework 一.引言 在以前iOS开发中,涉及联系人相关的编程,代码都非常繁琐,并且框架的设计也不是Objective-C风格的,这使开发者用 ...
- 最新 iOS 框架整体梳理(三)
这一篇得把介绍框架这个系列终结了,不能超过三篇了,不然太长了..... 还是老规矩,前面两篇的机票在下方: 最新 iOS 框架整体梳理(一) 最新 iOS 框架整体梳理(二) Part - 3 ...
- 使用Yii框架中遇到的三个问题
以下由我们在信易网络公司开发项目的时候终结出的一些经验 使用Yii框架中遇到的三个问题 1.main.php文件中欲引入全局变量的问题 还原一下此问题:在Yii框架中,main.php一般会作为整个应 ...
随机推荐
- 【Leetcode】【Easy】Symmetric Tree
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- (二)selenium元素定位
selenium定位方法 Selenium提供了8种定位方式. id name class name tag name link text partial link text xpath css se ...
- bootstrap table 怎么实现前两列固定冻结?
$("#Table").bootstrapTable('destroy').bootstrapTable({ pagination: true,//分页 minimumCountC ...
- ACM-ICPC 2018 徐州赛区网络预赛 G. Trace【树状数组维护区间最大值】
任意门:https://nanti.jisuanke.com/t/31459 There's a beach in the first quadrant. And from time to time, ...
- Jmeter 登陆性能测试
1.打开Jmeter,新建一个线程组:测试计划--添加--Threads(users)---线程组 如图: 2.首先要添加一个HTTP默认请求,为什么要添加这个呢? 如果要测试的系统域名或者IP地址是 ...
- 2018.10.8 Hibernate中解决乱码问题---配置一个过滤器
在web.xml中配置下 <filter> <filter-name>encodeFilter</filter-name> <filter-class> ...
- 使用maven创建项目
http://192.168.4.112/rdmanager/main/index.jhtml 1.对于第一次下载某个项目的源码,按照下面的步骤进行: (1)在D:\projects\目录下的空白位置 ...
- 【luogu P3384 树链剖分】 模板
题目链接:https://www.luogu.org/problemnew/show/P3384 诶又给自己留了个坑..不想写线段树一大理由之前的模板变量名太长 #include <cstdio ...
- java常见验证邮箱、电话号码、日期等格式
package besttone.utils; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 90%的验证 ...
- hadoop 错误
错误:DataXceiver error processing WRITE_BLOCK operation 2014-05-06 15:21:30,378 ERROR org.apache.hadoo ...