嵌入式框架Zorb Framework搭建三:列表的实现

我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮。

嵌入式框架Zorb Framework搭建过程

嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调试输出和建立时间系统

嵌入式框架Zorb Framework搭建二:环形缓冲区的实现

嵌入式框架Zorb Framework搭建三:列表的实现

嵌入式框架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提供了列表功能,而且这个列表可以装载不同类型的数据。可以说是小功能,大作用。

  本文工程代码:3-Zorb_Framework列表的实现

  Zorb Framework github:

  版权所有,转载请打赏哟

如果你喜欢我的文章,可以通过微信扫一扫给我打赏哟

猜你喜欢

转载自www.cnblogs.com/54zorb/p/9279805.html