![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C数据结构与算法
文章平均质量分 87
数据结构与算法笔记
雫#1999
道阻且长
展开
-
数组总结以及数组链表
a原创 2020-08-11 09:10:41 · 120 阅读 · 0 评论 -
创建二叉树及二叉树三种遍历(下)
准备工作一览有了必要的工具后和框架后,需要仔细考虑二叉树创建的过程,将其转化为代码,写入修改好的框架中1- 分析创建二叉树的具体过程下面的部分参考代码,栈操作重复步骤就能得到先根序的二叉树2- 由字符串创建先根序二叉树bTree.h文件:#ifndef _MEC_BINATRY_TREE_H_#define _MEC_BINATRY_TREE_H_typedef struct B_TREE { int data; struct B_TREE *left; struct B_TRE原创 2020-08-10 17:09:08 · 262 阅读 · 0 评论 -
创建二叉树及二叉树三种遍历(中)
准备工作一览完成了一些必要的工具后,接下来考虑二叉树的创建,这里采用自动状态变迁图的方法的完成对二叉树表达式的判断自动状态变迁图的简介当由用户从键盘使用gets()函数输入一个字符串时,用来判断该字符串是否合理,且进行必要的操作,如 判断一个包含( )+ - * / , 字符 数字的多项式是否输入合理,并且对其计算结果,或在生成二叉树时也需要自动状态变迁图辅助,这里只讨论对一个二叉树表达式的输入是否合理进行判断自动状态变迁图的原理先思考并画出可能存在的所有状态,使用循环,一个个的处理字符原创 2020-08-10 17:08:56 · 204 阅读 · 0 评论 -
创建二叉树及二叉树三种遍历(上)
准备工作一览为了创建一颗二叉树,需要使用到自动状态变迁图和堆栈等,详细需要:(1),定义基本类型和的mec.h和包含mec.h的跳过空格的mec.c(2),定义显示错误的error.h和具体显示错误函数的error.c(3),定义堆栈结构定义处理堆栈函数的stack.h和具体操作堆栈的stack.c准备工作1- mec.c 和mec.h的创建//mec.h头文件#ifndef _MEC_H_#define _MEC_H_typedef unsigned char boolean;原创 2020-08-10 17:08:40 · 141 阅读 · 0 评论 -
字符串匹配-暴力搜索,KMP算法 C
1- 使用暴力搜索来确定目标字符串在原字符串第一次出现的下标暴力搜索的大概过程:(1)采用两个指针(具体实现中用两个数组下标控制),第一次用子串的第一个字符和原串的第一个字符相比较,如果相同,两个指针各向后移动一次,接着比较这两个字符是否相等(2)如果某一次匹配失败,原串的指针移动到下一个字符上,子串指针回到第一个字符上重新开始比较,不断移动比较,如果找到了则返回此次比较时原串的指针,如果没找到则返回NOT_FOUND即可(3)确定找到了和没找到的条件:在原串中找到了该子串,则此时子串的指针指向0原创 2020-08-06 20:04:16 · 255 阅读 · 0 评论 -
创建稀疏矩阵并转置-C
1- 创建一个稀疏矩阵的前置要求采用三元组来表示矩阵,每一个三元组对应存储三个要素信息,行值,列值和数值,三元组方式存储稀疏矩阵必须满足:非0数值的三元组,按行升值排序,行值相同按列值升序排列需要两个结构体来确定最终形成的稀疏矩阵进行的操作依次是:初始化,录入,打印,销毁,转置每个三元组的组成内容typedef struct TRIPLR_ELEMENT { int data; int row; int col;}TRIPLR_ELEMENT;最终形成的稀疏矩阵所需内容typede原创 2020-08-04 10:37:41 · 1337 阅读 · 0 评论 -
三大类六种排序算法-C
1-排序简单介绍排序:将无序键重新排列,使之有序键集:键的集合,这里默认待排序的数据都是唯一的,即不存在重复数据,这是一种理想情况,通常不作为重点有序:升序和降序内排序和外排序:内存数据排序和外存数据排序(通常外排序是通过调入内存中实现排序)稳定性:假设某次待排序的数据中,存在相同数据,排序前其物理顺序与排序后物理顺序不变,即对于所有数据,任意排序,只要依然用这种算法,其顺序是不会改变的三大类六种排序算法:(1):直接插入排序,希尔排序(2):直接选择排序,堆排序(利用完全二叉树)(3)原创 2020-07-29 17:55:31 · 11160 阅读 · 11 评论 -
哈夫曼3-对已经过哈夫曼压缩的文件解压缩
经过对原文件进行哈夫曼压缩后,得到了后缀为.mecHuf的新文件这个新文件,起始是16B的文件头,包含了解压缩所需要的必要信息,文件头后是连续的由 1 和 0组成的哈夫曼编码1- 由原文件创建目标文件,并为目标文件更名增加新后缀同博客 哈夫曼2- 对文件进行哈夫曼压缩并处理原文件的第一部分,新产生的目标文件的后缀更改为.dehuf且新增函数判断此处原文件是否为.mecHuf的文件boolean isHuffmanFile()函数将会打开原文件,并逐个读取前三个字符分别与m,e,c比较是否相等,原创 2020-07-24 19:36:42 · 170 阅读 · 0 评论 -
哈夫曼2-对文件进行哈夫曼压缩并处理原文件
先考虑文件名称的创立这个生成新的文件,并更改目标文件的下标的程序,先需要创建两个文件名,在判断源文件是否存在,最后分情况将源文件的值拷入目标文件,并更改新产生的文件的后缀主函数调用argc是主函数参数个数,argv[n]是具体第几个参数,在命令行里输入...原创 2020-07-23 22:18:25 · 159 阅读 · 0 评论 -
哈夫曼1-用哈夫曼编码与哈夫曼树完成对字符串的编码及解码
哈夫曼树是二叉树的一种特别应用,哈夫曼树仍然是一颗二叉树,只是其满足一定条件(带权最短路径二叉树)这里先尝试实现取出一个由英文字母组成的字符串中每个出现的字母及其出现的次数需求分析:1,从键盘输入一个字符串2,对该字符串中出现的字符进行频度统计3,根据频度统计,完成哈夫曼树4,根据哈夫曼树得到每一个字符的哈夫曼编码5,将原字符串中的每一个字符,与其相对应的哈夫曼编码代替,得到结果6,将结果还原成原字符串这里先实现最简单的求字符串中每个字符的频度这样就完成了对字符串中字符的出现频率分原创 2020-07-16 19:52:36 · 4876 阅读 · 1 评论 -
文件编程-文件操作的几个基本函数
1-文件是计算机表示信息的最小逻辑单位,文件是一个外存的概念,但凡提到文件,就一定与外存有关,文件内的数据可以调到内存,就只能用 数据 描述2-文件的组成:文件名 + 文件内容在window操作系统中,可以双击某个文件,看到文件的内容,但实际上看到的并不是真实内容,而是真实的文件内容(二进制数据)通过特定软件进行解析的结果,文件编程是对真实的文件内容进行读,写操作3-OS所提供的一套文件操作机制:电视机机制文件是一个外存的概念,想对其内容进行操作,需要将文件内容调到内存中才可以进行,文件需要先调入内原创 2020-07-19 20:19:11 · 377 阅读 · 0 评论 -
内存管理及内存对齐模式
1-内存管理(内存的分配与回收)内存的分配与回收是由OS完成的简单的内存分配与回收的方法基于:连续存储空间分配与回收(连续空间)连续存储空间分配与回收会造成“内存碎片”(外部碎片),在存在内存碎片的情况下,会出现这样的问题:某一个软件需要的内存空间,在内存中,没有一个碎片可以满足,但是多个碎片的整合可以满足该软件对内存空间的需求,这意味着,实际上余下的内存是够用的,但是由于内存空间被分为多段使用,余下的碎片,每一个碎片都不可以满足程序内存要求,使得内存分配失败,这叫做内存的“假满”,产生该问题的关键原创 2020-07-23 19:31:54 · 283 阅读 · 0 评论 -
栈的概念及用栈完成括号匹配
1-栈:逻辑线性结构栈的操作特点:在一个端口进行数据的操作栈的性质特点:先入后出,栈具有记忆性2-对栈的控制:通过 栈底指针ebp 和栈顶指针esp,就可以对栈内的数据操作栈底指针通常是固定的,这里只讨论 固定栈底 的栈,所以可以忽略栈底指针3-栈的存储结构:与线性表一样,应该建立一个 栈控制头 ,将控制栈的所有量 封装 到这个控制头中结论:通过 void *arr[10];可以存储任意用户类型数据的值所占的空间首地址,间接地说,arr存储的数据类型是 任意用户类型!这比在userType.h原创 2020-07-19 11:09:59 · 112 阅读 · 0 评论 -
九位数以内的哥德巴赫猜想验证
目标:需要用程序验证9位数内哥德巴赫猜想,且程序应该尽可能的省时哥德巴赫猜想:任意一个大于4的偶数可以分解成两个质数之和,即,需要验证从6开始到999999998之内的所有偶数,每一个都可以被分解成两个质数之和的形式,对于某一个数,只需要发现一对符合要求的数,则该数字符合猜想,如果发现了一个范围内偶数,不可以分解成两个质数和的形式,才能证明该猜想错误基于上述考虑,需要一个返回值为boolean类型的函数,对其传递一个偶数,该函数试图将其拆分成两个质数之和,拆分成功,返回true,否则返回false并停止原创 2020-06-18 16:12:13 · 477 阅读 · 0 评论 -
位运算及简单应用-定义宏取位,置位,清位
1-位运算符基于二进制位的运算,一定要从二进制角度和补码角度出发考虑~ 按位取反,每一位二进制 0 变 1, 1 变 0,对于int i = 1; ~i的结果?1的原码和补码为0000 0000 0000 0000 0000 0000 0000 0001取反其补码为 1111 1111 1111 1111 1111 1111 1111 1110则~1原码为 1000 0000 0000 0000 0000 0000 0000 0010所以 ~1 = -2& 按位与 有一位为0,则原创 2020-06-17 16:32:27 · 964 阅读 · 0 评论 -
约瑟夫环问题-循环数组解决
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时把编号从0~n-1,最后结果+1即为原问题的解要求编写出列的程序,并按顺序输出出列人的序号...原创 2020-06-08 15:57:16 · 551 阅读 · 0 评论 -
线性表2-利用线性表工具完成多项式加法
使用已经定义好的LINEAR中的函数用来创建一个多项式加法工具要求:输入两个多项式,并得到其相加结果接下来先完成设定比较原则,初始化线性表和销毁线性表接下来考虑输入多项式时遇到的问题,每次输入一个时,采用追加的方式,将每个输入的项追加到前一个,再打印出来,形成一个多项式,并且需要得知其内count和capacity的关系,需要判空函数和取count函数接下来先考虑打印多项式,对于这个问题,先处理打印多项式中单个项的问题,再用循环的方法打印出每个单项,并形成多项式当能够打印多项式后,接下来处原创 2020-07-18 12:34:32 · 208 阅读 · 0 评论 -
线性表1-用线性表创建工具来完成屏幕点坐标管理
对于函数功能的选择,应该满足几个基本要求:功能应该具有原子属性:即功能不能分割功能应尽可能完善:所提供的功能能够满足对线性表这种数据结构的实际应用操作若某功能可以用上述原子功能组合而成,那么这个功能尽可能不提供,即,为了使工具所提供的功能尽可能简单,因为只有简单才能保证安全(鲁棒性)若某个功能虽然不是原子功能,是复合功能,但是是非常常用的功能,那么,可以酌情实现增加该功能线性表:数据之间关系一一对应,有一个没有前件的件和一个没有后件的见件,其它任何一个件,都有且仅有一个前件和后件,并且在任意增加或原创 2020-07-17 20:24:15 · 131 阅读 · 0 评论