数据结构与算法
文章平均质量分 60
CMbug
这个作者很懒,什么都没留下…
展开
-
【三】静态链表
1、静态链表的定义 顺序表数组中的元素由两个数据域组成:data和next;data域用于存储数据;next域用于存储下一个元素在数组中的下标;静态链表的大小是固定的;静态链表本质上就是一个结构体数组;静态链表是在顺序表的基础上利用数组实现的单链表!2、相关数据结构定义#ifdef WIN32 typedef unsigned int LPDATA;#else typedef原创 2015-05-20 22:51:06 · 533 阅读 · 0 评论 -
【十三】队列的链式存储结构
1、链式存储的定义上一篇介绍了队列及其顺序存储,基于上一篇,简介队列的链式存储结构的实现!2、基于链表的实现队列是一种特殊的顺序表,所以可以基于链表来实现队列的链式存储结构!数据结构的定义//因为内部使用的是顺序链表,所以有如下的定义typedef struct _struct_linkqueue{ LinklistNode node; LinkQueueNode *item;}TLi原创 2015-05-30 22:33:35 · 691 阅读 · 0 评论 -
【七】栈的应用实例(一)
1、提出问题在C语言中有一些符号是成对匹配出现的 括号: ( ), [ ], { }, <> 引号: ‘ ‘, “ “ 检查它们是否成对出现是所有编译器实现的基本功能,可用于基本的语法检查,这个问题就可通过栈来实现!2、算法实现思路从第一个字符开始扫描当遇见普通字符时忽略,当遇见左符号时压入栈中当遇见右符号时从栈中弹出栈顶符号进行匹配 • 匹配成功:继续读入下一个字符原创 2015-05-26 20:55:48 · 1247 阅读 · 0 评论 -
【十四】队列的特别实现--利用双栈
1、简述代码复用是工程开发中经常用到的,本系列文章也一直致力于使用代码复用,但是要保证所实现的数据结构与算法在各方面都能达到“产品级别的代码”,即向外保持一致的接口,屏蔽内部实现的细节,优化内部实现算法的时间复杂度以及空间复杂度!前面已经使用四种方法实现了队列,有两种使用了代码复用,但时间复杂度方面却不理想,因此又使用了两种不使用代码复用的方法,解决了时间复杂度方面的问题,但是编写起来难免比代码复用原创 2015-05-31 17:18:13 · 1546 阅读 · 0 评论 -
【十九】树以及树的存储结构
1、树的定义2、相关概念树的结点包含一个数据及若干指向子树的分支结点拥有的子树数称为结点的度 度为0的结点称为叶结点度不为0的结点称为分支结点树的度定义为所有结点中的度的最大值结点的直接后继称为该结点的孩子 相应的,该结点称为孩子的双亲结点的孩子的孩子的……称为该结点的子孙 相应的,该结点称为子孙的祖先同一个双亲的孩子之间互称兄弟结点的层次 根为第1层根的孩子为第2层……树原创 2015-06-05 23:22:57 · 525 阅读 · 0 评论 -
【二十四】图的定义
1、图的定义几种图结构的示例:2、无向边和无向图3、有向边和有向图4、度(Degree)5、权(Weight)6、小结图是一种扩展的树结构,每个结点可以指向任意的其它结点链表是特殊的树结构,树是特殊的图结构图这种数据结构常用于网络规划和路径路径规划等领域原创 2015-07-09 12:48:12 · 649 阅读 · 0 评论 -
【二十五】图的存储结构--邻接矩阵法
1、邻接矩阵法基本思想:示例:从上面两个示例中也可看出:2、数据结构的定义顶点间边的描述需要使用二维数组,所以需要动态创建二维数组;3、动态创建二维数组4、算法实现数据结构定义:typedef struct _struct_mgraph{ int count; //保存顶点数目 MVertex **data; //一维数组,保存顶点的数据的地址原创 2015-07-09 16:50:02 · 888 阅读 · 0 评论 -
【二十一】创建二叉树--指路法
1、指路法定位结点从根结点开始,指出访问每个结点所走的路径。指路法通过根结点与目标结点的相对位置进行定位指路法可以避开二叉树递归的性质“线性”定位2、指路法的实现在C语言中可通过bit位来指路,如果bit位为0,则“左转”,如果bit位为1,则“右转”;定义如下:#define BT_LEFT 0#define BT_RIGHT 1typedef unsigned long long原创 2015-07-05 12:27:59 · 669 阅读 · 0 评论 -
【二十二】遍历二叉树
1、简介 二叉树的遍历是指从根结点开始,按照某种次序依次访问二叉树中的所有结点。通常有以下几种方式:前序遍历中序遍历后序遍历层次遍历以上几种遍历方式,是根据在遍历时访问根结点中数据的顺序不同来命名的;2、前序遍历算法实现:void pre_order_traversal(BTreeNode *root){ if(root != NULL) { printf_Data(r原创 2015-07-05 13:04:26 · 503 阅读 · 0 评论 -
【二十三】线索化二叉树
1、提出问题在一些项目中需要频繁的遍历二叉树,但是二叉树的遍历比单链表的遍历复杂多了,并且递归总是会有额外开销。。。那有没有一种方法,能像链表那样方便的快速遍历二叉树呢?答案当然就是–线索化二叉树2、线索化二叉树线索化二叉树指的是将二叉树中的结点进行逻辑意义上的“重排列”,使其可以线性的方式访问每一个结点二叉树线索化之后每个结点都有一个线性下标,通过这个下标可以快速访问结点,而不需要遍历二叉树原创 2015-07-05 19:07:51 · 648 阅读 · 0 评论 -
【二十七】图的遍历--DFS、BFS
1、图遍历的定义从图中的某一顶点出发,沿着一些边访遍图中所有的顶点,使得每个顶点仅被访问一次。2、方法分类深度优先搜索(Depth First Search)广度优先搜索(Breadth First Search)3、DFS 示例4、DFS 算法描述5、算法实现/*深度优先,遍历graph所指图中的每个顶点* 参数: graph: 指向图的指针 v: 起始顶点原创 2015-08-12 18:51:44 · 1662 阅读 · 0 评论 -
【二十六】图的存储结构--邻接链表法
1、邻接链表法 基本思想:示例: 2、数据结点定义3、算法实现数据类型声明/** 邻接链表法,数据结构定义*/typedef struct _struct_lgraph{ int count; //存储结点数目 LVertex **data; //一个指针数组,记录与顶点相关的数据描述 Linklist **la; //一个指针原创 2015-08-12 09:32:59 · 1496 阅读 · 0 评论 -
【一】线性表以及线性表的顺序存储结构
1、线性表的定义线性表( Li st)是零个或多个数据元素的集合线性表中的数据元素之间是有顺序的线性表中的数据元素个数是有限的线性表中的数据元素的类型必须相同2、线性表的性质 a0为线性表的第一个元素,只有一个后继 只有一个后继an为线性表的最后一个元素,只有一个前驱 只有一个前驱除a0和an外的其它元素ai,既有前驱,又有后继线性表能够逐项访问和顺序存取3、顺序存储结构线性原创 2015-05-18 11:01:43 · 794 阅读 · 0 评论 -
【六】栈的定义及实现
1、栈的定义栈是一种特殊的线性表栈仅能在线性表的一端进行操作栈顶( Top ):允许操作的一端栈底( Bottom ): 不允许操作的一端2、栈的性质性质:后进先出(LIFO) 3、栈的顺序存储实现 3.1 代码复用 利用【一】线性表的顺序存储结构 中已经实现的线性表,实现顺序存储的栈 完整代码下载: 文件名:seqstack-1.0.tar.gz 链接: http://p原创 2015-05-25 20:14:33 · 741 阅读 · 0 评论 -
【八】栈的应用实例(二)
1、问题的提出尝试用计算机读入字符串“9+(3-1)*5+8/2+(5/2)”并计算值2、中缀表达式 与 后缀表达式波兰科学家在20世纪50年代提出了一种将运算符放在数字后面的后缀表达式 对应的,我们习惯的数学表达式叫做中缀表达式 实例: 5 + 3 => 5 3 + 1 + 2 * 3 => 1 2 3 * + 9 + ( 3 – 1 ) * 5 => 9 3 1 –原创 2015-05-27 09:30:51 · 939 阅读 · 0 评论 -
【二】线性表的链式存储结构
1、链式存储定义为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外 ,还需要存储指示其直接后继的信息。2、链式存储逻辑结构 n个结点链接成一个链式线性表的结构叫做链表, 当每个结点中只包含一个指针域时,叫做单链表。3、链表的基本概念 表头结点 链表中的第一个结点,包含指向第一个数据元素的指针以及 链表自身的一些信息; 数据结点 链表中代原创 2015-05-19 16:51:27 · 818 阅读 · 0 评论 -
【九】栈与递归--程序栈空间
1、C语言中的疑惑C语言中常说“局部变量在栈上分配空间”,那么这个地方的“栈”和我们之前学习的栈数据结构有关系吗?解答:保存局部变量的栈是函数调用时的栈;程序中的“函数调用栈”是栈数据结构的一种应用;函数调用栈一般是从高地址向低地址增长的 栈底为内存的高地址处栈顶为内存的低地址处函数调用栈中存储的数据被称为活动记录2、什么是活动记录?活动记录是函数调用时一系列相关信息的记录,猜测它应该原创 2015-05-27 20:54:26 · 2897 阅读 · 0 评论 -
【十】递归
1、什么是递归?递归是一种数学上分而自治的思想递归将大型复杂问题转化为与原问题相同但规模较小的问题进行处理递归需要有边界条件 当边界条件不满足时,递归继续进行当边界条件满足时,递归停止2、利用递归,实现斐波拉契数列什么叫斐波那契数列? 又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、…… 即第n项是第n-1项与第n-2项的和;完整代码:/* 该函数利原创 2015-05-27 21:32:51 · 772 阅读 · 0 评论 -
【十一】递归与回溯--解决8皇后问题
1、递归与回溯递归在程序设计中也常用于需要回溯算法的场合回溯算法的基本思想 从问题的某一种状态出发,搜索可以到达的所有状态当某个状态到达后,可向前回退,并继续搜索其它可达状态当所有状态都到达后,回溯算法结束程序设计中可利用函数的活动对象保存回溯算法的状态数据,因此可以利用递归完成回溯算法2、八皇后问题在一个8×8国际象棋盘上,有有8个皇后,每个皇后占一格;要求皇后间不会出现相互“攻击原创 2015-05-27 22:08:52 · 884 阅读 · 0 评论 -
【十二】队列及其顺序存储结构
1、队列的定义队列是一种特殊的线性表队列仅在线性表的两端进行操作队头( Front):取出数据元素的一端队尾( Rear):插入数据元素的一端队列不允许在中间部位进行操作!2、队列的性质 性质:先进先出(FIFO)3、队列的顺序存储实现示意图: 4、代码复用利用顺序链表,实现顺序存储的队列!/* 在队尾添加一个元素 如果成功,返回1,失败返回0*/int SeqQu原创 2015-05-30 21:46:05 · 631 阅读 · 0 评论 -
【十七】排序算法(三)--快速排序
1、快速排序算法步骤:从数列中挑出一个元素,称为 “基准”(pivot)。重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。2、算法实现/*快速排序算法:原创 2015-06-02 19:28:48 · 602 阅读 · 0 评论 -
【十八】排序算法(四)--归并排序
1、归并排序算法步骤:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。设定两个指针,最初位置分别为两个已经排序序列的起始位置。比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置。重复步骤3直到某一指针达到序列尾。将另一序列剩下的所有元素直接复制到合并序列尾。2、算法实现/*归并排序算法: 一般使用二路归并! 通俗描述:原创 2015-06-02 19:34:54 · 429 阅读 · 0 评论 -
【十六】排序算法(二)--希尔排序算法
1、希尔排序算法步骤: 通俗的说法: 1. 将一个长度为len的待排序列,依照某个间距gap,分割成len/gap份; 2. 对这每个子序列进行插入排序; 3. 完成后,将gap减小,再执行上述过程; 4. 直到gap为1时,排序完成!算法实现:/* 用于交换两个元素的值*/void swap(int *array, int i, int j){ int te原创 2015-06-02 19:07:33 · 520 阅读 · 0 评论 -
【十五】排序算法(一)
1、选择排序算法步骤: 1. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。 2. 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 3. 重复第二步,直到所有元素均排序完毕算法实现:void selectionSort(int *array, int len){ int i = 0,j = 0,min = 0; if(array ==原创 2015-06-02 16:48:29 · 606 阅读 · 0 评论 -
【二十】二叉树及其性质
1、树的结构通用树结构: 通用树结构采用的是双亲孩子表示法模型建立的,它有如下的特点:每个结点都有一个指向其双亲的指针每个结点都有若干个指向其孩子的指针示例图: 另一种树结构表示法孩子兄弟表示法模型: 每个结点都有一个指向其第一个孩子的指针每个结点都有一个指向其第一个右兄弟的指针示例图: 孩子兄弟表示法:每个结点包含一个数据指针和两个结点指针 数据指针:指向保存于树中的数据原创 2015-06-23 10:19:06 · 622 阅读 · 0 评论 -
【四】循环链表
1、循环链表的定义 将单链表中最后一个数据元素的next指针指向第一个元素! 2、数据结构的定义//circlelist.h/* 对外做数据封装,屏蔽线性表的实现*/typedef void Circlelist;typedef struct _struct_circlelistNode CirclelistNode;struct _struct_circlelistNode{原创 2015-05-22 15:47:55 · 590 阅读 · 0 评论 -
【五】双向链表
1、双向链表的定义 在单链表的结点中增加一个指向其前驱的p r e指针!2、数据结构的定义//dlinklist.h/* 对外做数据封装,屏蔽线性表的实现*/typedef void DLinklist;typedef struct _struct_linklistNode DLinklistNode;struct _struct_linklistNode{ DLinklist原创 2015-05-22 16:05:05 · 449 阅读 · 0 评论 -
记一道关于链表的面试题
这几天一直在参加校园面试,各大公司都有自己的笔试题,一直以来都觉得链表题都比较简单,但有时候头脑发热,在紧张的笔试中再简单的算法题也有可能写不出来,近三天参加的笔试中,下面的链表题出现了三次,可见链表还是很重要的! 题目:已知一链表结点定义为:typedef struct node Node;struct node{ int data; Node *next;};(1) 现已知链表头原创 2015-10-16 22:34:55 · 811 阅读 · 0 评论