数据结构基础
文章平均质量分 73
根据本人课程内容编写,所用教材:数据结构(C语言版)严蔚敏、吴伟民著
cyzhou1221
学生一枚
展开
-
数据结构(一)——数组
关于数组的基本知识就不在此赘述了,下面是关于数组及其基本操作的代码,如有错误,还请指正。原创 2019-05-11 22:41:42 · 235 阅读 · 0 评论 -
数据结构(二)——链表
#include<math.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#pragma warning(disable:4996)typedef struct mylist{ int data; struct mylist *next;}LI;LI *creat...原创 2019-05-11 22:41:24 · 123 阅读 · 0 评论 -
数据结构(三)——栈和队列
这是一道栈的应用题目,栈可以说是非常强大,可以用作许多递归问题的非递归实现,简称"递归终结者"。关于队列的基本操作的代码没有写,直接写了一个应用队列的例子——利用BFS求迷宫的最短路径。原创 2019-05-11 22:36:43 · 234 阅读 · 0 评论 -
数据结构(四)——稀疏矩阵
稀疏矩阵的压缩存储、转置和加法#include<stdio.h>#include<stdlib.h>#define N 30 //所含非零元素的最大个数#pragma warning(disable:4996)typedef struct mytripple//三元组{ int i,j; int data;}TR;typedef struct mym...原创 2019-05-11 22:38:28 · 896 阅读 · 0 评论 -
数据结构(五)——二叉树
二叉树#include<stdio.h>#include<string.h>#include<stdlib.h>#define N 100#pragma warning(disable:4996)typedef struct mybinarytree{ char data; struct mybinarytree *left, *right;...原创 2019-05-11 22:39:26 · 382 阅读 · 0 评论 -
数据结构(六)——树
树#include<stdio.h>#include<string.h>#include<stdlib.h>#define N 30#pragma warning(disable:4996)typedef struct node{ char data; struct node *fir,*sib; int layer;//记录所在层数...原创 2019-05-11 22:40:14 · 228 阅读 · 0 评论 -
数据结构(七)——图
采用邻接矩阵和邻接表两种方式表示图。原创 2019-05-13 13:25:55 · 355 阅读 · 0 评论 -
数据结构(八)——二叉排序树
#include<stdio.h>#include<string.h>#include<stdlib.h>#pragma warning(disable:4996)typedef struct mybst{ int data; struct mybst *left,*right;}BST;BST *create();//创建BST BST...原创 2019-05-13 13:26:52 · 179 阅读 · 0 评论 -
数据结构(九)——排序
排序算法中的一股泥石流!以十进制为例,按LSD进行排序,即先排个位数字开,再排十位数字,⋯\cdots⋯,直到最高位。具体做法是:利用十个桶,进行若干次的分配和采集。如果链表为空,则不需要排序;否则,先寻找最大值及其位数,即分配采集的次数;其次,将桶设置成空桶;然后,开始分配和采集:分配:从链表中的第一个元素开始,读取其当前位上的数值,将其从原始链表取下,放置到对应的桶的尾部,然后对后续元素进行相同处理;原创 2019-05-25 17:25:43 · 234 阅读 · 0 评论 -
数据结构应用实例(一)——中缀表达式
它的基本思想是:对文法中的每一个非终结符编写一个函数(或子程序),函数名是相应的非终结符,函数体是根据规则右部符号串的结构编写,函数(或子程序)功能是识别由该非终结符所表示的语法成分。,弹栈,将弹出的操作符放入后缀表达式,直到遇到左括号或者栈为空时,停止弹栈,将扫描到的操作符入栈;扫描完中缀表达式之后,如果栈仍不空,弹栈,将弹出的操作符放入后缀表达式,直到栈为空;最后,如果后缀表达式合法的话,栈中应只剩一个数值,便是最终结果,将其返回;如果扫描到右括号,则弹栈,将弹出的操作符放到后缀表达式中,直到弹出左。原创 2024-09-10 16:56:26 · 1279 阅读 · 0 评论 -
数据结构应用实例(二)——K均值聚类
根据这些点在空间中的位置分布,将这150个特征点分成三类,分类的依据是欧氏距离,同类点之间的距离比较小;反之,不同类别的点之间的距离会比较大。2、 设置二维数组 group 存放各类节点编号,nums 存放各类节点个数,在计算平均值的时候可以直接实现数据点的随机读取,大大提升算法的效率;6、 如果结果收敛,最后得到的算术平均中心和聚类中心完全重合,没有偏差,因为最后一次迭代前后,所有数据点的类别没有发生变化;4、 如果在某次分类之后,某一类不含节点,当即进行提示,并结束程序,防止出现除0操作;原创 2024-09-10 16:57:00 · 558 阅读 · 0 评论 -
数据结构应用实例(三)——赫夫曼编码
如果其有父节点,如果为父节点的左孩子,编码尾部添加 ‘0’,如果为右孩子,尾部添加 ‘1’,然后向根节点移动:当前节点变为其父节点,父节点变为父节点的父节点,进行相同操作。4、 进行 Huffman 编码时,由于是从叶子节点开始向前回溯到根节点,所以编码时从后向前进行,这样就避免了逆置编码;(2)在 F 中选取两棵根节点权值最小的树作为左右子树构造一棵新二叉树,其根节点的权值为两棵子树根节点权值之和;如果 num<=1,进行相关信息的显示,不进行 Huffman 编码;然后,统计出现过的字母个数 num;原创 2024-09-10 16:57:19 · 1136 阅读 · 0 评论 -
数据结构应用实例(四)——最小生成树
每次选择最近顶点,需要进行一次遍历,比较 N 次,之后将其添加进最小生成树,更新 weight 和 pre,一次遍历,N 次操作,总共需要选择 N-1 次,所以 prim 算法的时间复杂度为。4、 kruskal 算法,为图的结构体添加成员 E ——存放边的结构体数组,成员为两节点编号和边的权值,这样在创建图时,可以直接创建 E,同时,图的数据文件中添加边的条数;综合所述,Prim 算法适合顶点相对较少而边相对稠密的网的最小生成树的求解,而 Kruskal 算法适合于求边比较稀疏的网的最小生成树;原创 2024-09-10 16:57:42 · 1260 阅读 · 1 评论 -
数据结构应用实例(五)——关键路径
2、 对于关键路径不唯一的情况,采用 DFS 寻找关键路径,查找路径之前,标记非关键节点,避免后续访问,从而简化了节点添入路径的条件,提高算法的执行效率;3、 t 用于存储关键路径中的节点编号,由于关键路径中的节点均是关键节点,所以在给 t 分配空间时,分配的空间单位数与关键节点个数相同即可;1、 为了利用拓扑序列计算最早和最迟开始时间,在进行拓扑排序时,对排序序列进行记录;4、 在实际计算最早开始时间时,做法并不与算法思想完全一致,具体做法为:先设初值,对于最迟开始时间,进行类似操作;原创 2024-09-10 16:58:03 · 1495 阅读 · 1 评论 -
数据结构应用实例(六)——最短路径
第 k 次试探,中间节点的编号均不超过 k-1,从第 k 次到第 k+1 次的做法,添加节点 k,如果。不一定恰好是最短路径,也许经过其他节点中转后得到的路径长度更短,因此需要进行 n 次试探;1、 采用递归的方式输出路径,为得到正确结果,将起点和终点放在递归函数外进行输出;(中间节点的编号均不超过 k-1) 长度更短,则更新。(中间节点的编号均不超过 n-1),此时的路径即为。(中间节点的编号均不超过 k-1) 拼接成的路径。(4)、重复步骤(2)、(3),直到。的路径上的最后一个中转点,初始值为。原创 2024-09-10 16:58:30 · 1050 阅读 · 0 评论 -
SPFA的两种优化方法——SLF和LLL
本文将介绍 SPFA(Shortest Path Faster Algorithm) 算法 (Bellman-Ford 算法的队列优化算法的别称) 的两种优化方法:SLF(Small Label First) 优化和LLL(Large Label Last) 优化,并利用实例进行演示.原创 2019-05-25 17:18:24 · 3688 阅读 · 3 评论 -
关于最小生成树和最短路径的几个有趣问题
Q:不连通的树不含最小生成树,为什么?A:这很容易证明,如果含有最小生成树,图必定是连通的;反之,如果图是连通的,总可以利用prim算法或kruskal算法或者破圈法得到最小生成树;如果图不连通,prim算法和kruskal算法也会固执地给出起点所在连通分支的最小生成树。Q:将Dijkstra算法求得的起点到其余点的路径及路径上的点拼成一个新的图,该图是不是树?A:是。利用反证法,得...原创 2019-05-25 17:42:50 · 796 阅读 · 4 评论 -
二叉树三种遍历方式的非递归实现
代码说明C & C++结构体变量表示节点使用STL中的stack简化操作#include<cstdio>#include<iostream>#include<string.h>#include<stdlib.h>#include<stack> //栈using namespace std;#define N...原创 2019-07-08 17:44:05 · 333 阅读 · 0 评论 -
鸡尾酒排序
算法思想 鸡尾酒排序:基于冒泡排序的一种升级排序法 简单来说,冒泡排序每次从头走到尾,然后再跳到头,重新开始比较交换,往尾部走;鸡尾酒排序呢,是走回头路,从头到尾然后再从尾到头,如此往复; 同时加入了对冒泡排序的另一种优化:将有序区域和无序区域分隔开,减少比较次数,每趟循环利用变量 flag 记录最后一次的交换位置,该位置即是有序区和无序区的边界 index2 和 index1(ind...原创 2019-07-11 11:49:12 · 156 阅读 · 0 评论 -
What's 尾递归?
0 为什么会有尾递归?我们都知道递归和迭代: 递归直观,但太占内存和时间; 迭代运算快,但是不如递归代码简洁明了。 那么可不可以把这两者的优点结合在一起?答案是肯定的,尾递归就实现了这样的设想。1 什么是尾递归? 递归我们都知道,就是一个函数内部调用了自身,为了避免死循环,还得设置基准情况(或者是终止情况)。那什么是尾递归呢? 如果递归调用是整个函数体中最后执行的语句且递归...原创 2019-03-17 10:54:03 · 153 阅读 · 0 评论