数据结构
文章平均质量分 67
数据结构
麦克波菲柯特
人需要先说很多话,然后保持静默
展开
-
数据结构之二分查找
上面我们介绍了顺序查找,但是它的时间复杂度为o(n)让人很受伤啊,所以有了二分查找,二分查找是一个时间复杂度为O(logn)的算法,当然都是说的一般情况下,二分、二分,看名字就知道它的核心是什么了,就是不断地额逼近查找值。 代码#include<stdio.h>#define max_len 20typedef struct{ int r[max_len+1]; int le原创 2017-05-12 21:37:21 · 1842 阅读 · 0 评论 -
数据结构之顺序栈的应用
今天看了一下栈的应用,栈分为两种:顺序栈(也就是数组构成的)和链栈(也即是链表构成的),栈为何物我就不罗嗦了,先来介绍一下顺序栈吧顺序栈的定义typedef struct{ int stack[max]; int top;}seqstack;seqstack *s;所谓的顺序栈就是用一个数组作为栈,用一个top 元素作为栈顶,这些都是我们规定的,当然有更好的方法也是可以的原创 2017-06-15 16:35:42 · 868 阅读 · 0 评论 -
数据结构之顺序队列
本次的主题是队列,队列是另一种限定性的线性表(当然是人为规定的),即:它只允许在表的一端插入元素,在另一端删除元素,故具有先进先出(FIFO)的特性。本次的代码主要涉及到队列的基本操作: 对列的初始化:initsqueueu() 入队操作:entersequeue(sequeue*q,int x) 出队操作:delsequeue(sequeue*q,int*x) 判空操作:empty(seq原创 2017-06-24 15:25:00 · 1010 阅读 · 0 评论 -
数据结构之Prim算法
在进行最小生成树算法之前,还是老规矩先来熟悉熟悉基本的概念。生成树 连通图G的一个子图如果是一颗包含G的所有顶点的树,则该子图称为G的生成树(Spanning Tree)。由于n个顶点的连通图至少有n-1条边,而所包含n-1条边及n个顶点的连通图都是无回路的树。极小连通子图 极小是指边数最少(和前面的极大连通子图有区别传送门),在生成树中添加任意一条属于原图的边必定会产生回路,因为西南添加原创 2017-07-13 10:29:08 · 2188 阅读 · 0 评论 -
数据结构之链式队列
顾名思义:采用链式存储结构表示的队列称为链队列。即它是仅在表头删除和表尾插入的单链表。为了操作方便,引入带头结点的单链表,链队列节点定义和队列定义如下typedef struct node{ int data; struct node*next; }qnode;typedef struct{ qnode*front; qnode*rear;}linkqu原创 2017-06-25 11:44:59 · 583 阅读 · 0 评论 -
数据结构之循环队列和栈的应用
前面提到,在队列的顺序存储结构中,必须要讨论顺序队列的数组越界(或上溢)问题。根据顺序队列的定义,我们可以很轻松的发现,当队列删除一个元素之后,即front指针向后移动之时,往往这个时候就有可能出现所谓的“假溢出”现象,即可能会出现下图所示这般:解决“假溢出”的办法有很多,其中最为出色的是这四种方法: 一、采用循环队列 二、按最大可能的进队操作次数设计顺序队列的最大元素个数 三、修改出队算法,原创 2017-06-25 15:41:19 · 1482 阅读 · 0 评论 -
数据结构之串的应用
串的定义: 串即字符串,是最基本的非数值数据之一,它是一种特殊的线性表,特殊在于组成线性表的每一个元素都是一个字符。串的顺序存储定义:typedef struct{ char ch[max]; int len;}seqstring;串的链式存储定义:typedef struct str{ char ch[max]; struct str*next;}str;原创 2017-06-27 12:10:01 · 3317 阅读 · 0 评论 -
数据结构之广义表和二叉树
广义表的定义广义表是线性表的推广,又将其称为列表(lists,用复数形式表示与一般表list区别),它是广泛应用于人工智能等领域的表处理语言。说白了:线性表是由n个数据元素组成的有限序列。其中每个组成元素被限定为单个元素,有时这种限制需要扩展,这种扩展了的线性表就是广义表。一般表现形式为:ls=(a1,a2,……….,ai,……..an),,其中的ai可以是一个元素称之为广义表ls的原子,也可以是一原创 2017-06-27 20:06:38 · 5816 阅读 · 0 评论 -
数据结构之Kruskal算法(并查集的应用)
Kruskal算法基本思想 假设G=(V,E)是连通图,将G中的边按权值从小到大的顺序排列 1、将n个顶点看成n个集合 2、按权值从大到小的顺序选择边,所选边应满足两个顶点不在同一个顶点集合内,即加入此边后不会在生成树中产生回路,将该边放到生成树边的集合中。同时将该边的两个顶点所在的顶点集合合并。 3、重复2,直到所有的顶点都在同一个顶点集合内。举个例子 1、首先比较图中原创 2017-07-14 19:47:06 · 1385 阅读 · 0 评论 -
数据结构之Dijkstra算法
单源最短路径 通常称有向路径上的第一个顶点为源点,称最后一个顶点为终点。从某个源点到其他顶点的最短路径又称为单源最短路径。 单源最短路径的问题:给定一个带权图G=(V,E)和图中的一个原点V1,分别求出从V1到图G中其他每个顶点的最短路径长度,即路径上权值的总和。Dijkstra算法基本思想 设置俩个顶点的集合S和T=V-S,集合S中存放已找到最短路径的顶点,集合T中存放当前还未找到原创 2017-07-16 10:25:43 · 1025 阅读 · 0 评论 -
数据结构之AOV网与拓扑排序
AOV网(Activity On Vertex Network ) 网:带权图。若在带权的有向图中,以顶点表示事件,以边(或者弧)表示活动,弧的权值表示活动的开销,则此带权有向图称为用边表示活动的网,简称:(AOV网(Activity On Vertex Network )。关键路径 如果用AOV网表示一个工程,那么正常情况下工程只有一个开始点和一个结束点,因此AOV网中只有一个入度为0的原创 2017-07-16 20:17:19 · 16922 阅读 · 5 评论 -
C语言的简单应用(五)上
第五天 今天更新一下期待已久的排序篇,排序算法是数据结构中很火的存在,面试官也超级青睐的地方。排序(Sorting )是计算机程序设计中的重要操作,排序的基本操作有两种:1、比较两个关键字值的大小 2、根据比较的结果,移动记录的位置。排序的相关属于 稳定排序与不稳定排序:假定待排序的序列中存在多个记录具有相同的键值,若经过排序,这些记录的相对次序仍然保持不变,则这种排序方法是稳定的;反之,原创 2017-07-17 21:01:39 · 580 阅读 · 0 评论 -
数据结构之散列表(哈希表)
今天学的是数据结构的散列查找篇,其他的查找可参见以前的传送门以前的查找都是基于比较关键字的基础上,所以查找的效率依赖于查找过程中所进行的比较次数。 理想的情况是不经过任何比较,通过计算就能直接得到记录所在的存储地址,散列查找(Hashed Search)是基于上述思想的一种查找方式。 散列法又称为哈希法、杂凑法或关键字地址计算法,是一种重要的存储方式,又是一种查找方式。按散列法存储方式构造的动态原创 2017-07-17 17:29:12 · 756 阅读 · 0 评论 -
单链表的逆置(头插法和就地逆置)
今天课间的时候偶然看到了一个面试题:单链表的逆置,看了题解感觉乖乖的,貌似和以前看的版本不搭,于是重新进行了一番探究单链表的逆置分为两种方法:头插法和就地逆置法,这两种方法虽然都能够达到逆置的效果,但还是有着不小的差别头插法算法思路:依次取原链表中的每一个节点,将其作为第一个节点插入到新链表中,指针用来指向当前节点,p为空时结束。 核心代码void reverse(node*head){原创 2017-05-23 15:43:24 · 71318 阅读 · 3 评论 -
C语言的简单应用(五)下
选择排序:简单选择排序、堆排序简单选择排序(平均时间O(n²),不稳定)#include<stdio.h>#define max 10void simplesort(int a[],int len){ int i,j,k,temp; for(i=1;i<=len-1;i++) { k=i; for(j=i+1;j<=len;j++原创 2017-07-18 21:27:55 · 596 阅读 · 0 评论 -
队列和栈的应用、单链表的创建、模拟链表
队列的应用 有一串数字:6 3 1 7 5 8 9 2 4,解码规则:删除一个,下一个添加到串尾,直到全部删除,然后输出依次被删的顺序。#include<stdio.h>#define max 20int main(){ int i,len,head,tail,a[max]; printf("input the len:"); scanf("%d",&len);原创 2017-07-19 19:22:58 · 472 阅读 · 0 评论 -
数据结构之BFS(邻接表版)
最近效率有点低下唉,估计是蜷缩在宿舍的原因,下午跑大教室来了。果然还是大环境好,空气清新,也可能是最近晚上打球运动还没有适应过来,亦或者是还没有习惯于早起。不过习惯的养成是不急于一时的,还得 慢慢来,但是,现在的首要任务是如何利用好自己的现在的每一分每一秒这才是关键啊,自打前几日重新整理下自己的资源,计算了一下假期时间,最后发现,任重而道远。能够做的就是压缩压缩再压缩了。上节说到图的深度优先搜索类似原创 2017-07-12 17:41:50 · 2694 阅读 · 0 评论 -
数据结构之DFS(邻接表版)
图的遍历 是指从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次。 图的遍历是图的基本操作之一,很多需要对图中每个顶点依次进行的操作都可以在遍历中完成。图的遍历通常有 深度优先搜索和广度优先搜索 。深度优先搜索(Depth-First Search) 深度优先搜索的基本思想如下: 1、从图中某个顶点Vi出发,首先访问Vi 2、选择一个与刚访问过的顶点Vi相邻接且未访问过原创 2017-07-12 11:57:53 · 1845 阅读 · 0 评论 -
数据结构之顺序查找
前面我们介绍了查找分为静态查找和动态查找,并且给出了动态查找之B树的分析和代码,今天我们来个简单的静态查找之顺序查找(含哨兵的) 思路 顺序查找是最简单查找方式,基本思路就是:用给定的关键字值与线性表中各数据元素(或记录)的关键字逐个比对,直到成功或者失败。 算法实现#include<stdio.h>#define max_len 20typedef struct{ int r[原创 2017-05-12 21:25:11 · 1482 阅读 · 0 评论 -
数据结构之二叉排序树
套路啊套路,终于从静态查找走到了动态查找,这一次介绍可爱的二叉排序树,这棵树是后面的所有动态查找树的模范。 定义 若左子树不空,则左子树所有节点的关键字均小于它的根节点的关键字。 若柚子树不空,则柚子树所有节点的关键字均大于它的根节点关键字。 左子树和柚子树都是一颗二叉排序树 基本思路 (1)从空二叉树开始,读入第一个节点作为二叉树的根节点。 (2)从读入的第二个节点起,将读入节点的关原创 2017-05-12 22:02:45 · 729 阅读 · 0 评论 -
数据结构之单链表(头插法)
重点 本次代码是单链表的头插法,需要注意以下几点 1、申请指针的时候,防止野指针出现 2、结束符?是在英文输入法下打出来的 3、注意scanf输入流的正确应用(?要紧跟在值后面,否则会多输出一个缓冲值) 代码#include<stdio.h>#include<malloc.h>typedef struct node{ int data; struct原创 2017-05-13 19:02:40 · 1152 阅读 · 0 评论 -
数据结构之单链表(尾插法)
上次的单链表是头插法的,所以打印的时候是倒序,这有点影响美观,这次是尾插法,可以解决这个问题,注意事项见上篇 代码#include<stdio.h>#include<malloc.h>typedef struct node{ int data; struct node*next; }node; node*creat() { node*head,*p,*q;原创 2017-05-13 19:49:16 · 1719 阅读 · 0 评论 -
数据结构之单链表(尾插法)查找、插入和删除
这一次的难度主要体现在长,常常的代码让人望而生畏,不过,只要理解清楚了查找、插入和删除就好办了 代码#include<stdio.h>#include<malloc.h>typedef struct node{ int data; struct node*next;}node;node*creat(){ node*head,*q,*p; char ch;原创 2017-05-13 20:40:03 · 2188 阅读 · 0 评论 -
数据结构之俩循环单链表合并
这段时间要好好调整一下自己了,发现基础才是王道,所以打算好好铺一铺我滴c指针这一块了,所以数据结构将会断更一段时间,不过接下来要和大家见面的就是我们上次的循环单链表之合并 题目:将链表a和链表b合并为链表c 算法思想 将a链表的尾指针reara与b链表的第一个节点链接起来,并且修改b链表的尾指针rearb,使得它指向链表a的头结点代码#include<stdio.h>#include原创 2017-05-14 22:25:09 · 2580 阅读 · 0 评论 -
B树的研究(查找、插入、删除)
讲到B树那就不得不谈一谈查找,查找不是一种数据结构而是一种基于数据结构的对数据进行处理时经常使用的一种操作。平均查找长度ASL=∑Pi×Ci (其中Pi为查找第i个记录的概率,Ci为查找第i个记录所用的比较次数)。 查找方法有很多,分为两大类:静态查找和动态查找。1、 静态查找:只能进行查找操作,无法进行插入和删除操作,表现为线性结构,有:顺序存储结构和链式存储结构。主要有:顺序查找、二分查找原创 2017-05-06 11:06:50 · 6979 阅读 · 1 评论 -
数据结构之二叉树的(前、中、后)序遍历
二叉树的遍历是指按照某种顺序访问二叉树中的每一个节点,使得每一个节点有且仅被访问一次。由二叉树的定义可知,一棵二叉树由根节点、根节点的左子树和右子树组成。若以D、L、R分别表示访问根节点、遍历根节点左子树、遍历根节点右子树。则有六种,若限定先左后右,则有3种,即:DLR(前序)、LDR(中序)、LRD(后序)一般都采用递归的方式来遍历前序遍历(也叫先序遍历)void pretree(bitree*t原创 2017-06-28 20:47:47 · 766 阅读 · 0 评论 -
数据结构之树的存储结构
转载自博客:数据结构–树(定义与存储结构) 树基本定义 树的定义 数是具有n个节点的有限集。如图即是一个树形结构。 节点分类 节点的度:一个节点拥有的子节点即成为节点的度,比如A节点,有B和C两个子节点,那么A节点的度=2。 叶节点(终端节点):没有子节点的节点,比如G、H、I…. 如图:节点间关系 孩子节点:某一个节点的子节点称为孩子节点。比如B、C节点是A节点的孩子节点。 双亲转载 2017-06-30 15:59:47 · 585 阅读 · 0 评论 -
树、森林与二叉树的转换
前面已经讲过,对于树的定义和存储结构,在满足树的条件下可以是任意形状,一个节点可以有任意多个孩子,故对于树的处理要复杂的多。二叉树,尽管也是树,但由于每个节点最多只能有左孩子和右孩子,因此很多性质和算法都被研究出来了。若所有树都能像二叉树一样方便就好了,所以才有了相互转换。 在讲到树的储结构时,提到树的孩子兄弟表示法可以将一颗树用二叉链表进行存储。因此,借助二叉链表,树和二叉树可以相互进行转换原创 2017-06-30 21:35:25 · 1194 阅读 · 0 评论 -
数据结构之图的基本概念
图是一种典型的比线性结构与树形结构更加复杂的非线性结构。线性结构是一对一,树形结构是一对多,而图形结构则是多对多。图的应用很广泛,但是必须先要了解图的基本概念。图的定义 图是由顶点的有穷非空集合和一个描述顶点之间关系——边(或者弧)的集合组成的。一般,图中的数据元素被称为顶点,顶点之间的关系用顶点对(边)表示。图通常用字母G表示。图的顶点用字母V表示,因此图可定义为: 图G由两个集合V(G原创 2017-07-11 09:57:29 · 1144 阅读 · 0 评论 -
数据结构之树的层次遍历(附带查找)、深度求值
二叉树的层次遍历,顾名思义就是指从二叉树的第一层(根节点)开始,从上至下逐层遍历,在同一层中,则按照从左到右的顺序对节点逐个访问。 算法思想:用一个队列保存被访问的当前节点的左右孩子以实现层序遍历。在进行层次遍历的时候,设置一个队列结构,遍历从二叉树的根节点开始,首先将根节点指针入队列,然后从队头取出一个元素,每取一个元素,执行下面两个操作: 1、访问该元素所指向的节点 2、若该元素原创 2017-06-30 22:12:12 · 2645 阅读 · 0 评论 -
数据结构之哈夫曼树(最优二叉树)
文本压缩是一种非常重要的技术,自然涉及到了压缩编码。哈夫曼编码——一种最基本的压缩编码方法几个术语: 1、路径:树中两个节点之间的分支序列 2、路径长度:路径上的分支数目 3、树的路径长度:从树根到每个节点的路径长度之和。在节点数目相同的二叉树中,完全二叉树的路径长度最短 4、节点的权:在一些应用中,赋予树中节点的 一个有某种意义的实数 5、节点的原创 2017-06-30 22:47:56 · 3378 阅读 · 0 评论 -
数据结构之链栈
本次为大家带来的是数据结构中的链栈,链栈就是存储结构是链式的链栈的定义typedef struct node{int data;struct node*next;}node;node*top;和单链表的定义并无二致,仅仅多了一个top指针,关键在于使用者如何使用的。链栈包括:创建链表(和单链表一样),压栈(pushstack),弹栈(popstack),打印(print)废话不多说,看代码原创 2017-06-22 11:59:16 · 775 阅读 · 0 评论 -
数据结构之图的存储表示(邻接矩阵、邻接表和边集数组)
图的存储结构相比线性表与树而言,更加复杂。图不可能用简单的顺序存储结构来表示,这是一个很困难的问题。所幸,一般有三种存储结构:邻接矩阵、邻接表和边集数组。邻接矩阵邻接矩阵是表示顶点之间相邻关系的矩阵。看图就知道了: (PS:感谢Covit大佬提供的皂片)上面的图片演示的是关于带权图,所以里面存储的是权值,如果是无向图的话,一般用1表示有边,0表示无边。从图的邻接矩阵存储方法(或称数组存储法)容翻译原创 2017-07-11 19:00:21 · 11002 阅读 · 0 评论 -
写废了的Floyd算法(带保存路径的)
多源最短路径,会丧失掉原有的路径信息,对于特定的比赛来说是无意义的,本来写好了,经人点播才发现问题,删了又觉得怪可惜的,只好当电子垃圾存在CSDN云盘上了…...原创 2019-03-27 21:26:04 · 752 阅读 · 0 评论