![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 66
健景
小尼姑年方二八 正值青春 被师傅削去了头发 我本是男儿身 又不是女儿郎
展开
-
查找-二分查找法-数据结构(25)
一、二分查找法参考书上第9章。二、算法实现int sqTable[] = { 0, 5, 13, 19, 21, 37, 56, 64, 75, 80.88, 92 };//int length = 11;//==========静态查找方法================== //二分查找 有序表的查找 Sqlist的[0]元素是为0 作为标杆int Search_Bin(E原创 2017-05-23 19:51:20 · 426 阅读 · 0 评论 -
顺序队列-数据结构(10)
一、解析之所以叫队列,也是一个故名思意。排队中先进队伍的,顺序出去的,也就是从队头出去,而顺序的意思就是在内存结构中是顺序存放的,也就是数组。二、存储结构typedef struct{ QElemType *base;//基地址 int front;//队头 int rear;//队尾 总是指向队尾的空位置}SqQueue;三、操作//===============原创 2017-05-18 13:03:10 · 305 阅读 · 0 评论 -
链队列-数据结构(11)
一、解析对于链队列,队列的意义就不解析了。而队列的链式存储则是与顺序队列成为一个很好的对比,顺序队列中的存储大小是固定的不,而链式的存储则是可以达到节省存储空间的作用,只是在入队和出队的情况下,需要些额外的操作。参考书上P60-P63。二、存储结构//==================链队列===============typedef struct QNode{ QElemTyp原创 2017-05-19 15:41:37 · 315 阅读 · 0 评论 -
串-数据结构(12)
一、解析串(或字符串)是由零个或多个字符组成的有限序列。一般在S[0]的位置上放置的是该字符串的字符长度。其实就是字符串了,这个串的数据结构一般的在各种语言中都有实现的。参考书上第四章,其中有个很重要的kmp模式匹配很值的去看,然而我不会,因此略过。二、存储结构typedef unsigned char SString[MAXSTRLEN + 1];三、操作#define原创 2017-05-19 15:52:16 · 282 阅读 · 0 评论 -
二叉树的链式存储与线索二叉树-数据结构(14)
一、二叉树的存储结构 //二叉树 //二叉树的链式存储 typedef struct BiTNode{ TElemType data; struct BiTNode *lchild, *rchild;//左右孩子的节点 }BiTNode, *BiTree;二、二叉树的创建和打印int strIndex = 0;Status CreateBiTree(BiTree原创 2017-05-19 17:07:15 · 589 阅读 · 0 评论 -
基于完全二叉树木形成的二叉树顺序存储-数据结构(13)
一、完全二叉树二叉树的定义是每个结点可以有左孩子和右孩子形成的树。至于完全二叉树便是从左到右编排数的结点。二、完全二叉树的性质由于完全二叉树的定义使得这样的树有一种特征,便是假设一结点是i编号,则其左孩子是2i,右孩子是2i+1。三、由完全二叉树的性质形成的存储结构 //二叉树的顺序存储结构#define MAX_TREE_SIZE 100 typedef原创 2017-05-19 16:33:11 · 319 阅读 · 0 评论 -
二叉树的遍历(栈遍历与递归遍历)-数据结构(15)
一、树的先序遍历参考书P128-P132,先序列遍历是,先访问根结点,先序遍历左子树,然后先序遍历右子树递归下去。二、树的遍历实现1、递归遍历Status PreOederTraverse(BiTree T, Status(*Visit)(TElemType e)){ //利用先序遍历 二叉树 对每个元素进行visit函数 //递归的形式 if (T) { Vis原创 2017-05-19 17:21:42 · 453 阅读 · 0 评论 -
赫夫曼树(最优二叉树)-数据结构(16)
一、例子引出问题参考书上P144-P149 。在我们计算成绩排名的时候,我们大部分人的成绩都在中等的,还有一小部分在极优和极差中,服从正态分布。因此出现了让有权重的树,为了将经常用到的判断放在前面,因此建立了最优二叉树。二、存储结构//赫夫曼树typedef struct { unsigned int weight; unsigned int parent, lchild, rc原创 2017-05-21 14:27:56 · 515 阅读 · 0 评论 -
算法:求幂集(回溯法与树的遍历)-数据结构(17)
一、问题描述求幂集。参见书上P149-P150,思想是这样的,为了求幂集,应对每个元素都采取两种选择,要与不要,因此形成了一棵完全二叉树,遍历这棵完全二叉树便是求出幂集的解决方法。二、算法与数据结构1、顺序列表//顺序表 2017-04-23// c2-1.h 线性表的动态分配顺序存储结构。在教科书第22页#define LIST_INIT_SIZE 30 // 线性表存储空间原创 2017-05-21 14:39:50 · 1431 阅读 · 0 评论 -
图的数组表示法-数据结构(18)
一、图参见P160-P163,关于图这种数据结构,其实就是点与弧,因此表示出这种弧也就表示图。二、存储结构//================图的存储结构-数组表示法#define INFINITY 9999 //最大值#define MAX_VERTEX_NUM 20 //最大顶点个数typedef int VRType;typedef char VertexType;//用原创 2017-05-21 15:04:51 · 922 阅读 · 0 评论 -
图的十字链表表示法(有向图)-数据结构(19)
一、为什么会出现十字链表在上一节中可以看到图的数值存储方法,可以看到这种存储方法很浪费空间,一旦数组大了,要遍历图都需要整个遍历。因此遍出现了邻接表,邻接表是加多一个指针为了保存后继。而十字链表即保存了入链和出链。二、存储结构//==========有向图的十字链表===============typedef int InfoType;typedef struct ArcBox{原创 2017-05-21 15:21:02 · 3162 阅读 · 0 评论 -
图的深度优先遍历-数据结构(20)
一、图的深度优先遍历(点的遍历)还是要再强调一遍,深度优先遍历的是点,是点,是点。这是一种递归的思想,对于当前的结点,如果有邻边,而且邻边的点没有被遍历则进行深度递归。二、算法与数据结构1、十字链表略,参考上一节2、深度优先遍历算法//==========================深度优先遍历 是对点的遍历=======================原创 2017-05-21 16:07:19 · 857 阅读 · 0 评论 -
图的广度优先遍历-数据结构(21)
一、广度优先遍历广度优先遍历是点,利用队列,思想是这样的。对于第一个点,先是搜索所有与之为邻边的所有的点进队列,然后出队列,重复操作,直至遍历完所有点。二、数据结构和算法1、队列略,参考我之前写的队列。2、算法//======================广度优先遍历===============void BFSTraverse_L(OLGraph G){ /原创 2017-05-21 16:19:32 · 886 阅读 · 0 评论 -
算法:图的普里姆算法最小生成树-数据结构(22)
一、由图生成最小生成树最小生成树的结点为n,则弧为n-1。算法便是,删去一些边使得图成为一棵树,且这棵树要成为权重最小的树。那要删去那些边呢?这便是普里姆算法了。参考算法P173-P176,思路是这样的,有个N集合和一个M集合,N集合是空集合,M集合是其他点的集合,每次加入N集合的点到M集合的某一点的最小权重便是最小生成树的边。算法因此出来了。二、数据结构和算法1、图的数组数据原创 2017-05-21 19:36:20 · 2839 阅读 · 0 评论 -
算法:图的拓扑排序-数据结构(23)
一、拓扑排序的个人说说其实就是求出整个有向图中的顺序执行的一个序列。其中求出这个拓扑排序的方法分两步://1、在有向图中选一个没有前驱的顶点且输出之。//2、从图中删除该顶点和所有以它为尾的弧。二、算法和数据结构1、有向图的十字链表略,参考之前的。2、拓扑排序算法Status TopologicalSort(OLGraph G){ int indegr原创 2017-05-21 19:59:34 · 496 阅读 · 0 评论 -
算法:汉诺塔(栈的递归调用)-数据结构(9)
一、问题描述参见网上汉诺塔的玩法。书上P54-58。解析:栈的递归调用其实是函数参数是以栈的形式push进栈来调用函数的,因此递归是用到栈的,只是没有很形象而已。解决汉塔的思路是这样的:设n为汉诺塔的盘子数,xyz是三根柱子。要让z有n个盘子的做法,先是将x的n-1个盘子移到y,然后将第n个盘子移到z,就这样的思路进行下去,最后就可以把汉诺塔的问题解决了。二、算法实现int c = 0原创 2017-05-18 12:00:59 · 1026 阅读 · 0 评论 -
算法:迷宫求解(栈的应用)-数据结构(8)
一、问题描述参见书上的P50-P2,给定一个迷宫,入口点和出口点,求出迷宫的路径。对于这类问题,没有什么好的办法节省效率,还是要老老实实的将所有路径都走了才能找到终点,其实这种思想我感觉就是完全二叉树,每一层都是对当前点的选择与放弃,最后结束搜索这颗树的结果是找到终点。这里用到的是栈来保存过来的路径,在堵路的时候原路返回。二、数据结构和算法1、栈(略)参照我以前的博客数据结构(5)原创 2017-05-17 17:06:24 · 706 阅读 · 0 评论 -
排序-插入排序-直接插入排序-数据结构(26)
一、直接插入排序插入排序的思想是这样的:对于一个有序序列中,查找新元素在有序序列中的位置,然后从后往前插入到查找的位置,而直接插入排序的原理便是顺序查找。二、算法实现int sqTable[] = { 0,49,38,65,97,76,13,27,49};//其中[0]位置储存的是哨岗int length = (sizeof(sqTable) / sizeof(int))-1原创 2017-05-23 20:06:34 · 319 阅读 · 0 评论 -
排序-插入排序-折半插入排序-数据结构(27)
一、折半插入排序实质上是插入排序,只是在搜索位置的时候用到二分查找。二、算法实现int sqTable[] = { 0,49,38,65,97,76,13,27,49};//其中[0]位置储存的是哨岗int length = (sizeof(sqTable) / sizeof(int))-1;//不要第一个位置void PrintTable(){ for (int原创 2017-05-23 20:10:39 · 396 阅读 · 0 评论 -
排序-插入排序-希尔排序(缩小增量排序)-数据结构(28)
一、希尔排序(缩小增量排序)至于什么是缩小增量排序呢?当增量为1时便是直接插入排序,而希尔排序是一i+增量为一个序列,对这个序列进行排序,然后逐渐缩小到1。二、算法实现int sqTable[] = { 0,49,38,65,97,76,13,27,49};//其中[0]位置储存的是哨岗int length = (sizeof(sqTable) / sizeof(int原创 2017-05-23 20:35:45 · 364 阅读 · 0 评论 -
排序-交换排序-冒泡排序-数据结构(29)
一、算法思想交换排序的思想便是交换两个元素的位置,而冒泡排序的原因是像泡泡一样,将最大的数一直交换知道冒到最大的位置上。二、算法实现//================ 起泡排序 每一趟都把最大的数放在最后一个位置===通过[j]与[j+1]的比较==========================void Swap(int i,int j){ int temp = sqT原创 2017-05-23 21:21:48 · 2261 阅读 · 0 评论 -
排序-交换排序-快速排序-数据结构(30)
一、快速排序快速排序也是交换排序的一种。而快速排序的思想是这样的,设第一个元素是标杆,比标杆小的放在标杆左边,比标杆大的放在标杆右边。形成的左序列和右序列继续快速排序。二、算法实现//=================快速排序===============//以一个数为标杆,把这个数小的放在标杆左边,大的话放在右边int Partition(int low,int high原创 2017-05-23 21:27:52 · 395 阅读 · 0 评论 -
排序-选择排序-数据结构(31)
一、选择排序选择排序的思想是一趟循环,选择出最大(小)的数排到合适的位置。就是每一次循环排好一个数。二、算法实现//============选择排序 选择最小的数放在合适的位置==============int SelectMinKey(int i){ int min = sqTable[i]; int index = i; for (int j = i+1; j <=原创 2017-05-23 21:31:37 · 317 阅读 · 0 评论 -
排序-堆排序-数据结构(32)
一、堆的定义n[i]二、解决堆所面临的两个问题1、//问题一:无序序列建立一个堆void HeapSort(){ //建成了堆 for (int i = length/2; i > 0; --i) { //从非终端结点开始筛选 HeapAdjust(i,length); } for (int i = length; i>1; --i) { //输出原创 2017-05-23 21:38:02 · 332 阅读 · 0 评论 -
顺序线性表-数据结构(1)
一、解析线性表的一种,是与内存结构对应的,故称之为线性顺序表。//数据结构第二周目,整理下以前的代码 。对应书上的p19-p26。二、存储结构typedef struct { ElemType *elem;//存储空间基址 int length;//当前长度 int listSize;//当前分配的储存容量}Sqlist;三、操作//顺序表 2017-04-原创 2017-05-15 17:06:09 · 312 阅读 · 0 评论 -
线性链表-数据结构(2)
一、解析之所以叫线性,是因为逻辑结构上面是以顺序的存储的。而链的原因是因为在物理的存储结构上面保存后面元素的地址 。数据结构书上对应页码P27-31。二、存储结构//int length_L = 0;//记录链表的长度 不包括头结点typedef struct LNode{//结点类型 ElemType data; struct LNode *next;//指向下原创 2017-05-15 17:25:30 · 330 阅读 · 0 评论 -
静态链表-数据结构(3)
一、解析对于静态链表,链表就是结点中保存下一个元素的地址。而静态呢就是一个数组保存下个地址的索引位置达到节省空间位置。参考书上P31-P34二、存储结构//静态链表typedef struct{ ElemType data; int cur;//这个cur跟链表的next差不多}component, SLinkList[MAXSIZE];三、操作//========原创 2017-05-15 17:38:03 · 279 阅读 · 0 评论 -
算法:一元多项式的表示及相加(链表实现)-数据结构(4)
一、算法问题描述为了计算多个一元多项式相加,参照书上P40的式子相加,需要建立在有序链表的基础上,跟merge的算法类似。链表的基本操作就不表述了。书P39-P43二、需要用到的数据结构1、单链表//=============单链表=====================//int length_L = 0;//记录链表的长度 不包括头结点typedef struct LNo原创 2017-05-16 23:12:55 · 3782 阅读 · 0 评论 -
栈-数据结构(5)
一、解析栈,讲道理就是个叠积木,先叠的积木在下层,后面的积木盖在下面的积木上面。要拿到最后的积木,我们必须先从头一个开始拿。这就是先进后出了。二、存储结构typedef struct{ SElemType *base;//栈的首地址指向的元素指针 SElemType *top;//栈顶指针 **注意这个栈顶指针指向的是栈中的顶 这个顶是元素为空的 int stackSize;/原创 2017-05-16 23:28:33 · 288 阅读 · 0 评论 -
算法:数制转换(栈的应用)-数据结构(6)
一、算法描述将一个数按照想要的进制,进行转换。用到的栈的原因是,计算出来的数是从第一位开始的,为了方便输出,进行的栈的运用。其实就是逆序输出P48二、数据结构与算法1、数据结构(栈)#define STACK_INIT_SIZE 100//存储空间初始分配量#define STACKINCREMENT 10//存储空间分配增量typedef struct{ SElemType原创 2017-05-16 23:55:25 · 723 阅读 · 0 评论 -
算法:括号匹配(栈的应用)-数据结构(7)
一、问题描述书上P49 3.2.2,如书上的描述就是对于输入的括号进行合法性校验。二、数据结构和算法1、栈数据结构(略)参见数据结构(5)栈2、算法实现//括号匹配void ParathesesMatch(char * str){ //传进来的是一串括号字符串 SqStack stack; InitStack(stack); int i = 0,flag = 0;原创 2017-05-17 16:41:04 · 341 阅读 · 0 评论 -
算法:图的关键路径-数据结构(24)
一、个人理解-简单说说关键路径其实就是一个点到另外一个点的最唱路径,其中这个图是有向无环图。求出工程里面最关键的事件,不能拖延的事件路径,参考P183-P186。解决的思路,便是找出每个事件点的最早开始时间Ve和最晚完成时间ee,当Ve==ee的情况下就是不能拖延的事件,便是关键路径。二、数据结构与算法1、有向图的十字链表 //==========有向图的十字链表=====原创 2017-05-21 20:32:35 · 2792 阅读 · 0 评论