c++数据结构代码整理_嵌入式:经典数据结构

1.什么是数据结构?

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

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

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

3.数据结构学什么?

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

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

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

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

b9158adf7e75451e5310f70363c0bc00.png

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

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

(1)顺序表

1b928ce34d3bc08e7d97b1a7c12f6a8b.png

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

结构代码模型如下:

#define MAXSIZE 10

typedef int datatype;

typedef int postype;

struct list{

datatype data[N];

postype

last;

};

(2)单向链表

cf79d632d20bef2ca9898f4f0c5828c5.png

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

结构代码模型如下:

typedef int datatype;

typedef struct node {

datatype data;

struct node * next;

}Linknode, *Linklist;

(3)双向循环链表

1508886bbf35c2237fd7ee6cfd794ee0.png

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

结构代码模型如下:

typedef int datatype;

typedef struct node{

datatype data;

struct node *prior;

struct node *next;

}DLinkNode, * DLinkList;

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

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

1)顺序栈:

8a0c5b44277947b3a4285ac5141ea542.png

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

结构代码模型如下:

typedef int datatype;

typedef struct node{

datatype *data;

int maxlen;

int top;

}SeqStack,*SeqStack_t;

2)链式栈

129801f43a3a7c0eab54156e990640c8.png

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

结构代码模型如下:

typedef int datatype;

typedef struct node{

datatype data;

struct lstacknode * next;

}LinkStacknode, *LinkStacknode_t;

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

1)顺序队列

3843ffa4f6c0d57f6319eacc3ae9a86a.png

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

结构代码模型如下:

#define N 10

typedef int datatype;

typedef struct seqqueue{

datatype data[N];

int front, rear;

}SeqQueue, *SeqQueue_t;

2)链式队列

a548f354392e9aeb0f232ff1b7bc339a.png

上图为有头结点和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;

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值