ARM汇编实现流水灯,STM32F103,COTEX-M3系列指令
通过此汇编代码,不仅仅理解学会如何使用ARM汇编进行实际操作,而且可以很容易的了解STM32F103系列芯片的时钟构造,学会灵活配置系统时钟,AHB总线时钟,APB1,APB2时钟,并且可以完整的学习GPIO的配置原理和工作原理,可以说汇编语言完整的展现了c/c++代码现实的原理。通过本例汇编实验,我们可以对c/c++和嵌入式底层硬件有一个很深的了解。尤其是结合《编译原理》,《计算机组成原理》,《ARM体系结构与编程》这些书,读者可以更加深入了解MCU工作原理,C/C++是如何在MCU中工作的?
广义表复杂功能实现
根据输入广义表串进行智能解析,把广义表存储到内存中,然后可根据存储的广义表以广义表的格式进行打印。
可直接下代码编译生成可执行程序。
此代码中已经包含了串操作的全部功能,下载此代码后不需要重复下载串功能实现的代码。
广义表的基本操作功能全覆盖。
重点:1.广义表的创建,尤其是广义表各节点的理解需要大家认真体会,最好画图。
2.广义表的输出打印也是重点,尤其是广义表子表括号的打印需要判断。
可参考下面链接,本代码是改进增强版,已经过测试,在linux已经下运行成功。
链接: https://blog.csdn.net/kongkongl/article/details/38737465
串类型的基本定义和实现
下载好代码后直接在linux环境下减压,make之后即可产生可执行代码,压缩文件中已经包含了可执行代码。
通过串的堆分配存储结构来实现串的以下功能:
//生成一个值等于串常量chars的串string
int StrAssign(HString *str,char *chars);
//返回串string的长度
int StrLength(HString str);
//比较两个串的大小,如果str1 > str2,返回值>0,如果相等,返回0,如果str1 < str2,返回值<0
int StrCompare(HString str1,HString str2);
//清空串,释放串所占用的空间
int ClearString(HString *str);
//返回串Str1和Str2联合而成的串
HString Concat(HString str1,HString str2);
//返回串str的第pos个字符之后的长度为len的子串
HString SubString(HString str,int pos,int len);
//显示字符串
int StrTrave(HString str);
//-----------------------附加串操作函数--------------------------
//以下串操作可由基本串操作来实现
//串str1复制得到str2
int StrCopy(HString str1,HString *str2);
//串str为空串,返回1,否则返回0
int StrEmpty(HString str);
//如果主串str中存在和串substr相等的子串,则返回子串在主串中pos个字符之后第一次出现的位置 ,运用了KMP算法
int Index(HString str,HString substr,int pos);
//Index中包括了一个静态函数get_next(),这个函数可以得到字符串的最简匹配值(kmp算法中字符匹配失败后的下一个最佳匹配值)
//用字符串Tstr替换主串str中出现的所有与substr相等的子串
int StrReplace(HString **str,HString substr,HString Tstr);
//在串str的第pos个字符之后插入串substr
int StrInsert(HString *str,HString substr,int pos);
//从串str的第pos个字符起删除len个字符
int StrDelete(HString **str,int pos,int len);
//销毁现有串str
int StrDestory(HString *str);
树实现和树形图打印
功能一:按照树形图打印二叉树,型如:
8
7 11
4 9 10 15
功能2:实现创建一个有序的二叉树
功能3:实现平衡二叉树,对所创建的二叉树进行左旋和右旋,直到成为平衡二叉树。
功能3:按照树中数据删除某个节点,根据数据删除节点,例如:要删除如下树中数据为30的全部节点。(**表示空节点)
60
35 71
30 45 66 78
25 30 40 46 64 66 77 82
** ** 31 33 ** ** ** ** ** ** ** 67 72 ** ** **
会转换为:
60
35 71
25 45 66 78
** 31 40 46 64 66 77 82
** ** ** 33 ** ** ** ** ** ** ** 67 72 ** ** **
功能4:可以任意插入树中数据,按照有序树进行插入
栈的应用-计算器实现
可执行程序可以实现数学计算公式的复杂运算。下载压缩包后需要减压文件,在目录下在linux命令行输入要计算的公式的字符串即可求出结果,例如在linux命令行下输入执行命令 :./calculator "1+2*3-(6-3)*2+4-1" 即可求出字符串公式的结果。
栈和队列的实现2-队列
实现了两种方式的队列,一种是顺序存储队列的实现,一种是链式存储的队列实现,代码中有针对两种实现方法的测试用例和可执行程序,在linux系统下直接make即可。代码较多,尤其是队列的链式存储方式的实现,建议先学习我前面上传的双向链表实现内容,再看本章队列的链式存储实现。上传所有代码每一行都有注释,方便大家阅读。
两种实现方法函数在一个头文件中,顺序存储方式的函数名使用小写q开头,链式存储方式的函数使用大写Q开头
栈和队列的实现1
栈和队列是两种重要的线性结构。从结构的角度来说,栈和队列其实就是线性表,他们的基本操作其实就是线性表的子集。他们是操作受限的线性表。从数据类型的角度来看,它们是和线性表大小不相同的两类重要的抽象类型。
1.栈是限定在线性表表尾进行插入或删除操作的线性表,按照后进先出的的原则进行的线性表。
约瑟夫算法
约瑟夫环问题:一圈共有N个人,开始报数,报到M的人自杀,然后重新开始报数,问最后自杀的人是谁?
一元多项式的实现和操作
利用线性链表的基本操作来实现一元多项式的运算。表示一元多项式的链表是有序链表。代码部分有足够的注释可以进行参考。
双向环链表
从实际应用出发重新定义线性链表及其基本操作,从新定义的链表结构更加直观,节俭,易懂,思路清晰。
从编写底层驱动的思路来编写了库,整个编写只为实现简单的链表结构代码,对于程序员来说,编写驱动要对用户自定义的任何数据都足够开放容纳,而对于用户来说,底层代码的实现要尽量封装隐秘。用户只需要会调用即刻。
思路:1.链表中的数据域实际上是需要用户自己去定义,不要要底层用户直接去限制,在前面的链表实现中,数据域统一被写死,这种做法在实际应用中是不可取的,所以我们定义的链表节点结构体数据域应该为指向数据域的指针。
2.针对链表操作的方法,我们也需要根据用户自己的数据去进行定制,所以具体的方法应该交给用户自己去实现,我们只需要定义一个指向函数的指针来调用用户的具体实现函数。参考代码中的llist_cmp和llist_print函数。
无头节点的单链表
无头节点单链表的实现可是说是对C语言指针一个最直接、最贴合实际、也是最具有归纳性的程序设计应用。许多C语言基础面试题都涉及单链表的实现和构造,其目的就是考察面试者对C语言基础数据类型是否有足够的了解,对C语言指针是否掌握。链表的实现可以简单也可以很复杂,只是我们对待问题的态度不同,回想起了大学刚学习链表的时候,总是对链表中用到的结构体和链表节点有很多的迷茫,直到后来仔细研究了一番,并且写下了这个代码才解开了心中很久的困惑。
回看了一下自己写的这个单链表的实现,注释写的非常详细了,包括了单链表中二级指针的应用场景,为什么要使用二级指针这些问题都有一个详细的总结,也包括链表节点的结构体和学生个人信息结构体的这些区分。可以说是楼主就是从这个阶段才正真开始对结构体,对指针,对链表的“数据域”,“指针域”有了较为清晰的了解。
上传这些代码完全因为楼主确实想把自己学习过程中的遇到到一些问题和错误认识,以及一些经验共享出来,希望帮助那些和曾经的我一样充满迷茫困惑的同学朋友。
带头节点的链式存储线性表
带头节点的线性表的链式存储实现,实现了带头节点链表的创建,不同功能的插入操作,按位置插入,头插入尾插入。也有按数据,按位置删除链表的功能。压缩包中有可执行文件,也有makefile,在linux下直接make即可生成可执行程序,代码部分有详细的讲解,上学时候写的,今天拿出来重新整理一下。
线性表的顺序实现
线性表是一个相当灵活的数据结构,线性表按照存储方式进行分类有两种,分为顺序存储和链式存储,代码实现了线性表的顺序存储方式,按照数组方式进行实现的,也可自行定义分配一段连续的空间来实现顺序线性表存储方式,由于C语言中提供的数组可以达到相同的目的,所以代码中采用数组来达到申请连续内存空间的目的。
1.顺序存储方式由于逻辑上相邻的两个元素在实际的物理存储位置上也是相邻的,所以可以随机存取表中任意一个元素,但是正式由于这个特点,也造成了这种结构的弱点。
2.有代码中插入和删除函数可以看出,在对某一数据进行操作是,需要移动所需处理数据之后的各个元素,移动个数取决于插入或则删除元素的位置。导致了处理过程需要疆场的执行时间。
正则表达式详细介绍
非常全面的正则表达式介绍,在进行脚本处理数据的时候非常适用,由浅入深,覆盖面广,整篇详细阅读和实现后可达到触类旁通的效果,能对正则表达式产生足够的了解,引用起来更加得心应手。
makefile全面讲解
全面完整学习,复杂用法全都有,条理清晰,目录完整明白。