
数据结构
文章平均质量分 69
柒-寒
悟已往之不谏,觉今是而昨非。实迷途其未远,知来者之可追。
展开
-
数据结构代码题汇总
#include <stdio.h> #include <stdlib.h> //Day01 //在带头结点的单链表 L 中,删除所有值为 x 的结点,并释放其空间,假设值为 x 的结点不唯一 //编写算法以实现上述操作 void Del_x(LinkList &L,ElemType x){ LNode *p = L->next,*pre = L,*q; while(p != NULL){ if(p->data == x){原创 2023-12-19 20:21:20 · 806 阅读 · 1 评论 -
考研真题数据结构
此算法需要遍历所有顶点和边,并且使用优先队列来选择当前最短距离的顶点,所以主要时间消耗在队列的操作上。算法的基本思想是从源点开始,逐步扩展周围的顶点,通过比较选择最短路径来更新当前顶点到其他顶点的距离。- 如果通过顶点u到达顶点v的路径长度更短,更新顶点v的最短距离为新的路径长度。3. 创建一个优先队列(优先级队列),将源点加入队列,并将源点的最短距离设为0。5. 当队列为空时,dist数组中存储的就是源点到所有顶点的最短距离。2. 将源点的最短距离初始化为0,其他顶点的最短距离初始化为无穷大。原创 2023-12-15 17:16:17 · 842 阅读 · 0 评论 -
考研真题数据结构
然后,我们通过遍历链表A、B和C,使用插入和删除操作来实现集合操作 A = (B-C) ∪ A。(3)我们的算法需要对链表A、B和C进行遍历,时间复杂度为 O(n),其中 n 是链表的长度。2. 对于链表A中的每个节点,判断是否在链表B中出现,并且不在链表C中出现。- 如果节点在B中出现且不在C中出现,将该节点从链表A中删除。3. 将链表B中的节点插入到链表A中,并保持链表A的递增有序性。// 实现集合操作 A = (B-C) ∪ A。// 将B中剩余的节点插入到A中。// 删除链表A中的节点。原创 2023-12-11 20:45:27 · 592 阅读 · 0 评论 -
考研真题数据结构
在上述代码中,我们首先定义了一个 `Node` 结构体来表示邻接表中的节点,以及一个 `Graph` 结构体来表示图。然后,我们实现了创建图、添加边和统计图中所有顶点度的函数。(3)算法的时间复杂度是 O(V+E),其中 V 是顶点数,E 是边数。【2021山西大学考研真题】设计一个算法,统计一个采用邻接表存储的具有n个顶点的无向无权图。2. 对于每个顶点,遍历其邻接表,统计其邻接点的个数即为该顶点的度。// 添加从dest到src的边(无向图)1. 遍历图中的所有顶点,统计每个顶点的度。原创 2023-12-10 19:09:42 · 505 阅读 · 0 评论 -
考研真题数据结构
然后,我们使用插入排序的思想对链表中的奇数位序子链表和偶数位序子链表分别进行排序。最后,我们使用合并两个有序链表的方法将两个排序好的子链表合并为一个有序链表。2. 遍历链表,找到链表的中间节点,并将链表划分为两个子链表,一个子链表包含奇数位序的节点,另一个子链表包含偶数位序的节点。(3)我们的算法需要对链表进行遍历和插入操作,时间复杂度为 O(n^2),其中 n 是链表的长度。O(1)且时间上尽可能高效的算法,将链表中的元素按从小到大的顺序排序。// 找到当前节点在排好序的子链表中的位置,插入该位置。原创 2023-12-09 17:24:09 · 1245 阅读 · 0 评论 -
考研真题数据结构
然后,我们编写了一个递归函数 `mirrorBinaryTree`,用于实现二叉树节点交换的操作。通过递归调用,我们可以将二叉树中所有非叶节点的左右子树交换位置,并得到镜像二叉树。在 `main` 函数中,我们创建了一个测试用例,并分别输出原二叉树和镜像二叉树的结果。(1)设计一个算法,将二叉树中所有非叶节点的左右子树交换位置,从而得到原二叉树的镜像二叉树。(3)算法的时间复杂度是 O(n),其中 n 是二叉树中的节点数。算法的空间复杂度是 O(h),其中 h 是二叉树的高度。(1)给出算法的基本思想;原创 2023-12-08 20:35:33 · 752 阅读 · 0 评论 -
考研真题数据结构
(3)在上述代码中,我们首先创建了一个 `appeared` 数组来记录出现过的绝对值。在处理每个节点时,我们根据节点数据的绝对值在 `appeared` 数组中的值来判断节点是否重复出现,并进行删除操作。- 如果该节点的数据绝对值在 `appeared` 数组中对应的位置上为0,则将该位置的元素设置为1,表示该绝对值已经出现过。(4)算法的时间复杂度为 O(n),其中 n 是链表中的节点个数。- 如果该节点的数据绝对值在 `appeared` 数组中对应的位置上不为0,则将这个节点从链表中删除。原创 2023-12-07 21:11:36 · 733 阅读 · 0 评论 -
考研真题数据结构
(2)在上述代码中,我们首先判断根节点是否为空,如果为空,则返回一个足够小的值(这里使用INT_MIN)。最后,比较根节点的关键字值和左、右子树的最大关键字值,返回最大值。基本思想是比较根节点的关键字值和左子树、右子树的最大关键字值,然后返回最大值。(3)算法的时间复杂度是 O(n),其中 n 是二叉树的节点数量。因此,该算法的时间复杂度是线性的,与二叉树的规模成正比。【2020年山西大学真题】二叉树存储形式为(lchild,data,rchild),给出求二叉树的最大关键字。(1)给出算法的基本思想;原创 2023-12-06 22:07:17 · 334 阅读 · 0 评论 -
考研真题数据结构
在上述代码中,首先定义了二叉树结点的数据结构 `TreeNode`,以及创建新结点 `createNode` 的函数。然后定义了递归函数 `getTreeDepth`,根据设计思想实现了求二叉树深度的算法。在二叉树的深度求解算法中,每个结点都只会被访问一次,所以该算法的时间复杂度为 O(n),其中 n 是二叉树中的结点个数。3. 如果树不为空,则树的深度等于其左子树和右子树深度的较大值加1。printf("二叉树的深度为:%d\n", depth);// 树为空,深度为0。// 定义二叉树结点的数据结构。原创 2023-12-05 22:20:57 · 418 阅读 · 0 评论 -
考研真题数据结构
在 `main` 函数中,通过调用 `findMinElement` 函数,找到数组中的最小元素,并打印出来。3. 如果遍历到的元素小于 `min_element`,则更新 `min_element` 的值为遍历到的元素的值。1. 假设数组中的第一个元素为当前的最小元素,将其保存在一个变量 `min_element` 中。2. 从数组的第二个元素开始遍历,比较遍历到的元素和 `min_element` 的大小。5. 返回 `min_element` 即为数组中的最小元素。数组的最小元素为:1。原创 2023-12-05 22:13:33 · 672 阅读 · 0 评论 -
考研真题数据结构
接下来定义了顺序表的基本操作函数 `init`、`insert`、`remove`、`get` 和 `print`。在 `main` 函数中,首先初始化了一个顺序表对象 `list`,然后通过调用 `insert` 函数向顺序表中插入元素,通过调用 `remove` 函数从顺序表中删除元素,通过调用 `get` 函数获取指定位置的元素值,并通过调用 `print` 函数打印顺序表中的所有元素。// 位置为 2 的元素值:30。// 顺序表的元素:10 20 30。// 顺序表的元素:10 30。原创 2023-12-05 21:52:05 · 389 阅读 · 0 评论 -
考研数据结构基础试卷练习
1.设某数据结构的二元组形式表示为A=(D,R),D={01,02,03,04,05,06,07,08,09},R={r},r={,,,,,,,},则数据结构A是( )。3.设有向图G的二元组形式表示为G =(D,R),D={1,2,3,4,5},R={r},r={,,,,,},则给出该图的一种拓扑排序序列__________。原创 2023-12-02 19:16:04 · 1044 阅读 · 5 评论 -
数据结构课后习题答案
第 1 章 绪论 1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结 构、抽象数据类型。 答案: 数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的 总称。如数学计算中用到的整数和实数,文本编辑所用到的字符串,多媒体程序处理的图形、 图像、声音、动画等通过特殊编码定义后的数据。 数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。在有些 情况下,数据元素也称为元素、结点、记录等。数据元素用于完整地描述一个原创 2023-12-01 19:06:10 · 1181 阅读 · 0 评论 -
考研数据结构重要知识点
是:首先访问图中某一起始顶点v,然后由v出发,访问与v邻接但未被访问的顶点w1,再访问与W1邻接但未被访问的顶点w2.....重复上述过程,当不能再向下访问时,依次退回到最近被访问的结点,若他还有顶点未被访问过,则从该点开始继续上述的搜索过程,直至图中所有顶点都被访问过为止。:此算法是双层循环,外层循环控制次数,一共要归并n个顶点,因此要循环n-1次,内层并列两个循环,每个循环负责遍历一个数组,其时间复杂度为o(n),因此此算法的时间复杂度为O(n2),时间复杂度只与顶点有关,与边无关,适用于稠密图。原创 2023-12-01 17:19:29 · 1046 阅读 · 1 评论 -
已知某有向图的邻接表,求该图各节点的入度和出度(C语言版)
然后,我们编写了函数来创建有向图的邻接表节点、创建有向图和添加有向边到有向图。最后,我们打印出各节点的入度和出度,并释放了动态分配的内存。int V = 5;// 有向图的顶点数。// 计算有向图各节点的入度和出度。// 打印各节点的入度和出度。// 计算有向图各节点的入度和出度。// 初始化入度和出度数组。// 定义有向图的邻接表节点结构。// 添加有向边到有向图。// 定义有向图的邻接表结构。// 创建有向图的邻接表节点。// 添加有向边到有向图。// 定义有向图结构。原创 2023-11-27 21:19:37 · 2002 阅读 · 4 评论 -
将邻接表转化为邻接矩阵(C语言版)
当将邻接表转化为邻接矩阵时,我们需要知道图的顶点数目,以便创建一个合适大小的矩阵。假设有n个顶点,我们可以使用一个二维数组来表示邻接矩阵,其大小为n×n。这个算法首先定义了邻接表的节点结构和邻接表结构。然后,它提供了创建节点、创建图、添加边等辅助函数。函数中,我们首先获取图的顶点数目和边数,并根据输入创建图。函数将邻接表转化为邻接矩阵,并返回一个指向矩阵的指针。// 添加从dest到src的边(无向图)// 添加从src到dest的边。函数将邻接表转化为邻接矩阵,并使用。// 邻接表转化为邻接矩阵。原创 2023-11-27 21:14:02 · 881 阅读 · 0 评论 -
将邻接矩阵转化为邻接表(C语言版)
这个程序首先会要求输入节点数和邻接矩阵,然后将邻接矩阵转换为邻接表,并打印出转换后的邻接表。请注意,这个示例假设输入的邻接矩阵是有效的,并且没有错误检查。当将邻接矩阵转换为邻接表时,我们需要遍历邻接矩阵的每个元素,找到非零元素的位置,并将其添加到相应的邻接表中。// 如果是无向图,还需要添加从目标节点到源节点的边。printf("转换后的邻接表:\n");// 添加从源节点到目标节点的边。// 将邻接矩阵转换为邻接表。// 初始化邻接表为空。// 创建邻接表数组。// 将邻接矩阵转换为邻接表。原创 2023-11-27 21:12:06 · 692 阅读 · 0 评论 -
判断一个单链表是否存在环(C语言版)
要判断一个单链表是否存在环,可以使用快慢指针算法,也称为Floyd's Cycle Detection算法。该算法使用两个指针,一个指针每次向前移动一个节点,而另一个指针每次向前移动两个节点。如果链表中存在环,那么这两个指针最终会相遇。如果链表中存在环,那么这两个指针最终会相遇,此时返回。// 空链表或只有一个节点的链表肯定没有环。// 快慢指针相遇,说明存在环。// 遍历完链表都没有相遇,说明不存在环。最后,记得释放链表节点的内存,避免内存泄漏。函数中,我们创建了一个包含环的链表,并调用。原创 2023-11-27 21:06:08 · 777 阅读 · 0 评论 -
假设有两个按元素值递增排列的线性表,均已单链表形式存储,将这两个单链表归并为一个按元素值递减排列的单链表(C语言版)
这个算法的基本思路是,首先定义一个虚拟节点作为新链表的头部,然后比较两个链表的当前节点值,将较小的节点插入到新链表的尾部,然后更新相应的指针。最后,将新链表反转,使元素值递减排列。在示例代码中,我们创建了两个有序链表,然后调用。函数将结果链表反转。最后,打印出合并后的链表。// 反转链表,使元素值递减排列。// 创建第一个有序链表。// 创建第二个有序链表。// 合并两个有序链表。函数将它们合并,并通过。// 插入节点到链表头部。// 定义链表节点结构。// 合并两个有序链表。原创 2023-11-27 21:03:28 · 1124 阅读 · 0 评论 -
将一个带头结点的单链表A分解为两个带头结点的单链表A和B,使得A表中含有的全是原表中的奇数,而B表中含有原表中为偶数的元素,且保持相对顺序不变(C语言版)
用于记录偶数链表B的尾结点。我们遍历原链表A的每个结点,根据结点的值判断是奇数还是偶数,然后将结点插入到相应的链表中。最后,我们将奇数链表A的尾结点和偶数链表B的尾结点的。【注意】这个算法假设原链表A的头结点不存储有效数据,而是用作链表的头部标记。因此,在创建链表和打印链表时,我们需要跳过头结点。printf("链表A中的奇数:");printf("链表B中的偶数:");// 创建空链表B和C。// 打印链表A和B。用于记录奇数链表A的尾结点,// 在链表末尾插入结点。,以表示链表的结束。原创 2023-11-27 20:58:25 · 1110 阅读 · 0 评论 -
设计一个求结点x在二叉树中的双亲结点的算法(C语言版)
printf("节点 %d 的双亲节点是 %d\n", targetNode, parent->data);printf("未找到节点 %d 的双亲节点\n", targetNode);// 如果根节点就是目标节点,返回 NULL,因为根节点没有双亲节点。// 如果目标节点是根节点的左子节点或右子节点,返回根节点。// 如果左右子树都没有找到,返回 NULL。// 在二叉树中查找指定节点的双亲节点。// 递归在左子树中查找。// 递归在右子树中查找。// 二叉树节点结构。原创 2023-11-26 22:49:51 · 966 阅读 · 1 评论 -
设计在链式存储结构上交换二叉树中所有结点左右子树的算法(C语言版)
printf("内存分配失败\n");printf("交换后的二叉树:");// 交换二叉树中所有节点的左右子树。printf("原始二叉树:");// 交换二叉树中所有节点的左右子树。// 打印交换后的二叉树。// 递归交换左右子树。// 打印二叉树(中序遍历)// 打印原始二叉树。// 创建新的二叉树节点。// 二叉树节点结构。原创 2023-11-26 22:47:39 · 925 阅读 · 1 评论 -
用递归算法求二叉树的深度(C语言版)
printf("二叉树的深度为:%d\n", depth);printf("内存分配失败\n");// 计算二叉树的深度。// 二叉树结点的定义。// 计算二叉树的深度。原创 2023-11-26 22:42:52 · 737 阅读 · 1 评论 -
用C语言设计一个算法使带头节点无序单链表递增有序
/ 将当前节点插入到已排序部分。// 当前要排序的节点。// 已排序部分的尾节点。// 当前节点已经是递增的,移动sortedTail和current。// 链表为空或只有头节点,无需排序。// 创建一个带头节点的链表。// 定义链表节点结构体。原创 2023-11-25 22:10:55 · 1046 阅读 · 1 评论 -
考研数据结构易错选择题
【解析】:3个结点的二叉树有5种形态:两层树:根左右;三层树: 根左(第二层)左(第三层)、根左(第二层)右(第三层)、根右(第二层)左(第三层)、根右(第二层)右(第三层)。原创 2023-12-03 15:04:00 · 2469 阅读 · 2 评论