![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
educoder数据结构与算法
文章平均质量分 66
魈宝贝是我的呀
一起快乐的敲代码呀(痴呆脸)
展开
-
educoder数据结构 查找 第2关:实现散列查找
目录任务描述相关知识编程要求测试说明代码实现任务描述本关要求通过补全函数ILH_InsKey和ILH_DelKey来分别实现插入和删除操作。相关知识本关讨论散列存储,散列函数使用除留余数法,冲突解决方法采用独立链表地址法。假设有 8 个关键码: 7 , 15 , 23 , 31 , 12 , 14 , 10 , 17 ,采用散列函数hash(key)=key%7,其存储结构图如图 1 所示,它由 7 个独立链表组成,散列值相同的关键码在同一个链表里,独立链表的头结点组原创 2021-12-15 16:35:20 · 5628 阅读 · 1 评论 -
educoder数据结构 查找 第1关:实现折半查找
目录任务描述相关知识编程要求测试说明代码实现任务描述本关要求通过补全函数BSL_FindKey来实现在已排序的顺序表中查找关键码值为key的结点并返回该结点的编号。相关知识折半查找通常是针对顺序存储的线性表,线性表的结点按关键码从小到大排序,后面称之为折半查找的顺序表。为了简化讨论,假设折半查找的顺序表中每个结点只含一个关键码,关键码为整数。图 1 给出了一个存储了 4 个关键码的折半查找的顺序表的存储结构图。下面描述了线性表顺序存储的一种实现方案。该实现方案的示意图原创 2021-12-15 16:32:20 · 5221 阅读 · 0 评论 -
educoder数据结构 树 第2关:打印二叉树
目录任务描述相关知识编程要求测试说明代码实现任务描述本关任务:请你实现 PrintTree.cpp 里的void PrintTreeRootLeft(TNode* r, int layer)函数。相关知识用二叉树的双指针结构存储二叉树,每个结点所含数据元素均为单个字母,试编程实现按树形状打印二叉树的算法。例如:图 1 的二叉树打印为右边的形状。图 1 打印树结构示意图图 1 中的二叉树打印出来的树结构实际上是一个6行4列的矩阵,如图 2 所示。图原创 2021-12-14 17:37:16 · 6971 阅读 · 0 评论 -
educoder数据结构 树 第1关:由双遍历序列构造二叉树
目录任务描述编程要求代码实现任务描述本关任务:实现 ConstructTree.cpp 里的TNode* InPreToTree(char *pa, char *ia, int p1, int p2, int i1, int i2)函数。相关知识给定一棵二叉树的前序遍历序列和中序遍历序列可以构造出这棵二叉树。例如前序序列是ABDECFG,中序序列是DBEAFCG,那么这颗二叉树的结构如图 1 所示。树结点结构定义为:struct TNode{ char.原创 2021-12-14 17:34:36 · 11695 阅读 · 2 评论 -
educoder数据结构 字符串匹配 第2关:实现KMP字符串匹配
任务描述本关的编程任务是补全 step2/kmp.cpp 文件中的KmpGenNext函数,以实现 KMP 字符串匹配。该函数生成给定字符串的next数组。相关知识第 1 关中实现的朴素的字符串匹配算法在实际应用系统中效率低,而 KMP 字符串匹配算法可以实现高效的匹配。假设长字符串为t,短字符串为p。为了进行 KMP 匹配,首先需要计算字符串p的next数组,后面实现了计算该数组的函数void KmpGenNext(char* p, int* next)。对于 “abcabcab” ,计算原创 2021-12-14 17:30:46 · 5168 阅读 · 2 评论 -
educoder数据结构 字符串匹配 第1关:实现朴素的字符串匹配
任务描述本关任务是实现函数int FindSubStr(char* t, char* p)。相关知识在一个长字符串中寻找一个短字符串出现的位置,这是字符串匹配问题。例如:长字符串是 “string” ,短字符串是 “ring” ,那么短字符串在长字符串中出现的位置是 2 ,即 “ring” 在 “string” 中出现的开始位置是 2 。编程要求本关的编程任务是补全 step1/mystr.cpp 文件中的FindSubStr函数,以实现朴素的字符串匹配。具体请参见后续测试样原创 2021-12-14 17:28:33 · 5377 阅读 · 0 评论 -
educoder数据结构 计算表达式 第2关:栈的应用 - 计算后缀表达式
任务描述本关任务要求通过实现函数double ComputePostfix(char* s)来计算后缀表达式。相关知识和中缀表达式的计算一样,后缀表达式的计算也需要用到栈。关于链接存储的栈,其中已实现了如下操作: 创建栈:创建一个链式栈。具体操作函数定义如下: LinkStack* LS_Create(); 释放栈:释放栈所占用的空间。具体操作函数定义如下: void LS_Free(LinkStack* ls); 清空一个栈:将链式栈变为空栈。具体操作函数定义如下:原创 2021-12-14 15:56:01 · 3243 阅读 · 0 评论 -
educoder数据结构 计算表达式 第1关:栈的应用 - 计算中缀表达式
任务描述本关任务要求通过实现函数double ComputeInfix(char* s)来计算中缀表达式。相关知识中缀表达式的计算需要用到栈。关于链接存储的栈,其中已实现了如下操作: 创建栈:创建一个链式栈。具体操作函数定义如下: LinkStack* LS_Create(); 释放栈:释放栈所占用的空间。具体操作函数定义如下: void LS_Free(LinkStack* ls); 清空一个栈:将链式栈变为空栈。具体操作函数定义如下: void LS_MakeEmp原创 2021-12-14 15:53:07 · 4191 阅读 · 0 评论 -
educoder数据结构与算法 栈 第1关:实现一个顺序存储的栈
任务描述本关任务是实现 step1/SeqStack.cpp 中的SS_IsFull、SS_IsEmpty、SS_Length、SS_Push和SS_Pop五个操作函数,以实现判断栈是否为满、是否为空、求栈元素个数、进栈和出栈等功能。相关知识栈的基本概念栈是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算,这一端被称为栈顶。栈既可以采用顺序存储,也可以采用链接存储来实现。下面给出了一种基于顺序存储的栈的实现方案:如图 1 所示:该栈存储了 4 个元素 {56,77,1原创 2021-12-11 12:19:52 · 10288 阅读 · 1 评论 -
educoder数据结构与算法 队列 第2关 实现一个链接存储的队列
任务描述本关任务:实现 step2/CLnkQueue.cpp 中的CLQ_IsEmpty、CLQ_Length、CLQ_In和CLQ_Out四个操作函数,以实现判断队列是否为空、求队列长度、队列元素入队和出队等功能。相关知识链式队列的定义队列的存储除了顺序存储之外也可以采用链接存储方式来实现。图 1 描述了队列的一种链接存储实现方案。该队列存储了 3 个元素 {56,77,15} ,其中 56 为队列头, 15 为队列尾。这种实现方案中涉及到的两个属性元素如下:rear:原创 2021-12-11 12:16:18 · 8153 阅读 · 0 评论 -
educoder数据结构与算法 图 第2关:实现图的深度优先遍历
任务描述本关任务:实现 graph.cpp 里的函数int Graph_DepthFirst(Graph*g, int start, Edge* tree)。 注意遵守约定:编号大的先进栈。相关知识图 2 给出了对图 1 的无向图的存储结构图:每个顶点的名称由一个字符串描述,所有字符串的起始地址组织为一个数组,数组的起始地址为vetex;顶点的相邻关系保存在相邻矩阵中,其起始地址为adj,adj[i*n+j]的值为 1 表示i号顶点到j号顶点有边,为 0 表示无边,其中n是顶点个数,i和原创 2021-12-09 17:35:00 · 11039 阅读 · 0 评论 -
educoder数据结构与算法 队列 第1关:实现一个顺序存储的队列
任务描述本关任务:实现 step1/SeqQueue.cpp 中的SQ_IsEmpty、SQ_IsFull、SQ_Length、SQ_In和SQ_Out五个操作函数,以实现判断队列是否为空、是否为满、求队列长度、队列元素入队和出队等功能。相关知识队列是一个插入操作和删除操作受到限制的线性表数据结构。队列的插入和删除被限制在表的两端,即插入操作只能在表的一端进行,而删除操作只能在表的另一端进行,因此队列又称先进先出表。顺序存储的队列队列既可以采用顺序存储,也可以采用链接存储来实现。下面给出原创 2021-12-09 16:26:35 · 11842 阅读 · 1 评论 -
educoder数据结构与算法 线性表 第2关:实现一个链接存储的线性表
任务描述本关任务:完成一个链接存储的线性表的小程序。相关知识线性表的存储也可以采用链接存储方式来实现。链接存储方式包括单链表、双链表和循环链表等形式。下面描述了一种基于单链表的线性表实现方案:为了讨论简单,假设数据元素的类型为整型:typedef int T;在链表中,每个数据元素为一个链表结点,结点的具体定义为:struct LinkNode { T data; LinkNode* next; };如上面的单链表示意图所示,一个链表主要有front原创 2021-12-09 16:22:57 · 4279 阅读 · 0 评论 -
educoder数据结构与算法 线性表 第1关:实现一个顺序存储的线性表
任务描述本关任务:实现 step1/Seqlist.cpp 中的SL_InsAt、SL_DelAt和SL_DelValue三个操作函数,以实现线性表中数据的插入、删除与查找等功能。相关知识线性表是最基本、最简单、也是最常用的一种数据结构。线性表结构中,数据元素之间通过一对一首尾相接的方式连接起来。具体实现时,线性表可以采用不同的存储策略。下面给出了一种基于顺序存储的线性表实现方案:该方案将线性表存储在一片连续空间里,并通过data、len和max三个属性元素。组织成为一个结构:dat原创 2021-12-09 16:21:17 · 6011 阅读 · 2 评论 -
educoder数据结构与算法 复习指针基本概念 第3关:利用指针方法求数组的最大值和最小值
任务描述本关任务:编写程序,利用指针方法求数组的最大值和最小值。相关知识擂台赛算法思想求最大值的擂台赛算法思想:从数组中任意找一个数组元素作为擂主,默认是最大值,遍历数组,将每个数组元素依次和擂主比较,如果比擂主大就将这个数组元素的值赋给擂主,否则就离开,直至最后一个数组元素,即可得出擂主就是最大值。为了完成本关任务,需要定义一个指针变量指向任意一个数组元素,擂主是指针变量指向的数组元素,遍历数组,将每个数组元素依次和指针变量指向的数组元素比较。如果大就将这个数组元素的地址赋给指针变量,原创 2021-12-09 16:18:11 · 1306 阅读 · 1 评论 -
educoder数据结构与算法 复习指针基本概念 第2关:交换两个指针变量的值
任务描述本关任务:编写程序交换两个指针变量的值。相关知识为了完成本关任务,你需要掌握指针数据类型。基本数据类型和指针数据类型的区别指针是一种特殊的,同时又是具有重要作用的数据类型。其值用来表示某个变量在内存储器中的地址。虽然指针变量的取值类似于整型量,但这是两个类型完全不同的量,因此不能混为一谈。int a = 100; // 100为int型常量,a为int型变量 double b = 3.14; // 3.14为double型常量,b为double型变量 int *p原创 2021-12-09 16:15:40 · 2660 阅读 · 1 评论 -
educoder数据结构与算法 复习指针基本概念 第1关:通过指针变量间接访问变量
任务描述本关任务:编写程序通过指针变量间接访问整型变量。相关知识为了完成本关任务,你需要掌握: 1.如何定义指针变量; 2.掌握两个与指针变量有关的运算符。如何定义指针变量指针变量指的是定义存放变量地址的变量,定义指针变量如下:int *p1; //p1是指向int型变量的指针变量 float *p2; //p2是指向float型变量的指针变量 double *p3; //p3是指向double型变量的指针变量 char *p4; //p4是指向char型变量的指针变量原创 2021-12-09 16:10:00 · 4028 阅读 · 2 评论 -
educoder数据结构与算法 图 第1关:实现图的宽度优先遍历
任务描述本关任务:请你实现 graph.cpp 里的int Graph_WidthFirst(Graph*g, int start, Edge* tree)函数。 注意遵守约定:编号小的优先入队列。相关知识图 2 给出了对图 1 的无向图的存储结构图:每个顶点的名称由一个字符串描述,所有字符串的起始地址组织为一个数组,数组的起始地址为vetex;顶点的相邻关系保存在相邻矩阵中,其起始地址为adj,adj[i*n+j]的值为 1 表示i号顶点到j号顶点有边,为 0 表示无边,其中n是顶点个原创 2021-12-09 15:59:43 · 12323 阅读 · 6 评论