嵌入式框架Zorb Framework搭建三:列表的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮。
嵌入式框架Zorb Framework搭建过程
嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调试输出和建立时间系统
嵌入式框架Zorb Framework搭建二:环形缓冲区的实现
一、前言
在这一篇中,我们将为Zorb Framework提供列表功能。列表是我最喜欢用的数据结构,没有之一。在只要涉及到管理对象不止一个的时候,我就会想到列表。后面将要设计的状态机、事件、定时器和任务等等都需要列表的支持,可以说列表在整个框架里边是必不可少的一个功能。
二、列表设计
我们先来看看要实现的列表提供什么功能:
初步要提供的功能如下:
1、可以在指定位置增加数据
2、可以在指定位置删除数据
3、可以知道列表数据的个数
4、可以清空列表
5、可以不释放数据,仅仅把数据移出列表
6、可以根据数据获取它所在的索引
因此,初步设计的数据结构如下:
1 /* 列表节点结构 */ 2 typedef struct _ListNode 3 { 4 bool IsExternData; /* 是否外部数据,是则销毁时不释放 */ 5 uint8_t *pData; /* 指向数据的指针 */ 6 uint32_t Size; /* 数据的大小 */ 7 struct _ListNode *Next; /* 指向下一个节点 */ 8 } ListNode; 9 10 /* 列表结构 */ 11 typedef struct _List 12 { 13 ListNode *pRootNode; /* 指向根节点数据 */ 14 uint32_t Count; /* 节点个数 */ 15 16 /* 在尾端增加节点 */ 17 bool (*Add)(struct _List * const pList, ListNode *pNode); 18 19 /* 删除节点(释放空间) */ 20 bool (*Delete)(struct _List * const pList, ListNode *pNode); 21 22 /* 移除节点(不释放空间) */ 23 bool (*Remove)(struct _List * const pList, ListNode *pNode); 24 25 /* 返回指定索引处的节点的指针 */ 26 bool (*GetElementAt)(struct _List * const pList, uint32_t index, 27 ListNode **ppNode); 28 29 /* 返回数据区指向data的节点的指针 */ 30 bool (*GetElementByData)(struct _List * const pList, void *pdata, 31 ListNode **ppNode); 32 33 /* 返回指定索引处的节点的数据缓冲区的指针 */ 34 void *(*GetElementDataAt)(struct _List * const pList, uint32_t index); 35 36 /* 返回节点的索引 */ 37 bool (*GetElementIndex)(struct _List * const pList, ListNode *pNode, 38 uint32_t *pIndex); 39 40 /* 在指定索引处增加节点 */ 41 bool (*AddElementAt)(struct _List * const pList, uint32_t index, 42 ListNode *pNode); 43 44 /* 在指定索引处删除节点(释放空间) */ 45 bool (*DeleteElementAt)(struct _List * const pList, uint32_t index); 46 47 /* 在指定索引处移除节点(不释放空间) */ 48 bool (*RemoveElementAt)(struct _List * const pList, uint32_t index); 49 50 /* 清空列表(释放空间) */ 51 bool (*Clear)(struct _List * const pList); 52 53 /* 释放列表(释放空间) */ 54 bool (*Dispose)(struct _List * const pList); 55 } List;
为了实现动态列表,在列表中提供了一个Dispose的功能。
列表已经设计好了,具体实现请看附件代码或在文末的github地址拉框架源码。
三、列表结果测试
简单的测试代码如下:
1 /** 2 ***************************************************************************** 3 * @file app_list.c 4 * @author Zorb 5 * @version V1.0.0 6 * @date 2018-06-28 7 * @brief 列表测试的实现 8 ***************************************************************************** 9 * @history 10 * 11 * 1. Date:2018-06-28 12 * Author:Zorb 13 * Modification:建立文件 14 * 15 ***************************************************************************** 16 */ 17 18 #include "app_list.h" 19 #include "zf_includes.h" 20 #include "string.h" 21 22 /* 列表指针 */ 23 List *pBookList; 24 25 /* 书本数据结构 */ 26 typedef struct _Book 27 { 28 uint32_t Index; /* 索引 */ 29 char Name[10]; /* 书名 */ 30 } Book; 31 32 /****************************************************************************** 33 * 描述 :任务初始化 34 * 参数 :无 35 * 返回 :无 36 ******************************************************************************/ 37 void App_List_init(void) 38 { 39 /* 创建列表 */ 40 List_create(&pBookList); 41 } 42 43 /****************************************************************************** 44 * 描述 :任务程序 45 * 参数 :无 46 * 返回 :无 47 ******************************************************************************/ 48 void App_List_process(void) 49 { 50 uint32_t i; 51 ListNode *pNode; 52 Book *pBook; 53 54 ZF_DEBUG(LOG_D, "book list count before adding data is %d\r\n", 55 pBookList->Count); 56 57 /* 填充10个数据 */ 58 for (i = 0; i < 10; i++) 59 { 60 /* 创建节点 */ 61 List_mallocNode(&pNode, (void **)&pBook, sizeof(Book)); 62 63 /* 填充节点内容 */ 64 pBook->Index = i; 65 strcpy(pBook->Name, "book x"); 66 pBook->Name[5] = '0' + i; 67 68 /* 添加到列表 */ 69 pBookList->Add(pBookList, pNode); 70 } 71 72 ZF_DEBUG(LOG_D, "book list count after adding data is %d\r\n", 73 pBookList->Count); 74 75 /* 读出第3个数据看是否正确 */ 76 pBook = (Book *)pBookList->GetElementDataAt(pBookList, 2); 77 78 ZF_DEBUG(LOG_D, "book index is %d\r\n", pBook->Index); 79 ZF_DEBUG(LOG_D, "book name is %s\r\n", pBook->Name); 80 81 ZF_DEBUG(LOG_D, "\r\n"); 82 83 /* 删除第5个数据 */ 84 pBookList->DeleteElementAt(pBookList, 4); 85 86 ZF_DEBUG(LOG_D, "book list count after deleteing data is %d\r\n", 87 pBookList->Count); 88 89 /* 显示现有数据 */ 90 for (i = 0; i < pBookList->Count; i++) 91 { 92 pBook = (Book *)pBookList->GetElementDataAt(pBookList, i); 93 94 ZF_DEBUG(LOG_D, "\r\n"); 95 ZF_DEBUG(LOG_D, "book index is %d\r\n", pBook->Index); 96 ZF_DEBUG(LOG_D, "book name is %s\r\n", pBook->Name); 97 } 98 99 while(1); 100 } 101 102 /******************************** END OF FILE ********************************/
结果:
book list count before adding data is 0 book list count after adding data is 10 book index is 2 book name is book 2 book list count after deleteing data is 9 book index is 0 book name is book 0 book index is 1 book name is book 1 book index is 2 book name is book 2 book index is 3 book name is book 3 book index is 5 book name is book 5 book index is 6 book name is book 6 book index is 7 book name is book 7 book index is 8 book name is book 8 book index is 9 book name is book 9
四、最后
本篇为Zorb Framework提供了列表功能,而且这个列表可以装载不同类型的数据。可以说是小功能,大作用。
Zorb Framework github:https://github.com/54zorb/Zorb-Framework
版权所有,转载请打赏哟
如果你喜欢我的文章,可以通过微信扫一扫给我打赏哟