当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > 嵌入式程序员要学习的 经典数据结构

嵌入式程序员要学习的 经典数据结构 时间:2019-07-30      来源:创客学院,韩老师

1.什么是数据结构?

如果我们现在要整理图书,有一堆书, 怎么整理呢?最简单一种一个挨着一个放;或者给图书分类,按照大分类再细分类整合;或者直接细分拆成很多类,每一类之间肯定会有很多的关系;但是有没有想过这个书是要放在哪里的?要在什么环境下保存?这就需要给每种整理方法换个角度考虑,是都放在一个书架的一层呢,还是放在不同的书架隔层,又或者是放在图书馆里不同的书架上;这个提到的整理图书讨论的东西,就是数据结构将要研究的东西。回归到咱们程序员,就需要把上面研究的整理方法和存放形式可以通过计算机记录下来,因为毕竟我们整理图书的目的是管理和使用图书方便。所以归根结底我们要把这种抽象的数据和数据间的关系反应给计算,用编程语言实现。那么我们可以知道:数据结构研究数据之间的关系

2.为什么学习数据结构?

详细研究数据间的管理机制,形成数据结构模型,遇到实际情况可以借鉴使用,这样我们可以更快的应用到程序编程,设计和编写出更优秀的软件,且本质上是提高工程质量!

3.数据结构学什么?

大家应该知道一个经典的思想:程序 = 数据结构 + 算法;

那咱们来谈谈之间的关系,和嵌入式程序员要注意的点。咱们是嵌入式程序员,要注重的是嵌入式编程思维,也就是要注重实践性。所以学习的重点是数据结构的管理数据思想;算法是算法工程师去深入学习的,是研究性质的方法论,咱们很少遇到复杂的算法应用。咱们因此学习一些经典的数据结构中涉及的算法就已经够用了,以后有兴趣可以继续专门深入了解算法这门学科;注意目前阶段的学习中心在哪里。

数据结构研究三个角度:逻辑关系、存储关系、运算关系。

以下图示表明了三大角度在数据结构中的研究关系:

逻辑关系是抽象的研究数据间关系,存储关系就需要将这种关系对应到物理存储,运算关系是在物理存储后确定后需要研究的数据的应用操作;

4.几个经典的线性结构:

(1)顺序表

上图为一个还没有存储有效数据的空表。存储空间是数组,记录有效数据最后更新位置的是整型last,整体表结构为一个结构体;

结构代码模型如下:

#define MAXSIZE 10

typedef  int  datatype;

typedef  int  postype;

struct list{

datatype  data[N];

postype last;

};

(2)单向链表

上图为有头结点且不断增加新数据结点的单向链表。存储空间是一个结构体,结构体内需要有一个数据域和一个指针域,数据域存储需要存储的数据, 指针域要记录下一个数据结点的首地址;

结构代码模型如下:

typedef int datatype;

typedef struct node {

        datatype  data;

        struct node *  next;

}Linknode, *Linklist;

(3)双向循环链表

上图为有头结点且有n个数据结点的双向循环链表。存储空间是一个结构体,结构体内需要有一个数据域和两个指针域,数据域存储需要存储的数据, 第一个指针域要记录前一个数据结点的首地址,第二个指针域要记录后一个数据结点的首地址;

结构代码模型如下:

typedef int datatype;

typedef struct node{

datatype data;

struct node *prior;

struct node *next;

}DLinkNode,  * DLinkList;

(4)线性结构的应用结构:

①栈--先进后出,后进先出

1)顺序栈:

上图为有n个数据存储空间的顺序栈。结构体是一个栈结构,结构体内需要有一个数据域和两个整型标记,数据域是数组存储需要存储的数据, 第一个标记top要记录最后一个入栈数据的数组下标,第二个标记len要记录整个存储空间的大小,方便知晓栈的存储能力;

结构代码模型如下:

typedef int datatype;

typedef struct node{

datatype *data;

int maxlen;

int top;

}SeqStack,*SeqStack_t;

2)链式栈

上图为有头结点和n个数据存储空间的链式栈。结构体是一个数据结点,结构体内需要有一个数据域和一个指针域,数据域是数组存储需要存储的数据, 指针域要记录前一个入栈结点的首地址,栈顶为链表头结点后第一个数据结点;

结构代码模型如下:

typedef int datatype;

typedef struct node{

datatype data;

struct lstacknode * next;

}LinkStacknode, *LinkStacknode_t;

②队列--先进先出,后进后出

1)顺序队列

上图为有n个数据存储空间的顺序队列,需要注意的是这只是个理想模型,实际使用需要舍弃一个存储空间,用于判断空表满表,只使用n-1个存储空间。结构体是一个顺序队列,结构体内需要有数组作为数据存储空间, 两个标记, 第一个标记记录队头数据所在位置的前一个位置的数组下标,第二个标记记录队尾数据所在位置的数组下标;

结构代码模型如下:

#define N 10

typedef int datatype;

typedef struct seqqueue{

datatype data[N];

int front, rear;

}SeqQueue, *SeqQueue_t;

2)链式队列

上图为有头结点和n个数据存储空间的链式队列。链式队列有两个结构体模型,数据结点是第一个结构体,这个结构体内需要有一个数据域和一个指针域,数据域是数组存储需要存储的数据, 指针域要记录后一个入栈队结点的首地址;第二个结构体是队列模型,结构体内需要两个指针域,指针类型为第一个结构体类型的指针,一个指针front记录队列的队头结点首地址,队头为链表头结点后第一个数据结点,另一个指针rear记录队列的队尾结点首地址,队尾为链表最后一个数据结点。

结构代码模型如下:

typedef int datatype;

typedef struct node{

datatype data;

struct linkqueuenode *next;

}Queuenode, *Queuenode_t;

typedef struct linkqueue{

linkqueue_pnode front,rear;

}LinkQueue, *LinkQueue_t;

 

在数据结构中还有其他非线性的数据模型,篇幅有限,这里就不列举了,下次再聊。上面的结构应用很广泛哦,感兴趣的话一定要去研究实践!

上一篇:ADC

下一篇:字符设备驱动

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部