tag 标签: 数据结构

相关帖子
相关博文
  • 热度 26
    2014-6-19 11:26
    2911 次阅读|
    0 个评论
                                  MBUS总线应用层协议 MBUS总线应用层定义了测量记录的数据类型和数据结构。从站根据这些数据类型和结构将测量记录进行编码,然后封装在MBUS帧的数据域;主站接收到MBUS帧后,根据这些数据类型和结构对数据解码,从而获得从站的测量数据。因此数据域的数据结构的定义对于MBUS的应用具有重要意义,MBUS在这方面针对消耗计量仪表的测量数据进行了专门的设计。 MBUS定义了多种数据类型,包括无符号BCD整型、二进制整型、无符号二进制整型、布尔型、32位复合型(表示测量类型、物理单位等)、32位日期时间型、16位日期型、浮点型等。在这些数据类型的基础上,MBUS定义了两种数据结构:固定数据结构和可变数据结构。MBUS帧的数据域实际上就是一个以固定数据结构或可变数据结构表示的数据模块。 固定数据结构 固定数据结构分为6个字段,从站标识码、访问次数、从站状态、测量类型/单位、计数器1数据、计数器2的数据。这种数据结构只能传输两个计数器的数据,且对测量记录只能进行固定长度的编码,因此适用于从站只有一二个测量点的场合。 可变数据结构 可变数据结构分为4个部分,按顺序分别是:固定数据头、数据记录块、厂商数据头、厂商自定义数据块。固定数据头同固定数据结构的前3个字段的意义基本类似。数据记录块有若干子数据块组成。子数据块数目以及每个子数据块的类型、长度、意义都是可变的,每个子数据块保存一个测量数据。厂商数据头是一个标识符(0FH或1FH),表示自此以后是厂商自定义数据快。厂商自定义数据块使得在主从站间可以按照自定义的规则交换数据,不受标准的约束,进一步增加了使用的灵活性。可变数据结构能充分满足远程读数的需要用于从站有多个测量点的场合。
  • 热度 19
    2013-9-8 21:35
    1426 次阅读|
    1 个评论
    数据结构学习笔记之线性表 1. 线性表        线性表是指:零个或多个数据元素的有限序列。      线性表的特点是:第一个元素无前驱,最后一个元素无后继。其他每个元素有且只有一个直接的前驱和后继。      线性表的长度是指包含数据元素的个数。 2. 线性表的抽象数据类型           线性表的的数据模型在定义中已经说明了,而线性表所包括的一组操作定义如下: 初始化 InitList(*L) 查询是否为空 ListEmpty(L) 清空 ClearList(*L) 获取线性表的第i个元素 GetElem(L,I,*e) 确定某个元素在线性表中的位置 LocateElem(L,e) 插入 ListInsert(*L,i,e) 删除 ListDelete(*L,i,*e) 返回线性表的长度 ListLength(L)      在实际的应用中,线性表的基本操作是不同的,可能是上面操作的一个子集。复杂的线性表操作可以由以上基本操作组合来实现。由之前的讨论可知,任何一种数据结构,有存储方式上,有顺序存储结构和链式存储结构。我们先从顺序存储结构讲起。 3. 线性表的物理存储结构 顺序存储结构     线性表的顺序存储结构是指用一段连续地址空间依次存储线性表的数据元素。在C语言中符合这种存储结构的数据类型是:数组。对,利用数组就可以存储线性表了。为了更好地抽象线性表,我们利用结构体的概念,将线性表的长度的属性也包括在这一结构体中。因此顺序存储结构的代码如下: # define     MAXSIZE 20 # define     OK 1 # define     ERROR 0 # define     TRUE 1 # define     FALSE 0 typedef         int     Status; typedef         int     ElemType; typedef         struct {     ElemType data ;        int     length; }SqList; /*顺序存储结构包括3个关键因素:数组大小、链表长度以及数组起始地址*/       接下来给出三个线性表相关操作的函数。代码实现如下: 获取线性表的第i个元素 GetElem(SqList L, int i, ElemType *e) Status GetElem(SqList L,   int   i, ElemType * e) {       if (L.length == 0 || i 1 || i L.length)           return   ERROR;      * e = L.data ;       return   OK; } 插入操作 ListInsert(SqList *L, int i, ElemType e) Status ListInsert(SqList * L,   int   i, ElemType e) {       int   k;       if (L - length == MAXSIZE)           return   ERROR;       if (i 1 || i L - length + 1 )           return   ERROR;       if (i L - length)      {           for (k = L - length;k i - 1 ;k -- )          {             L - data = L - data ;          }      }      L - data = e;      L - length ++ ;       return   OK; } 删除操作 ListDelete(SqList *L, int i, ElemType *e) Status ListDelete(SqList * L,   int   i, ElemType * e) {       int   k;       if (L - length == 0 )           return   ERROR;       if (i 1 || i L - length)           return   ERROR;      * e = L - data ;       if (i L - length)      {           for (k = i;k L - length;k ++ )             L - data = L - data ;      }      L - length -- ;       return   OK; }      顺序存储结构的优缺点如下: 优点:存储空间的利用率高,不用存储元素之间的逻辑关系。此外还能快速存取任意位置的元素,时间复杂度为O(1). 缺点:插入和删除操作需要移动大量元素,时间复杂度为O(1).容易造成存储空间“碎片”。 链式存储结构     鉴于顺序存储结构存在的缺点,链式存储结构采用了结点的方式来组织数据元素。结点包括数据域和指针域。其中数据域用来存储数据元素,指针域用来存储下一个结点的指针。这样就可以最大限度的利用存储空间,此外链式存储结构可以避免插入删除操作时的数据移动。     链表中的第一个结点的存储位置称为头指针。为了更方便的对链表进行操作,单链表的第一个结点前加一个结点,称为头结点。每一个链表都存在头指针,不一定存在头结点。头结点的数据域可以为空,也可以是链表长度信息,指针域为指向第一个结点。     下面简单介绍下链式存储结构的数据结构。其代码实现如下所示 typedef struct Node {     ElemType data;      struct Node * node; }Node typedef struct Node * LinkList;   /*定义LinkList*/        链式存储结构的单链表操作原理比较简单。主要是涉及到链表指针域的调整。 4. 单链表顺序结构与链式结构的优缺点比较     最后来来 总结 下顺序存储结构与链式结构。 若线性表需要频繁查找,很少进行插入和删除操作时,宜采用顺序存储结构。若需要频繁插入和删除时,宜采用单链表结构。     譬如,用于游戏账户的注册,可以考虑采用顺序存储结构,因为注册基本只需要一次插入操作,而需要较多的登录查询操作。 当线性链表中的元素个数变化较大或者不确定有多大时,最好采用单链表结构。
  • 热度 25
    2013-9-8 17:00
    958 次阅读|
    0 个评论
    数据结构学习笔记之数据结构相关定义   1. 数据相关定义 何为数据结构?       答:数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。 什么是数据元素      答:组成数据的、有一定意义的基本单元。数据项是最小的基本单元,数据元素由若干个数据项构成。 数据对象           数据对象则是具有相同性质的数据元素的集合,是数据的一个子集。 2. 数据的组织方式          数据结构的组织方式可以从两个角度来考虑:其一是从解决问题的角度来看,数据的组织方式可以称之为逻辑结构;从计算机的角度来看,数据的组织方式可以称之为物理结构(存储结构) 逻辑结构       逻辑结构是指数据对象中数据元素之间的相互关系。大致存在以下四种基本的结构:集合结构、线性结构、树形结构以及图形结构。其中集合结构中的数据是平等关系,他们同属一个集合,类似数学中的结合;线性结构表示数据元素之间存在一一对应的关系;而树形结构则是一种一对多的层次关系;图形结构则是多对多的关系。在解决问题时,根据问题的需要,选择合适的逻辑结构。 物理结构(存储结构)     从计算机的角度来看,数据最终存在计算机中,就产生了两种基本的存储方式:顺序存储结构和链式存储结构。我们常见的数组类型就是顺序存储结构,而链表则采用了链式存储结构。显然这两种存储结构适合不同的场合。链式存储结构与顺序存储结构相比,在于它的存储单元可以是连续的,也可以是不连续的,适合数据结构的动态变化,更具有灵活性和可扩展性。 3. 数据类型     首先来看数据类型的定义。数据类型是指:一组性质相同的值得集合以及定义在此集合上的一些操作的总称。          为什么需 要有数据类型的概念呢?这是因为在解决问题时,需求是不同的。譬如,现在的房子有别墅、有错层、有单间; 有一百多平米的也有几十平米的。这为满足不同的人需求提供了方便。          C语言中,按照取值的不同,存在以下两种类型: 原子类型:表示不可分解的基本类型,如整形、实型、字符型等。 结构类型:由若干个类型组合而成,这里的类型可以是基本类型也可以是结构类型,时刻再分解的。如整型数组、结构体、联合体等。          此外,数据类型还包括定义在该数据类型的一组操作。如整形变量就有相应的操作,如加、减、乘除等。不同的数据类型操作不完全相同。对已有的数据类型进行抽象,就有了 抽象数据类型(ADT)。          抽象数据类型(Abstract Data Type,ADT) :是指一个数学模型及定义在该模型上的一组操作。类似于数据类型的定义。我们可以根据问题的需要,定义自己的抽象数据类型。譬如,在游戏中,定义一个角色,我们可以给这个抽象的数据类型建立一个模型来表示这个角色,此外还可以定义该角色的拥有的技能,即模型的一组操作。
  • 热度 19
    2013-9-8 16:47
    1243 次阅读|
    0 个评论
      数据结构学习笔记之数据结构相关定义 1. 数据相关定义 何为数据结构?       答:数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。 什么是数据元素      答:组成数据的、有一定意义的基本单元。数据项是最小的基本单元,数据元素由若干个数据项构成。 数据对象           数据对象则是具有同性质的数据元素的集合,是数据的一个子集。   2. 数据的组织方式          数据结构的组织方式可以从两个角度来考虑:其一是从解决问题的角度来看,数据的组织方式可以称之为逻辑结构;从计算机的角度来看,数据的组织方式可以称之为物理结构(存储结构) 逻辑结构       逻辑结构是指数据对象中数据元素之间的相互关系。大致存在以下四种基本的结构:集合结构、线性结构、树形结构以及图形结构。其中集合结构中的数据是平等关系,他们同属一个集合,类似数学中的结合;线性结构表示数据元素之间存在一一对应的关系;而树形结构则是一种一对多的层次关系;图形结构则是多对多的关系。在解决问题时,根据问题的需要,选择合适的逻辑结构。 物理结构(存储结构)     从计算机的角度来看,数据最终存在计算机中,就产生了两种基本的存储方式:顺序存储结构和链式存储结构。我们常见的数组类型就是顺序存储结构,而链表则采用了链式存储结构。显然这两种存储结构适合不同的场合。链式存储结构与顺序存储结构相比,在于它的存储单元可以是连续的,也可以是不连续的,适合数据结构的动态变化,更具有灵活性和可扩展性。 3. 数据类型     首先来看数据类型的定义。数据类型是指:一组性质相同的值得集合以及定义在此集合上的一些操作的总称。          为什么需要有数据类型的概念呢?这是因为在解决问题时,需求是不同的。譬如,现在的房子有别墅、有错层、有单间;有一百多平米的也有几十平米的。这为满足不同的人需求提供了方便。          C语言中,按照取值的不同,存在以下两种类型: 原子类型:表示不可分解的基本类型,如整形、实型、字符型等。 结构类型:由若干个类型组合而成,这里的类型可以是基本类型也可以是结构类型,时刻再分解的。如整型数组、结构体、联合体等。          此外,数据类型还包括定义在该数据类型的一组操作。如整形变量就有相应的操作,如加、减、乘除等。不同的数据类型操作不完全相同。对已有的数据类型进行抽象,就有了 抽象数据类型(ADT)。          抽象数据类型(Abstract Data Type,ADT) :是指一个数学模型及定义在该模型上的一组操作。类似于数据类型的定义。我们可以根据问题的需要,定义自己的抽象数据类型。譬如,在游戏中,定义一个角色,我们可以给这个抽象的数据类型建立一个模型来表示这个角色,此外还可以定义该角色的拥有的技能,即模型的一组操作。  
  • 热度 38
    2013-9-4 16:55
    2121 次阅读|
    5 个评论
         一般转换都是用数组,结构体及指针,这样是便于以后函数操作。灵活的运用宏定义,编程更加简洁。 举例消息处理方法应用:     如下的定义为在处理消息时候用到很方便,把消息类型和消息值最后封装在一起。 灵活的处理了Uint和Byte 之间转换。   #define UintToByte3(data)               ((byte *)((data))) #define UintToByte2(data)               ((byte *)((data))) #define UintToByte1(data)               ((byte *)((data))) #define UintToByte0(data)               ((byte *)((data))) #define UintToUshort1(data)             ((ushort *)((data))) #define UintToUshort0(data)             ((ushort *)((data))) #define GetMessageType(data)            UintToByte3(data)  #define GetMessageData(data)            (data 0x00FFFFFF) 消息封装处理函数: void PostMessageToLogicTask(MessageType messageType, uint data) {     bool postMessage;     if (messageType != TimerMessageType)     {         UintToByte3(data) = messageType;     }         postMessage = System.Os.PostMessageQueue(System.Device.MessageQueuePoint, (void *)data);      Assert(postMessage); } 特别说明: MessageType 是枚举型,定义的值为Byte 类型 。详细定义为如下 typedef enum {     KeyMessageType      = 0xFF,         UartMessgeType      = 0xFE,       TimerMessageType    = 0xF0  }MessageType;   更巧妙的定义,大家一起帮忙分析为什么可以这样定义,用引号来美化编程界面。 Menu.WorkForm.BackTextPoint = "频率          Hz功率   %       W电压    电流    温度   C        ";       App.Menu.WorkForm.BackTextPoint =                                       "频率          Hz"                                       "功率   %       W"                                       "电压    电流    "                                       "温度   C        "; 上面二种定义为啥功能一样。欢迎各位探讨。 typedef struct {     const byte* BackTextPoint;     Chart     * ChartPoint;     Label     * LabelPoint;     TextBox   * TextBoxPoint;     void      * FocusTextBoxDataPoint; }Form; 欢迎各位与我一起学习ARM 技术,我的E-MIAL:timeisours@163.com,web:www.51buddy.com,QQ:158377757  
相关资源