数据结构初步
文章平均质量分 72
想写好代码的小猫头
新晋北邮人!
展开
-
最短路径(Dijkstra算法)
设置一个集合S存放已经找到最短路径的顶点,并设置一个源点,dist[]数组中存放源点距离每个顶点的最短距离,path[]数组中存放的是最短路径,基本过程可以如下描述:(下图来自懒猫老师的《数据结构》相关课程笔记)每个分量distfl表示当前所找到的从始点v到终点»的最短路径的长度。path[i]是一个字符串,表示当前所找到的从始点v到终点vi的最短路径。初态为:若从V有弧,则path[i]为0:否则置path[i]为-1。,将选定的源点加入U,将源点距(直接)其他顶点的距离赋值给dist[]数组。原创 2022-09-24 14:03:02 · 3505 阅读 · 2 评论 -
最小生成树(Prim算法,Kruskal算法)
用Prim算法和Kruskal两种算法实现构建并输出最小生成树原创 2022-09-06 15:54:58 · 5807 阅读 · 0 评论 -
图的遍历(广度优先遍历,BFS)
广度优先遍历入栈是按照层次将结点进行先后保存,先出栈的也是层数最小的结点,从而实现了广度优先遍历的按层数先后进行访问的要求。因为广度优先遍历操作中需要队列的基本操作,下面的队列(循环队列)为两种图的广度优先遍历共用的。输出: (结点数据为char类型时要注意输入时的空格和换行符的读取问题)图的遍历操作是从图中某一顶点出发,对图中所有顶点访问一次且仅访问一次。(1)在图中,遍历的起始顶点是编号最小的顶点。,将未被访问的邻接点访问并入栈(内层循环);(2)访问顶点v,顶点v入队列Q;(2)邻接表的广度优先遍历。原创 2022-09-03 11:00:25 · 4164 阅读 · 7 评论 -
图的遍历(深度优先遍历,DFS)
图的遍历之深度优先遍历详解,用邻接矩阵法和邻接表法两种方法实现,有测试用例及输出原创 2022-09-01 14:41:37 · 4885 阅读 · 0 评论 -
图的存储(邻接矩阵,邻接表,十字链表)
图的储存方式,邻接矩阵,邻接表和十字链表图解以及部分储存方式的完整代码实现原创 2022-08-12 18:06:31 · 488 阅读 · 0 评论 -
图的逻辑结构
1)图是由顶点的有穷非空集合和顶点之间边的集合,在图中,顶点个数不能为零,但可以没有边(2)有方向或箭头的边称为有向边,没有箭头的边称为无向边;图任意两顶点间都为有向边的图称为有向图,任意两顶点间都为无向边的图称为无向图。.........原创 2022-08-12 10:02:48 · 805 阅读 · 0 评论 -
哈夫曼编码(构建哈夫曼树)
给定一组具有确定权值的叶子结点,带权路径长度最小的二叉树1,权值越大的叶子结点越靠近根结点,而权值越小的叶子结点越远离根结点2,只有度为0(叶子结点)和度为2(分支结点)的结点,不存在度为1的结点哈夫曼编码就是在哈夫曼树的基础上,从叶子结点开始向上遍历,左孩子记录码为0;右孩子记录码为1。..................原创 2022-08-08 16:24:19 · 7715 阅读 · 0 评论 -
二叉树遍历的非递归算法
非递归的算法主要采用的是循环出栈入栈来实现对二叉树的遍历,下面是过程分析原创 2022-08-05 12:28:26 · 16383 阅读 · 9 评论 -
线索二叉树(线索链表遍历,二叉树线索化)
特别的是,对于D和F,D是中序遍历的开头结点,它没有前驱节点;F是中序遍历的结尾的结点,它没有后继节点,那么这时,寻找的规则是,如果结点的Ltag==1代表可以直接找到前驱节点;由下图可见,有的左右指针是连接的子树,没有链接左右子树的指针现在就通过红色的虚线指向了该结点的前驱或者后继。可以发现,相较于原来的二叉链表,这里在数据结构里添加了两个int类型,来规定左右指针的作用。再通过以下步骤创建一个线索二叉树(下图是中序线索二叉树的结构示意)线索二叉树,即在二叉链表的基础上,将二叉链表的。...原创 2022-07-27 22:47:19 · 5074 阅读 · 1 评论 -
树、森林与二叉树的转换
1.加线,将双亲和左孩子的右孩子,右孩子的右孩子,右孩子的右孩子的右孩子..相连。当所有二叉树连起来后,此时所得到的二叉树就是由森林转换得到的二叉树。依次把后一棵二叉树的根结点作为前一棵二又树根结点的右孩子。1.前序(根)遍历前序遍历森林即为前序遍历森林中的。2.后序(根)遍历后序遍历森林即为后序遍历森林中的。2.保留双亲与第一个孩子连线,删去与其他孩子的连线。可以发现树的后序遍历和转化后二叉树的中序遍历相等。可以发现树和转化后的二叉树的前序遍历相等。2.去线,将所有双亲和右孩子的连线。...原创 2022-07-27 14:57:37 · 2678 阅读 · 2 评论 -
根据二叉树的遍历结果确定二叉树
根据前序和中序遍历结果,后序和中序遍历结果求得唯一的二叉树并前序输出过程详解和完整代码原创 2022-07-24 11:14:37 · 1840 阅读 · 0 评论 -
二叉树的基本性质(链表和顺序存储的转换,结点个数,叶子结点个数,复制,删除)
二叉树的基本性质详解及完整实现代码原创 2022-07-20 18:37:35 · 974 阅读 · 0 评论 -
二叉树的遍历和创建
层序遍历这里使用了前面队列的知识,根据根指针,左孩子,右孩子的顺序逐个入队出队。(在层序遍历的时候需要调用,里面还有二叉树结构体的定义)(里面有些函数没用到)2.根指针出队,根指针有左孩子则左孩子入队;3.队首出队,队首有左孩子则左孩子入队;若二叉树为空,则空操作返回;若二叉树为空,则空操作返回;若二叉树为空,则空操作返回;(保存所有的遍历操作函数)2.前序遍历根节点的。3.前序遍历根节点的。1.前序遍历根节点的。3.前序遍历根节点的。1.前序遍历根节点的。2.前序遍历根节点的。.........原创 2022-07-19 15:08:10 · 846 阅读 · 0 评论 -
二叉树的基本性质和储存结构
二叉树的特点;特殊的二叉树:(1)斜树(2)满二叉树(3) 完全二叉树二叉树基本性质小结:二叉树的存储结构:(1)二叉树顺序存储(2)二叉链表(3)三叉链表原创 2022-07-15 09:51:48 · 233 阅读 · 0 评论 -
树的存储结构
以下总结树的四种存储结构,以下是树的基本结构示意图:这种方式是建立一个数组,里面的数据结构类型如下,分别存储了该结点的双亲的下标,第一个孩子的下标和兄弟的下标。(其中-1模拟链表中的NULL值)例如:怎么寻找结点的所有孩子呢?先找到该结点第一个孩子的下标,再访问第一个孩子的右侧兄弟,再访问右侧兄弟的右侧兄弟...以此类推,直到访问的结点没有右侧兄弟,即找到了所有的孩子。数据结构表示:2.孩子链表表示法2.1通过树的度来建立指针域,每个指针域指............原创 2022-07-14 11:42:04 · 2339 阅读 · 0 评论 -
稀疏矩阵的加法和乘法(三元组)
三元组方法:主要的特点就是最后的结果矩阵均由三元组的形式来表达,调用函数再以矩阵形式输出(1)稀疏矩阵加法(下图参考懒猫老师《数据结构》课程相关笔记)(2)稀疏矩阵乘法(稀疏矩阵(顺序).h--用来实现稀疏矩阵的基本操作和加乘功能;稀疏矩阵加乘.c--用来对稀疏矩阵的加乘操作进行验证)(1)稀疏矩阵(顺序).h(2)稀疏矩阵加乘.c(3)测试输出 (验证一下矩阵乘法~这里用的matlab)答案是一致的! 初学小白,有错误欢迎指正喔!~...原创 2022-07-12 16:27:12 · 11190 阅读 · 0 评论 -
矩阵压缩存储(对称,三角,对角,稀疏)
利用一维数组对各种特殊矩阵进行储存的方法,以及实现稀疏矩阵顺序存储的完整代码和测试用例原创 2022-07-12 15:12:18 · 4687 阅读 · 3 评论 -
字符串匹配(BF算法 +KMP算法)
BF算法,又称Brute Force暴力算法,从主串S的第一个字符开始和模式T的第一个字符进行比较,若相等,则继续比较两者的后续宇符;否则,从主串S的第二个宇符开始和模式T的第一个字符进行比较,重复上述过程,直到T中的字符全部比较完毕,则说明本趟匹配成功;或S中字符全部比较完,则说明匹配失败。可以参考下下图:(参考懒猫老师《数据结构》相关课程笔记) 即每一次匹配失败以后,指向主串的i向后移动一位,而指向模式串T的j总是回到串首,重新进行判断(这里我用了两种有些区别的方法实现了BF算法)KMP算法:....原创 2022-07-09 18:06:30 · 1357 阅读 · 0 评论 -
队列应用:银行排队模拟(离散事件模拟)
假设某银行有四个窗口对外接待客户,从银行开门到关门之前起不断有客户进入银行。由于每个窗口只能接待一个客户,因此在客户人数众多时需在每个窗口前顺次排队,对于刚进入银行的客户,如果某个窗口的业务员正在空闲,则可上前办理业务,反之,若四个窗口均有客户所占,他便会排在队伍最短的队伍后面。假设事件表中最早发生的事件是新客户到达,则随之应得到两个时间(均由随机生成数函数得到):(1)是本客户办理业务所需时间(2)是下一个客户将到达银行的时间间隔。现在,需要编制一个程序以模拟银行的这种业务活动并求出一天中客户在银行逗留的原创 2022-07-07 23:20:31 · 4362 阅读 · 3 评论 -
C语言-队列(链式队列,循环队列)
循环队列和链式队列详解及相关测试原创 2022-07-06 15:31:21 · 2062 阅读 · 3 评论 -
C语言-栈与递归-汉诺塔&八皇后(回溯法)
汉诺塔问题和八皇后问题的详细解答原创 2022-07-05 11:51:49 · 1081 阅读 · 0 评论 -
栈的应用:迷宫问题(DFS,非递归)
DFS迷宫问题超详解~原创 2022-07-04 08:45:49 · 1776 阅读 · 5 评论 -
C语言-实现栈的基本操作(链栈)
顺序栈和链栈比较:时间性能:相同,都是常数时间O(1)。空间性能:顺序栈:有元素个数的限制和空问浪费的问题。链栈:没有栈满的问题,只有当内存没有可用空间时才会出现栈满,但是每个元素都需要一个指针域,从而产生了结构性开销。总之,当栈的使用过程中元素个数变化较大时,用链栈是适宜的,反之,应该采用顺序栈。...原创 2022-07-03 11:43:36 · 3796 阅读 · 2 评论 -
C语言-用栈实现表达式求值
为实现算符优先算法,可以使用两个工作栈。一个称做 OPTR,用以寄存运算符;另一个称做 OPND,用以寄存操作数或运原创 2022-07-02 12:03:53 · 13156 阅读 · 8 评论 -
C语言-实现栈的基本操作(顺序栈)
下面用两种方式来构建顺序栈,分别是将top定义为指针类型和将top定义成指针下标两种形式,实现栈的基本操作。原创 2022-07-01 08:13:47 · 8731 阅读 · 0 评论 -
6-5 链式表操作集 (20 分)
题目描述:其中List结构定义如下:typedef struct LNode *PtrToLNode;struct LNode { ElementType Data; PtrToLNode Next;};typedef PtrToLNode Position;typedef PtrToLNode List;各个操作函数的定义为:输入样例:612 2 4 87 10 242 12 87 5输出样例:2 is found and de原创 2022-03-06 16:14:23 · 117 阅读 · 0 评论 -
链表作业 3:多项式加法
题目描述:实现两个一元n次多项式的加法。例如P(A)=x+3x2-5x5+7,P(B)=2x2+6x3+x5-4x6,求P(A)+P(B)。输入:每行是两个用空格隔开的整数m,n,分别代表多项式的系数和指数,以输入0 0作为结尾输出:每次完成一个多项式的输入后,先输出该多项式;当第二个多项式输出完成后,下一行输出两个多项式输出的结果(多项式打印的要求: 如果是第一项,不要打+号 //如果不是第一项,且系数为正数,要打加号 //如果系数为负数,...原创 2022-02-16 11:56:29 · 1326 阅读 · 0 评论 -
链表作业2:约瑟夫环问题(猴子选大王)
问题描述:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下1只猴子时,这个猴子就是猴王,编程要求输入n,m后,输出最后猴王的编号。输入:每行连续的两个整数n,m,用一个空格分开,以0 0结束输入输出:每行一个整数,代表猴王的编号一,链表法方法:1.链表的创建(尾插法) 2.链表的删除易错点:1. 因为连续的输入,所以每次开始创建新链表的时候都要定...原创 2022-02-13 22:22:40 · 2870 阅读 · 0 评论 -
链表作业1:学生管理系统
要求:完成学生管理的链表程序。具有学生信息增加、显示、修改、删除、查找、学生人数统计功能的程序。增加学生信息时,按照学号排序;根据给定的学号,可以完成指定学号的修改、删除和查找功能。一.定义数据结构1)定义学生结构体的数据结构typedef struct Student{ char studentName[NAME_LENGTH];//姓名 char studentNo[NO_LENGTH];//学号 char studentgender[GENDER_LENGTH];//性原创 2022-02-06 16:28:32 · 503 阅读 · 0 评论 -
链表(单向,循环,双向)
目录一,单向链表1)结点的设置2) 创建一个单向链表1.头插法(特点:与输入数据的顺序相反储存)2.尾插法(特点:与输入数据的顺序相同)3)单链表结点的删除4)单链表的释放(唯一移动头指针的类型)二,循环链表 (能访问链表中某一结点前面的数据)三, 双向链表1)结点设置一,单向链表1)结点的设置typedef struct node { int data; //数据域 struct node *next; //指针域 ...原创 2022-02-05 23:02:59 · 283 阅读 · 0 评论