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

     

      Zorb Framework github:https://github.com/54zorb/Zorb-Framework

      版权所有,转载请打赏哟

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

  • 相关阅读:
    pyqt的setObjectName()/findChild()
    pyqt的多Button的点击事件的槽函数的区分发送signal的按钮。
    分布式存储
    QTableWidget的表头颜色设置
    QListView的子项的ViewMode
    QHeaderView的点击和双击事件
    LeetCode(63):不同路径 II
    LeetCode(62):不同路径
    LeetCode(61):旋转链表
    LeetCode(60): 第k个排列
  • 原文地址:https://www.cnblogs.com/54zorb/p/9279805.html
Copyright © 2011-2022 走看看