数据结构
文章平均质量分 75
BackkomCoder
改变!改变!!改变!!!
展开
-
数据结构之队列(一)——概论
队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为对头。原创 2018-01-17 18:28:51 · 246 阅读 · 0 评论 -
数据结构之栈(二)——栈的操作
栈的顺序存储结构栈的顺序存储结构的定义#include "stdafx.h"#define MAXSIZE 100//SElemType类型根据实际情况而定,这里假设为inttypedef int SElemType;typedef struct{ SElemType data[MAXSIZE]; //用于栈顶指针 int top;}SqStack;进栈原创 2018-01-17 18:07:51 · 843 阅读 · 0 评论 -
数据结构之栈(一)——概论
栈(stack)是限定仅在表尾进行插入和删除操作的线性表。我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。栈的插入操作,叫做进栈,也称压栈,入栈。栈的删除操作,叫做出栈,也有的叫做弹栈。原创 2018-01-17 16:04:51 · 309 阅读 · 0 评论 -
数据结构之线性表(四)——循环链表和双向链表
将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表(circular linked list)。为了使空链表与非空链表处理一致,我们通常设一个头结点。如图所示:循环链表带有头结点的空链表。对于非空的循环链表如图所示。双向链表(double linked list)是在单链表的每个结点中,再设置一个原创 2018-01-16 18:58:46 · 572 阅读 · 0 评论 -
数据结构之线性表(三)——静态链表
让数组的元素都是由俩个数据域组成,data和cur。也就是说,数组的每个下标都都应一个data和一个cur。数据域data,用来存放数据元素,也就是通常我们处理的数据;而游标cur相当于单链表中的next指针,存放该元素的后继在数组中的下标。我们把这种用数组描述的链表叫做静态链表,这种描述方法还有起名叫做游标实现法。我们都数组第一个和最后一个元素作为特殊元素处理,不存数据。我们通常把未被使用的原创 2018-01-16 18:23:11 · 413 阅读 · 0 评论 -
数据结构之线性表(二)——线性表的操作
顺序存储结构线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。示意图如下:线性表的顺序存储结构//存储空间初始分配量#define MAXSIZE 20//ElemType类型根据实际情况而定,这里假设为inttypedef int ElemType;typedef struct { //数组存储数据元素,最大值为MAXSIZE原创 2018-01-11 14:19:13 · 420 阅读 · 0 评论 -
数据结构之线性表(一)——概论
线性表(List):零个或多个数据元素的有限集合。原创 2017-12-29 18:17:55 · 301 阅读 · 0 评论 -
数据结构之树(七)——哈夫曼树及哈夫曼编码
哈夫曼树的哈夫曼算法描述:1.根据给定的n个权值{w1,w2,....,wn}构成n棵二叉树的集合F={T1,T2,...,Tn},其中每棵二叉树Ti中只有一个带权为wi根结点,其左右子树均为空。2.在F中选取俩棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左右子树上根结点的权值之和。3.在F中删除这俩棵树,同时将新得到的二叉树加入F中。4.重复2和3步骤,直到F只含一颗树为之。这棵树便是哈夫曼树。原创 2017-12-29 16:23:30 · 2152 阅读 · 0 评论 -
数据结构之队列(二)——队列的操作
队列的顺序存储结构循环队列我们把队列的这种头尾相接的顺序存储结构称为循环队列。循环队列的顺序存储结构的定义#include "stdafx.h"#define MAXSIZE 100//QElemType类型根据实际情况而定,这里假设为inttypedef int QElemType;//循环队列的顺序存储结构typedef struct { QElemType data[MAXS原创 2018-01-17 19:01:50 · 449 阅读 · 0 评论 -
数据结构之串——概论
串(string)是由零个或多个字符组成的有限序列,又名叫字符串。一般记为s="a1a2……an"(n>=0),其中,s是串的名称,用双引号括起来的字符序列是串的值,注意引号不属于串的内容。ai(a空格串,是只包含空格的串。注意它与空串的区别,空格串是有内容有长度的,而且可以不止一个空格。子串与主串,串中任意个数的连续字符组成的子序列称为该串的子串,相应地,包含子串的串称为主串。子串在主串中的位置原创 2018-01-18 12:03:30 · 342 阅读 · 0 评论 -
数据结构之排序(六)——堆排序
堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆,如左图;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆,如右图。堆排序(Heap Sort)就是利用堆(假设利用大顶堆)进行排序的方法。它的基本思想是,将带排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将...原创 2017-12-26 15:41:23 · 715 阅读 · 0 评论 -
数据结构之图(七)——关键路径
在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边长的权值表示活动的持续时间,这种有向图的边表示活动的网,我们称之为AOE网(Activity On Edge Network)。我们把AOE网中没有入边的顶点称为始点或源点,没有出边的顶点称为终点或汇点。由于一个工程,总有一个开始,一个结束,所以正常情况下,AOE网只有一个源点一个汇点。如图所示既然AOE网是表示工程流程的,所以它原创 2018-01-19 16:31:13 · 787 阅读 · 0 评论 -
数据结构之图(六)——拓扑排序
在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称为AOV网(Activity On Vertex Network)。AOV网中的弧表示活动之间存在的某种制约关系。设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列v1,v2,.....,vn,满足若从顶点vi到vj有一条路径,则在顶点序列中顶点vi必在vj之前。则我们称这样的顶点序原创 2018-01-19 15:49:18 · 500 阅读 · 0 评论 -
数据结构之图(五)——最短路径
对于网图来说,最短路径,是指俩顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点是源点,最后一个顶点是终点。而非网图完全可以理解为所有的边的权值都为1的网。从某个源点到其余各顶点的最短路径问题——迪杰斯特拉(Dijkstra)算法这是一个按路径长度递增的次序产生最短路径的算法。它并不是一下子就求出源点到终点的最短路径,而是一步步求出它们之间顶点的最短路径,过程中都是基于已经求出的最原创 2018-01-19 15:04:00 · 490 阅读 · 0 评论 -
数据结构之图(四)——最小生成树
我们把构造连通网的最小代价生成树称为最小生成树(Minimum Cost Spanning Tree)。普里姆(Prim)算法对下图利用普里姆算法求其最小生成树。步骤如下:代码如下:#include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h"#defin原创 2018-01-19 12:47:11 · 445 阅读 · 0 评论 -
数据结构之图(三)——图的遍历
从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历(Traversing Graph)>深度优先遍历深度优先遍历(Depth_First_Search),也有称为深度优先搜索,简称DFS。从图中某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图,直至图中所以和v有路径想通的顶点都被访问到。对于非连通图,只需要对它的连通分量分别进行深度优先遍原创 2018-01-19 12:31:21 · 619 阅读 · 0 评论 -
数据结构之图(二)——图的存储结构
邻接矩阵图的邻接矩阵(Adjacency Matrix)存储方式是用 俩个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵) 存储图中的边或弧的信息。无向图有向图有向网图无向网图的代码//顶点类型应由用户定义typedef char VertexType;//边上的权值类型应由用户定义typedef int EdgeType;//最大顶点数,应由用户定义#defin原创 2018-01-19 11:08:04 · 502 阅读 · 0 评论 -
数据结构之图(一)——概论
图的定义图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。无向边:若顶点vi到vj之间的边没有方向,则称这条边为无向边(Edge),用无序偶对(vi,vj)来表示。如果图中任意俩个顶点之间的边都是无向边,则称该图为无向图(Undirected graphs)。如图:有向边:若从顶点vi到vj的边有方原创 2018-01-18 16:42:47 · 530 阅读 · 0 评论 -
数据结构之树(六)——线索二叉树
指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树就称为线索二叉树(Threaded Binary Tree)。原创 2017-12-29 16:21:19 · 529 阅读 · 0 评论 -
数据结构之树(四)——二叉树的操作(理论篇)
二叉树的存储结构顺序存储结构二叉链表二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序访问二叉树中所有结点,使得每个结点被访问一次且进被访问一次。原创 2017-12-28 16:30:27 · 362 阅读 · 0 评论 -
数据结构之树(五)——二叉树的操作(代码篇)
这里,我将给出关于二叉树常用操作的代码,包括顺序存储结构和链式存储结构。原创 2017-12-29 14:01:59 · 635 阅读 · 0 评论 -
数据结构之查找(七)——散列表查找(哈希表)
散列技术散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应 一个存储位置f(key),即存储位置=f(关键字)。我们把这种对应关系f称为散列函数,又称为哈希(Hash)函数。采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table)。关键字对应的记录存储位置我们称为散列地址。原创 2017-12-25 14:40:35 · 1349 阅读 · 0 评论 -
数据结构之查找(五)——二叉查找树
二叉查找树(Binary Search Tree),又称为二叉排序树。它或者是一颗空树,或者是具有下列性质的二叉树:1.若它的左子树不空,则左子树所有结点的值均小于它的根结点的值;2.若它的右子树不空,则右子树所有结点的值均大于它的根结点的值;3.它的左右子树也分别为二叉查找树。原创 2017-12-22 11:33:19 · 356 阅读 · 0 评论 -
数据结构之查找(六)——平衡二叉树(AVL树)
平衡二叉树(AVL树)平衡二叉树(Self-Balancing Binary Search Tree 或 Height-Balanced Binary Search Tree),是一种二叉排序树,其中每一个结点的左子树和右子树的高度差至多等于1。我们将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF(Balance Factor),那么平衡二叉树上所有结点的平衡因子只可能是-1,0,和1。原创 2017-12-22 16:34:46 · 327 阅读 · 0 评论 -
数据结构之查找(四)——线性索引查找
索引就是把一个关键字与它对应的记录相关联的过程。索引按照结构可以分为线性索引,树形索引和多级索引。我们这里就只介绍线性索引技术。所谓线性索引就是将索引项集合组织为线性结构,也成为索引表。分为:稠密索引,分块索引和倒排索引。原创 2017-12-21 15:18:52 · 782 阅读 · 0 评论 -
数据结构之查找(三)——有序表查找
折半查找折半查找(Binary Search)技术,又称为二分查找。它的前提是线性表中的记录必须是关键码有序(通常从小到大有序),线性表必须采用顺序存储。折半查找的基本思想是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止。折半查找的时间复杂度为:O(logn)。差值查找插值查找原创 2017-12-20 17:34:13 · 476 阅读 · 0 评论 -
数据结构之查找(二)——顺序表查找
顺序查找(Sequential Search)又叫线性查找,是最基本的查找技术,它的查找过程是:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录;如果直到最后一个(或第一个)记录,其关键字和给定值比较不等时,则表中没有所查的记录,查找不成功。顺序查找算法的时间复杂度为O(n)。原创 2017-12-20 16:34:25 · 893 阅读 · 0 评论 -
数据结构之算法篇
算法:是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 算法的特性:1.输入输出:算法具有零个或多个输入,至少有一个或多个输出。2.有穷性:指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。3.确定性:算法的每一步骤都具有确定的含义,不会出现二义性。4.可行性:算法的每一步骤都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。原创 2017-12-19 22:50:41 · 220 阅读 · 0 评论 -
数据结构之查找(一)——概论
查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值得数据元素(或记录)。原创 2017-12-20 15:41:58 · 276 阅读 · 0 评论 -
数据结构之排序(一)——概论
根据排序过程中借助的主要操作,我们把内排序分为:插入排序,交换排序,选择排序和归并排序。按照算法的复杂度分为俩大类,冒泡排序,简单选择排序和直接插入排序属于简单算法;而希尔排序,堆排序,归并排序,快速排序属于改进算法。原创 2017-12-25 22:05:29 · 258 阅读 · 0 评论 -
数据结构之排序(二)—— 冒泡排序
冒泡排序(Bubble Sort)一种交换排序,它的基本思想是:俩俩比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。原创 2017-12-25 23:57:27 · 600 阅读 · 0 评论 -
数据结构之排序(三)——简单选择排序
简单选择排序算法(Simple Selection Sort)就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换之。原创 2017-12-26 11:34:34 · 799 阅读 · 0 评论 -
数据结构之树(三)——二叉树定义和性质
二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和俩棵互不相交的,分别称为根结点的左子树和右子树的二叉树组成。原创 2017-12-28 15:07:35 · 1214 阅读 · 0 评论 -
数据结构之树(二)——树的存储结构
双亲表示法 孩子表示法 孩子兄弟表示法原创 2017-12-27 18:08:02 · 401 阅读 · 0 评论 -
数据结构之树(一)——概论
对于树的定义需要强调俩点:1.n>0时根结点是唯一的,不可能存在多个根结点。2.m>0时,子树的个数没有限制,但它们一定是互不相交的。结点分类结点拥有的子树数称为结点的度(Degree)。度为0的结点称为叶结点(Leaf)或终端结点;度不为0的结点称为非终端结点或分支结点。、除根节点之外,分支结点也称为内部结点。树的度是树内各结点的度的最大值。结点间关系结点的子树的根称为该结点的孩子(Child),相应地,该结点称为孩子的双亲(Parent)。同一个双亲的孩子之间互称为兄弟(Sibli原创 2017-12-27 17:09:09 · 268 阅读 · 0 评论 -
数据结构之排序(九)——总结
从算法的简单性来看,7种算法分为俩类:简单算法:冒泡,简单选择,直接插入改进算法:希尔,堆,归并,快速原创 2017-12-27 15:25:01 · 240 阅读 · 0 评论 -
数据结构之排序(八)——快速排序
快速排序(Quick Sort)的基本思想是:通过一趟排序将待排记录分割成独立的俩部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这俩部分记录继续进行排序,以达到整个序列有序的目的。原创 2017-12-27 11:05:23 · 1848 阅读 · 0 评论 -
数据结构之排序(七)——归并排序
归并排序(Merging Sort):假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后俩俩归并,得到[n/2]([x]表示不小于x的最小整数)个长度为2或1的有序子序列;再俩俩归并,....,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。原创 2017-12-26 18:10:09 · 1893 阅读 · 0 评论 -
数据结构之排序(五)——希尔排序
采用跳跃分割的策略:将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序的而不是局部有序。希尔排序的关键并不是随便分组后各自排序,而是相隔某个“增量”的记录组成一个子序列,实现跳跃式的移动,使得排序的效率提高。原创 2017-12-26 14:16:26 · 4081 阅读 · 0 评论 -
数据结构之排序(四)——直接插入排序
直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增1的有序表。原创 2017-12-26 12:13:26 · 951 阅读 · 0 评论