![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
honeylife
我就是我,我为自己代言,这里就是我创造自己的辉煌世界。
展开
-
检测是否为拓扑排序
检测是否为拓扑排序题目一个有向图,顶点存储在G[0…n-1]中,用邻接表存储,判断是否有拓扑排序代码(源码点击这里)1、数据类型的定义2、核心代码...原创 2019-10-24 16:10:44 · 673 阅读 · 1 评论 -
双向链表的访问,双向链表的排序
双向链表的访问,双向链表的排序题目已知不带头结点的双向链表第一个节点的指针为list,链节点除了数据域和分别指向该结点的前驱结点和后继结点的指针域外,还设置记录该节点访问次数频度域freq(初始值为0),请设计一算法LOCATE(list,x),该算法的功能是每当访问LOCATE(list,x)操作,数据域信息为X的结点freq域的值增加1,并且保持链表中结点的freq值得递减链接,使得频繁访...原创 2019-08-12 16:27:15 · 1425 阅读 · 0 评论 -
多个堆栈共享连续个存储空间
多个堆栈共享连续个存储空间分析由于堆栈是一个动态结构,一般使用顺序存储的时候用数组来实现,而数组是静态结构,这就使得存储空间大大的浪费。为了使空间的充分利用,将多个堆栈顺序的映射到一个已知大小为M的存储空间STACK[0…M-1]中。假设有两个堆栈共享这M个存储空间,只要让第一个栈的栈底位于STACK[0]处,第二个栈的栈底位于STACK[M-1]处。设计将item插入第i...原创 2019-08-16 13:05:22 · 2040 阅读 · 0 评论 -
建立二叉树链表结构
建立二叉树链表结构题目分析代码基本数据类型核心代码题目已知非空二叉树采用顺序存储结构,结点的数据信息依次存储在数组BT[0…MAXZize-1]中(若元素为0,表示在二叉树中不存在),请写一算法,生成该二叉树的链表结构。分析循环到某一点BT[i]时,主要是求结点的双亲结点,BT[i]结点到底链接在谁的的孩子结点,这是个主要的问题。计算双亲结点时,j=(i-1)/2;到底是j的左孩子还...原创 2019-08-21 16:04:10 · 2206 阅读 · 0 评论 -
求二叉树的深度
求二叉树的深度分析利用中序遍历方法(其他的遍历也可以),这里就以非递归的算法来实现吧。代码// 二叉树的深度# define M 50typedef struct node{ int data; struct node *lchild,*rchild;}BNode,*BTREE;int DEPTHBT(BTREE T){ BTREE STACK[M...原创 2019-08-29 14:43:54 · 603 阅读 · 1 评论 -
合并两个有序单链表的排序算法
合并两个有序单链表的排序算法分析有序的单边表,首先以第一个链表list1 为基准,循环与链表list2 作比较。假如,第一个链表先结束,直接将第二个链表的后面部分连接在list1之后。假如第二个先结束,那就不用遍历了。直接结束。这样做的话,时间复杂度为list1的长度,即为O(n),当然,以断的链表为准基的话,时间复杂度最快。代码// 合并两个 有序的单链表,让其有序...原创 2019-08-30 10:37:05 · 4988 阅读 · 2 评论 -
已知中序遍历 和后序遍历,建立二叉树 非递归算法设计
已知中序遍历 和后序遍历,建立二叉树 非递归算法设计题目已知中序遍历 和后序遍历,建立二叉树 非递归算法设计分析逐点插入法, 将后序插入到中序中假设后序POSOD[0…n-1],中序为 INOD[0…n-1]插入时,逆序遍历POSOD的每一个元素插入时,其实就是找,后序每一个元素在中序数据中的位置。代码这里代码就截图了,如果想看源码的就去这里哈。具体的路径在...原创 2019-09-17 17:35:23 · 647 阅读 · 0 评论 -
欧几里得算法 求最大公因子
欧几里得算法 求最大公因子题目求最大公因子分析已知求两个正整数 m 与 n 的最大公因子的过程用自然语言可以表述为反复执行如下动作:第一步:若 n 等于零,则返回 m;第二步:若 m 小于 n,则 m 与 n 相互交换;否则保存 m,然后将 n 送 m,将保存的 m 除以 n 的余数送 n。代码 (源码点击这里)递归算法非递归算法...原创 2019-09-19 11:01:25 · 1929 阅读 · 0 评论 -
相似二叉树与等价二叉树
相似二叉树与等价二叉树题目判断两颗二叉树是不是相似代码(源码点击这里)如果是判断等价二叉树: 既有相同的拓扑序列,而且对应结点的数据要相同。只是在相似的基础上添加一点点条件,即bt1->data==bt2->data如: if (bt1 != NULL && bt2 != NULL &&bt1->data==bt2->data&a...原创 2019-10-08 11:34:54 · 1007 阅读 · 0 评论 -
约瑟夫游戏
约瑟夫游戏题目约瑟夫实验,共有n个人围成一个圆桌,从k的位置开始,间隔m个数,数到m的时候,在m位置的人,退出圆桌,进行游戏,分析主要就是不带头节点的单循环链表的实现,以及删除链表中某一个结点代码(源码点击这里)这里就不展示代码,想看源码的同仁可以点击上面的按钮哈。...原创 2019-10-08 17:52:59 · 241 阅读 · 0 评论 -
合并单向循环链表
合并单向循环链表题目已知非空链表==(a1,a2,a3,a4,a5,…,an)==仅采用设置尾指针的单向链表作为存储结构(设尾指针为rear),请写一算法,将线性表改造为(a1,a2,a3,a4,…,an-1,an,an-1,…,a4,a3,a2,a1).要求:改造后的线性表次奥用仅设置尾指针rear的单向链表,并且算法中只有一个循环列表。分析思路,结果是关于an对称的线性表。第一步:...原创 2019-08-12 14:43:34 · 367 阅读 · 0 评论 -
循环列表的逆转
循环列表的逆转题目已知带头结点的循环列表的头结点指针为list,请别写一个算法,逆转链表链接的方向。代码// 逆转链表的链接方向void CHANGEOVER(LinkList list){ LinkList p,q,r; p=list->link; q=list; while (p!=list) { r=q;...原创 2019-08-12 10:39:31 · 263 阅读 · 0 评论 -
n阶魔方
n阶魔方题目n阶魔方 :将1~n^2个数填写到一个由n行n列的方阵中,使得每一行每一列及两个对角线上的数字之和分别等于同一个数。称这个方阵为一个n阶魔方示例当n=3时, 每行之和为15,如图618753294分析第一步:元素的位置记为(i,j),第一个元素为(0,n/2)第二步:下一个元素(i1,j1)为(i,j)的左上角位置处,及(i1=i...原创 2019-08-14 17:40:29 · 683 阅读 · 0 评论 -
删除链表中值域最大的结点
删除链表中值域最大的结点题目已知线性表的第一个结点的指针为list,请写一个算法,删除链表中数据值域最大的结点分析算法主要分两部分;第一:找到链表中值域最大的结点;第二:删除该节点。问题来了,如何删除呢,首先删除的的时候是不是得知道,删除结点的前驱结点呢?对的,就是这样。下面看代码吧。代码typedef struct node{ int data; struc...原创 2019-08-08 16:00:17 · 1285 阅读 · 2 评论 -
交换P所指结点与其下一个结点的位置
交换P所指结点与其下一个结点的位置题目已知线性表的第一个结点由list指出,请写一个算法,交换P所指结点与其下一个结点的位置(假设p指向的不是链表中的最后一个结点)。分析算法分两部分第一:当p所指的是链表的第一个结点时;第二:当P所指的是链表的中间结点时;代码// 交换P所指结点与其下一个结点的位置LinkList EXCHANGE(LinkList list,LinkLis...原创 2019-08-08 17:40:02 · 2646 阅读 · 0 评论 -
建立双向循环链表,反方向输出数据
建立双向循环链表 反方向输出数据题目请写一算法,该算法的功能是先通过键盘输入n个整型数据,建一个带头结点的双向循环链表,然后按照输入相反的次序依次输出这n个整型数据。示例假设输入:【1,2,3,4,5】则输出为:【5,4,3,2,1】分析第一步: 建立循环链表第二步:遍历循环链表代码第一种方法建立一个双向链表,然后在最后的头尾相连,构成循环链表。// 建立双向循环链表 ...原创 2019-08-13 14:42:19 · 1591 阅读 · 0 评论 -
双向循环链表大于0前移而小于0 后移
双向循环链表>0前移,<0 后移题目已知带头几点的双向循环链表头结点为list,除头结点外每个结点的数据域为整型,请写一算法,将链表中所有数据域大于0的结点放在小于0的前面。若链表中除头结点以外其他的为空,这返回0,否则,返回1.代码第一种需要移动指针,即直接将>0的数据移动到list的后继结点,缺点:频繁修改指针。// > 0 前移 ,<0 后移in...原创 2019-08-13 16:05:33 · 359 阅读 · 0 评论 -
最小结点移到链表的最前面
最小结点移到链表的最前面题目已知非空线性表第一个结点由list指出。请写一算法,将链表中中最小的结点移到链表最前面。分析此题与上面一道 “删除链表中值域最大的结点”的题大同小异,可以点击看看。代码// 已知非空线性表第一个结点由list指出。请写一算法,将链表中中最小的结点移到链表最前面。LinkList MINHEAD(LinkList list){ LinkList p...原创 2019-08-09 10:54:37 · 2796 阅读 · 1 评论 -
返回链表中倒数第K个结点
返回链表中倒数第K个结点题目请写一算法,该算法用尽可能高的时间效率找到list所指的线性链表的倒数第K个结点,若找到,返回该结点的信息,如果没有找到,返回NULL(2009年硕士研究生入学考试计算机全国联考题)。分析主要思路分三步:第一步:让指针p指向第K个结点第二步:再设置指针q指向链表的初始位置,即list所指的位置第三步:循环,让p,q同时向链表尾部移动,当p移到最后结点时,...原创 2019-08-09 11:58:05 · 749 阅读 · 0 评论 -
删除链表中数据域相同的其他结点
删除链表中数据域相同的其他结点题目已知线性链表的第一个结点的指针为list,请写一个算法,删除数据域值相同的结点,即若链表中有多个结点具有相同的数据域值,只保留一个结点,其余结点从链表中删除,使得到的链表中所有的结点的数据域值都不相同。分析假设指针P指向新的数据结点,指针每移动一位,都要检测是否在前面出现过,检测每次q指针都从初始位置检测,这样时间复杂度O(n^2).例如原来链表的数据...原创 2019-08-09 14:54:04 · 1104 阅读 · 1 评论 -
算法总结
算法小结汇总闲暇之余,整理一下数据结构的算法。第二章 线性表1、 线性表插入(链表B插入链表A的指定位置)2、删除链表中值域最大的结点3、交换P所指结点与其下一个结点的位置4、最小结点移到链表的最前面5、返回链表中倒数第K个结点6、删除链表中数据域相同的其他结点...原创 2019-08-09 15:10:08 · 176 阅读 · 0 评论 -
输出从键盘输入一组数据的最后K个元素
输出从键盘输入一组数据的最后K个元素题目请写一算法,依次输出通过键盘输入的一组数据的最后K个元素。约定:以CTRL+Z作为键盘输入结束,并且假设K<=输入的数据元素的个数。要求:算法中不能出现数组,也不允许有计算输入数据个数的过程。分析采用不带头结点单循环链表,建立K个结点的单循环链表。每输入数字就存入链表中,输入结束时,链表中的元素就是最后的K个元素。代码typedef s...原创 2019-08-09 16:06:35 · 233 阅读 · 1 评论 -
线性表插入
线性表的插入题目代码题目已知线性表A与线性表B的长度分别是n,m,并且采用顺序存储结构,请写一算法,在线性表的第i个位置插入线性表B,约定:不考虑存储空间的溢出问题。代码int fun1(int A[],int B[],int n,int m,int index){ int i; for ( i = n-1; i >=index-1 ; i--) { ...原创 2019-08-08 14:10:13 · 2097 阅读 · 0 评论