
C语言
顾小豆
1.熟练掌握西门子,三菱,欧姆龙等品牌plc;
2.熟悉c语言,熟练掌握单片机与arm底层驱动开发(c51,stm32,lm3s等系列);
3.熟练掌握keil,iar等单片机开发编译软件;
4.熟练掌握基于ucos实时操作系统的控制软件开发;
5.熟练使用altium designer电路设计软件,熟悉电路设计和pcb设计;
6.熟悉tcp/ip协议,熟悉usb 2.0规范协议等。
展开
-
数据结构之二叉排序树
上一节我们介绍了二分(折半)查找,也了解了它的优缺点。二分查找的特点:二分查找能够提高有序表中数据元素的查找速度;二分查找的时间复杂度为O(log2n);二分查找是一种静态查找二分查找的不足:当查找表经常变化时,二分查找的整体性能急剧下降。二分查找的硬伤:二分查找基于有序表。 当需要插入或者删除数据元素时,为了能够继续进行二分查找,需要大规...原创 2018-03-06 18:26:03 · 1238 阅读 · 0 评论 -
数据结构之顺序表和有序表查找其实现
顺序表和有序表查找顺序查找定义:从线性表中的第一个(或最后一个)数据元素开始,逐个进行数据元素关键字和给定值的比较,若某个数据元素的关键字和给定值相等则查找成功;如果直到最后一个(或第一个)数据元素,其关键字和给定值都不等时,则查找失败。上一节我们就介绍了简单的顺序查找的方法,代码如下:// 静态查找算法int static_search(int a[], int len, int key){...原创 2018-03-05 19:41:35 · 5034 阅读 · 0 评论 -
数据结构之查找的概念及简单实现
查找的概念查找是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素。查找表是由同一类型的数据元素(或记录)构成的集合。由于集合中的数据元素之间存在着完全松散的关系,因此查找表是一种非常灵便的数据结构。注意:从逻辑上来说,查找表中的数据元素之间没有本质的关系。查找表可以不是线性表,树结构和图结构中的任意一种。查找的操作分为两种:静态查找和动态查找。1.静态查找:1.1. 查询某个特定的...原创 2018-03-04 21:43:30 · 1838 阅读 · 0 评论 -
数据结构之图的最短路径
图的最短路径最短路径问题:如果从有向图中某一顶点(称为源点)到达另一顶点(称为终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边上的权值总和达到最小。下面讨论两种最常见的最短路径问题:单源最短路径问题和所有顶点之间的最短路径。1.单源最短路径问题:给定一个带权有向图 D 与源点 v ,求从v 到 D 中其它顶点的最短路径。限定各边上的权值大于0。如何求得这些路径?迪杰斯特拉(Dijkst...原创 2018-03-03 23:11:50 · 23186 阅读 · 3 评论 -
数据结构值图的最小生成树
最小生成树(最小连通网)假设在n个城市之间建立通信联络网,则连通n个城市只需要n-1条线路。这时自然会考虑这样一个问题,如何在最节省经费的前提下建立这个通信网。在每两个城市之间都可以设置一条线路,相应地都要付出一定的经济代价。n个城市之间,最多可能设置n(n-1)/2条线路,那么,如何在这些可能的线路中选择n-1条,以使总的耗费最少呢?可以用连通网来表示n个城市以及n个城市间可能设置的通信线路,其...原创 2018-03-03 20:43:27 · 1850 阅读 · 0 评论 -
数据结构之图的遍历
图的遍历定义:从图中的某一顶点出发,沿着一些边访遍图中所有的顶点,使得每个顶点仅被访问一次。图的遍历算法是求解图的连通性问题、拓扑排序和求关键路径等算法的基础。然而,图的遍历要比树的遍历复杂的多。因为图的任一顶点都可能和其余的顶点相邻接。所以在访问了某个顶点后,可能沿着某条路径搜索之后,又回到该顶点上。为了避免同一个顶点被访问多次,在遍历图的过程中,必须记下每个已访问过的顶点。为此,我们可以设一个...原创 2018-02-28 20:35:02 · 5159 阅读 · 0 评论 -
数据结构之图的存储结构二及其实现
上一节我们讲述了邻接矩阵法实现图,本节再来讲述一下邻接链表法实现图。邻接链表邻接表是图的一种链式存储结构。在邻接表中,对图中的每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点vi边(对有向图是以顶点vi为尾的弧)。基本思想:从同一个顶点发出的边链接在同一个链表中,每一个链表结点代表一条边, 结点中保存边的另一顶点的下标和权值。如下图所示:要想通过邻接链表方法实现图,首先得定义一个邻接链表...原创 2018-02-27 21:57:49 · 1143 阅读 · 0 评论 -
数据结构之图的存储结构一及其实现
图的存储结构由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位置来表示元素之间的关系,即图没有顺序映像的存储结构,但可以借助数组的数据类型表示元素之间的关系。另一方面,用多重链表表示图是自然的事,它是一种最简单的链式映像结构,即以一个右一个数据域和多个指针域组成的结点表示图中的一个顶点,其中数据域存储该顶点的信息,指针域存储指向其邻接点的指针。但是,由于图中...原创 2018-02-27 16:44:13 · 10217 阅读 · 2 评论 -
数据结构之图的定义及基本术语
图的定义图是由顶点集合(Vertex)及顶点间的关系集合组成的一种数据结构:Graph=( V, E )V = {x | x ∈某个数据对象 } 是顶点的有穷非空集合;E ={ (x, y) | x, y ∈V } 是顶点之间关系的有穷集合,也叫做边(Edge)集合。注:∈为数学符号,表示属于的意思 。例:x∈y:表示x属于y的意思。在图中的数据元素通常称为顶点 V 。下图的都是图的表示 可能...原创 2018-02-26 20:59:46 · 8719 阅读 · 0 评论 -
数据结构之线索化二叉树
线索化二叉树 在一些项目中需要频繁的遍历二叉树,但是二叉树的遍历比单链表的遍历复杂多了,并且递归总是会有额外开销。。。能不能像链表那样方便的快速遍历二叉树呢?线索化二叉树指的是将二叉树中的结点进行逻辑意义上的“重排列”,使其可以线性的方式访问每一个结点。二叉树线索化之后每个结点都有一个线性下标,通过这个下标可以快速访问结点,而不需要遍历二叉树。这个感觉很像组织链表,但是大家要知道组织链表结点之间的...原创 2018-02-24 21:42:33 · 515 阅读 · 0 评论 -
数据结构之遍历二叉树
遍历二叉树在二叉树的一些应用中,常常要求在树中查找具有某种特征的结点。这就提出遍历二叉树的问题,即如何按某条搜索路径巡访树中每个结点,使得每个结点均被访问一次,而且仅被访问一次。遍历对线性结构来说,是一个容易解决的问题。而对二叉树则不然,由于二叉树是一种非线性结构,每个结点都可能有两颗子树,因而需要寻找一种规律,以便使二叉树上的结点能排列在一个线性队列上,从而便于遍历。回顾二叉树的递归定义可知,二...原创 2018-02-24 20:19:24 · 432 阅读 · 0 评论 -
数据结构之二叉树的创建
文章开头首先要感谢一下国嵌嵌入式教育的工作者们。创建二叉树 二叉树不仅比通用树结构简练,而且同时拥有通用树相同的操作。要想创建二叉树,首先就得了解一下二叉树的存储结构。已知二叉树的存储结构分为顺序存储结构和链式存储结构。其中链式存储结构又分为二叉链表和三叉链表。1. 顺序存储结构:按照顺序存储结构的定义,在此约定用一组地址连续的存储单元一次自上而下、自左至右存储完全二叉树上的节点元素,即将完全二叉...原创 2018-02-24 15:43:59 · 91314 阅读 · 4 评论 -
数据结构之二叉树的定义和性质
通过上一节讲解,我们知道通用树结构是采用双亲孩子表示法模型建立的。每个结点都有一个指向其双亲的指针,每个结点都有若干个指向其孩子的指针。如下图:整体实现起来比较复杂,今天我们来讲一下另一种树结构模型:孩子兄弟表示法模型。每个结点都有一个指向其第一个孩子的指针,每个结点都有一个指向其第一个右兄弟的指针。如下图:孩子兄弟表示法:每个结点包含一个数据指针和两个结点指针。1. 数据指针:指向保存于树...原创 2018-02-17 21:26:06 · 1326 阅读 · 0 评论 -
数据结构之通用树结构的实现
之前我们讲了树的定义和操作,这节我们讲一下如何实现这些操作。既然要考虑如何实现,那就得说说树的存储结构。大家都知道树是非线性数据结构,显然我们无法用数组来表示树的逻辑结构。那我们应该怎么办呢?通过什么来表示呢?其实可以设计结构体数组对结点间的关系进行表述。如下图所示:从上图发现,将根结点的双亲定义为-1,表示其没有双亲;将根的孩子结点的双亲定义为0,表示其双亲是根结点;将根结点孩子1的孩子结点的双...原创 2018-02-17 14:54:38 · 8622 阅读 · 2 评论 -
数据结构之树的定义及操作
树的定义树是一种非线性的数据结构树是由 n ( n ≥0 ) 个结点组成的有限集合如果 n = 0,称为空树(如下图a);如果 n > 0,则:1.有一个特定的称之为根(root)的结点,它只有直接后继,但没有直接前驱;2. 除根以外的其它结点划分为 m (m ≥0)0) 个互不相交的有限集合T0,T1,…,Tm-1,每个集合又是一棵树,并且称之为根的子树(subTree)。树家族中的概念(...原创 2018-02-14 16:40:46 · 789 阅读 · 1 评论 -
数据结构之内部排序三
上两节讲解的几种排序方法不是时间复杂度大了,就是不稳定,今天我们讲一下一种时间复杂度低又稳定的一种内部排序方法;归并排序基本思想:将两个或两个以上的有序序列合并成一个新的有序序列:有序序列V[1] …V[m]和V[m+1] …V[n] V[1] …V[n]这种归并方法称为2路归并。将3个有序序列归并为一个新的有序序列,称...原创 2018-02-13 16:44:26 · 297 阅读 · 0 评论 -
数据结构之内部排序二
上一节我们讲解三种简单的排序算法,虽然这3种排序算法的排序结果都是稳定的,但是他们的时间复杂度都是O(n^2),所以这三种算法不是最佳的排序方法,今天我们讲几个时间复杂度低于这三种的排序算法。排序动画二1.希尔排序基本思想:将待排序列划分为若干组,在每一组内进行插入排序,以使整个序列基本有序,然后再对整个序列进行插入排序。例如:将 n 个数据元素分成d 个子序列:{ R[1],R[1+d],R[1...原创 2018-02-13 15:28:55 · 270 阅读 · 0 评论 -
数据结构之内部排序一
排序算法演示动画一选择排序选择排序的方法包含:简单选择排序、树形选择排序、堆选择排序等。我们主要讲一下最简单的选择排序:简单选择排序法。基本思想:每一趟 (例如第 i趟,i = 0, 1, …, n-2)在后面 n-i(*1)个待排的数据元素中选出关键字最小的元素, 作为有序元素序列的第 i 个元素。*1.有的书上或教材说是n-i+1,那是因为其他书上或者教材上都是从i = 1开始选择的,而这里是...原创 2018-02-12 17:22:14 · 463 阅读 · 0 评论 -
数据结构之排序的概念及分类
排序的概念排序的一般定义:排序是计算机内经常进行的一种操作,其目的是将一组“无序”的数据元素调整为“有序”的数据元素。例如:将下列关键字序列52,49, 80, 36, 14, 58, 61, 23, 97, 75调整为14,23, 36, 49, 52, 58, 61 ,75, 80, 97排序的数学定义:假设含n个数据元素的序列为{ R1, R2, …, Rn }其相应的关键字序列为{ K1,...原创 2018-02-12 14:52:24 · 1245 阅读 · 0 评论 -
数据结构之队列的特别实现
队列的特别实现上两节讲的队列实现方式确实提高了顺序队列和链式队列的效率,可是实现过程还是比较复杂。这样就有可能导致错误,其实有即能复用之前的代码,又比较高效的队列实现算法的。那就是用栈来实现,可能有人要说了,栈不是后入先出的吗?怎么可能实现栈呢?大家考虑一下,如果使用两个栈呢?如下图:大家是不是明白一点了呢?下面做个小结:1.组合使用两个栈的“后进先出”可以实现队列的“原创 2018-02-12 13:41:47 · 243 阅读 · 0 评论 -
数据结构之链式队列的优化
链式队列的优化上一节我们讲了一下顺序队列的优化,本节我们讲一下链式队列的优化。同理,我们得先知道链式队列的瓶颈在哪里。链式队列的瓶颈1.线性表的第一个元素作为队头,线性表的最后一个元素作为队尾;2.入队的新元素是在线性表的最后,时间复杂度为O(n);3.出队的元素即链表的第一个元素,时间复杂度O(1)。问题:如何将入队操作的时间复杂度降低到O(1)?链式队列的优化方案1.定义rear指针始终指向链...原创 2018-02-10 16:25:41 · 645 阅读 · 0 评论 -
数据结构之顺序队列的优化
顺序队列的优化我们既然想优化顺序队列,首先得知道目前顺序队列的瓶颈在哪里,那样才能对症下药。顺序队列的瓶颈:1.线性表的第一个元素作为队头,线性表的最后一个元素作为队尾;2.入队的新元素是在线性表的最后,时间复杂度为O(1)3.出队时需要将后续的所有元素向前移动,时间复杂度O(n)问题:如何将出队操作的时间复杂度降低到O(1)?顺序队列的优化方案1.定义front使其始终代表队头的下标,出队时将队...原创 2018-02-10 16:01:57 · 516 阅读 · 0 评论 -
数据结构之队列的定义与简单实现
队列的定义与简单实现和栈相反,队列是一种先进先出(FIFO)的线性表,队列仅在线性表的两端进行操作:1.队头(Front):取出数据元素的一端;2.队尾(Rear):插入数据元素的一端。现实中,队列的例子也有很多,比如:银行排队办业务,食堂排队打饭等。既然队列也是一种线性表,那么理论上也应该有线性表该有的操作。队列的一些常用操作:1.创建队列;2.销毁队列;3.清空队列;4.进队列;5.出队列;6...原创 2018-02-10 15:26:24 · 469 阅读 · 0 评论 -
数据结构之栈与递归的应用(八皇后递归解法)
前面几节讲述了递归的一般应用,本节讲一下递归的另一个重要的应用场合回溯算法,利用函数调用的活动对象可以保存回溯算法中重要的变量信息 。递归与回溯递归在程序设计中也常用于需要回溯算法的场合。回溯算法的基本思想:1.从问题的某一种状态出发,搜索可以到达的所有状态;2,当某个状态到达后,可向前回退,并继续搜索其它可达状态;3.当所有状态都到达后,回溯算法结束。程序设计中可利用函数的活动对象保存回溯算法的...原创 2018-02-09 15:27:18 · 1011 阅读 · 0 评论 -
数据结构之栈与递归的应用(全排列递归解法)
上一节讲了一下汉诺塔的递归实现,这一节说一下全排列递归解法。参考了Casionx的博客,给博主带来的不便请原谅。全排列算法思路解析 全排列递归解法全排列的定义和公式:从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列。由排列的定义,显然不同的顺序是一个不同的排列。从n个元素中取m个元素的所有排列的个数,称为排列数。从n个元素取出n个元素的一个排...原创 2018-02-09 11:58:12 · 1600 阅读 · 0 评论 -
数据结构之栈与递归的应用(汉诺塔递归解法)
上一节简单的讲述了递归的实现与简单应用,接下来我们说一下另一个经典应用。汉诺塔递归解法一.起源:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。二.抽象为数学问题...原创 2018-02-09 11:50:13 · 758 阅读 · 0 评论 -
数据结构之栈与递归的实现及应用(斐波拉契数列递归解法和strlen递归解法)
栈与递归程序中的“函数调用栈”是栈数据结构的一种应用。函数调用栈一般是从高地址向低地址增长的,栈底为内存的高地址处,栈顶为内存的低地址处。函数调用栈中存储的数据为活动记录。活动记录是函数调用时一系列相关信息的记录。 函数调用过程: 程序中的栈空间可看做一个顺序栈的应用。栈保存了一个函数调用所需的维护信息:1.函数参数,函数返回地址;2.局部...原创 2018-02-09 11:33:25 · 814 阅读 · 0 评论 -
数据结构之栈的应用(算术计算)
栈的应用实战2-->算术计算问题的提出:计算机的本质工作就是做数学运算,那计算机可以读入字符串“9 + (3 - 1) * 5 + 8 / 2”并计算值吗?波兰科学家在20世纪50年代提出了一种将运算符放在数字后面的后缀表达式。对应的,我们习惯的数学表达式叫做中缀表达式。由于中缀表达式符合人类的阅读和思维习惯,后缀表达式符合计算机的“运算习惯”,所以为了计算机能够读入字符串并计算出数值原创 2018-02-07 14:55:41 · 876 阅读 · 0 评论 -
数据结构之栈的应用(语法匹配)
栈的应用实战1-->语法匹配问题的提出:在C语言中有一些符号是成对匹配出现的,如:1.括号: ( ), [ ], { }, ;2. 引号: ‘ ‘, “ “。几乎所有的编译器都具有检测括号是否匹配的能力。如何实现编译器中的符号成对检测???算法思路:1.从第一个字符开始扫描;2.当遇见普通字符时忽略,当遇见左符号时压入栈中;3.当遇见右符号时,从栈中弹出栈顶符号原创 2018-02-05 20:38:59 · 296 阅读 · 0 评论 -
栈和队列之栈的定义和实现
栈的定义与实现栈的定义:栈是限定在表尾进行插入或删除操作的线性表。栈是一种特殊的线性表,栈只允许在线性表的一端进行操作。1.栈顶(Top):允许操作的一端;2.栈底(Bottom):不允许操作的一端。栈的性质:后进先出(LIFO)。栈的一些常用操作:1.创建栈;2.销毁栈;3.清空栈;4.进栈;5.出栈;6.获取栈顶元素;7.获取栈的大小。原创 2018-02-05 16:38:02 · 342 阅读 · 0 评论 -
线性表之双向链表
双向链表双向链表的定义:在单链表的结点中增加一个指向其前驱的pre指针。双向链表在单链表的基础上增加了指向前驱的指针。功能上双向链表可以完全取代单链表的使用。双向链表的Next,Pre和Current操作可以高效的遍历链表中的所有元素。单链表的数据元素无法直接访问其前驱元素,但是双向链表可以实现。双向链表拥有单链表的所有操作1.创建链表;2.销毁链表;原创 2018-02-04 13:19:59 · 338 阅读 · 0 评论 -
线性表之循环链表
循环链表单链表的局限:单链表可以用于表示任意的线性关系,有些线性关系是循环的,即没有队尾元素。由于单链表的局限性,我们在单链表的基础上做了加强,让其形成循环链。循环链表的定义:将单链表中最后一个数据元素的next指针指向第一个元素。循环链表可以完全取代单链表的使用。循环链表的Next和Current操作可以高效的遍历链表中的所有元素。循环链表拥有单链表的所有操作原创 2018-02-04 13:16:59 · 389 阅读 · 0 评论 -
线性表之静态链表
静态链表静态链表的定义:顺序表数组中的元素由两个数据域组成:data和next,data域用于存储数据,next域用于存储下一个元素在数组中的下标。表头中的data用于存放链表长度,next用于存放链表第一个元素的下标。静态链表是在顺序表的基础上利用数组实现的单链表!静态链表的相关定义静态链表操作获取第pos个元素操作:1.判断线性表原创 2018-02-03 18:00:34 · 686 阅读 · 0 评论 -
线性表之单链表
线性表的链式存储结构链式存储定义:为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息。链式存储逻辑结构:n个结点链接成一个链式线性表的结构叫做链表,当每个结点中只包含一个指针域时,叫做单链表。链表的基本概念表头结点:链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息。数据结点:链表中代表数原创 2018-02-03 17:56:09 · 1149 阅读 · 0 评论 -
线性表之简介及顺序表
线性表的本质线性表的定义:线性表是具有相同类型的 n( ≥0)个数据元素的有限序列。((a1,a2, …, an)ai是表项,n 是表长度。)线性表(List)是零个或多个数据元素的集合。线性表中的数据元素之间是有顺序的。线性表中的数据元素个数是有限的。线性表中的数据元素的类型必须相同。线性表的性质:1. a0为线性表的第一个元素,只有一个后继 a;2. n原创 2018-02-02 10:03:34 · 332 阅读 · 0 评论 -
数据结构及算法总结(概述)
开头瞎逼逼程序的本质:程序是为了实际的问题而存在的,从本质上而言,程序是解决问题的步骤描述。首先要理解实际问题,确认问题类型(如:数值计算、求最小值),确认求解的步骤(如:打开文件、读数据、关闭文件、计算和)。优秀的开发者需要追求代码的高“性价比”,用尽量少的内存空间解决问题,用尽量少的步骤解决问题。程序是为了具体问题而存在的,程序需要围绕问题的解决进行设计,同一个问题可以有多种解原创 2018-02-01 11:49:14 · 543 阅读 · 0 评论