
数据结构
文章平均质量分 74
CaryaLiu
关注移动互联网,iOS开发者
展开
-
线性链表的基本算法
最近补补数据结构,还是从最简单的线性链表开始。下面是线性链表的一些基本算法,留着以后翻案。下面的算法描述都是以字符串为数据元素。链表结构定义如下:typedef struct node { char data[100]; struct node *link;}LNode, *LinkList;1。建立一个线性链表,这是一个动态生成链结点并依次将它们链接到链表原创 2011-11-24 21:12:43 · 10916 阅读 · 0 评论 -
二叉树的层序遍历
问题来源:《编程之美》3.10 分层遍历二叉树给定一棵二叉树,要求分层遍历该二叉树,即从上到下按层次访问该树,每一层单独输出一行,每一层要求访问的顺序为从左到右。我们在遍历的过程中将该层节点的孩子节点压入一个队列,这样就可以实现从上到下一层一层地遍历该二叉树。C++的程序描述如下:void printNodeByLevel(BinTree root){ if(root原创 2012-10-27 16:43:51 · 32113 阅读 · 1 评论 -
二分查找那点事儿
二分查找你针对有序序列而言的一种查找算法,关于二分查找有一下的几类问题:1. 给定一个有序(不降序)数组arr,求任意一个i使得arr[i]等于v,不存在则返回-12.给定一个有序(不降序)数组arr,求最小的i使得arr[i]等于v,不存在则返回-13.给定一个有序(不降序)数组arr,求最大的i使得arr[i]等于v,不存在则返回-14.给定一个有序(不降序)数组arr,求最大原创 2012-10-31 20:17:26 · 1700 阅读 · 0 评论 -
求二叉树中节点的最大距离
问题来源:《编程之美》3.8 求二叉树节点的最大距离如果把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两个节点之间的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。如下图所示,粗箭头的边表示最长距离:树中相距最远的两个节点是A, B分析可知:对于二叉树,若要两个节点U,V相距最远,有两种情况:1,从U节点到V节点之间的路径经过原创 2012-10-24 15:36:16 · 16023 阅读 · 1 评论 -
队列中取最大值操作问题
问题出处:《编程之美》3.7队列中取最大值操作问题假定有这样一个拥有3个操作的队列:1. EnQueue(v): 将v加入队列中2. DeQueue(): 使队列中的队首元素删除并返回此元素3. MaxElement(): 返回队列中的最大值请设计一种数据结构和算法,让MaxElement()操作的时间复杂度尽可能的低。常规思路:利用一个数组或者链表来存储队原创 2012-10-22 10:37:30 · 7038 阅读 · 1 评论 -
根据二叉树的遍历结果重建二叉树
问题来源:《编程之美》3.9 重建二叉树给定一棵二叉树,假设每个节点都用唯一的字符来表示,具体结构如下:struct Node{ struct Node *pLeft; struct Node *pRight; char chValue;};假设已经有了前序遍历和中序遍历的结果,希望通过一个算法重建这棵树。给定函数的定义如下:void R原创 2012-10-25 12:04:38 · 2561 阅读 · 0 评论 -
线性链表的逆序操作
关于线性链表的逆序可用循环和递归的两种方式完成,逆序的递归方式比较难理解,主要是返回头结点的问题。链表节点定义如下://定义线性链表结点typedef struct node { int data; struct node *link;}LNode, *LinkList;循环方式完成逆序://逆转线性链表LinkList reverseList(L原创 2012-11-29 14:56:49 · 2024 阅读 · 0 评论 -
堆积排序-堆排序-heap sort
堆积排序是另一种形式的选择排序。它涉及到 堆积 和 完全二叉树 的概念。1. 堆积的定义具有n个数据元素的序列 K = (k1, k2, k3, k4, . . . , kn); 当且仅当满足条件k[ i ] >= k[ i*2 ] && k[ i ] >= k[ i*2+1] 或者k[ i ] i = (1, 2, 3, 4, . . . , n/2)时称序列K为一个原创 2012-04-15 14:49:20 · 3109 阅读 · 0 评论 -
QuickSort快速排序
算法描述:在当前参加排序的序列array[0..n-1] 中任意选择一个元素(通常称该元素为分界元素或者基准元素), 把小于等于分界元素的所有元素都移到分界元素的前边,把大于等于分界元素的所有元素都移到分界元素的后边,这样,分界元素正好处在排序的最终位置上,并且把当前参加排序的序列分成前后两个子序列,前一个子序列中所有元素都小于等于分界元素,后一个子序列中所有元素都小于等于分解元素。然后分别对原创 2012-04-14 00:07:48 · 2983 阅读 · 1 评论 -
插入排序算法
首先了解两个概念:1. 内排序和外排序内排序,参加排序的数据量不大,在排序过程中可以将所有参加排序的数据存放在内存中处理的排序方法。外排序,参加排序的数据量很大,以至于内存不足以一次存放全部数据,在排序过程中需要通过内存与外存之间的数据交换来达到排序目的的排序方法。2. 稳定性排序与非稳定性排序参加排序的项称为排序码或者排序项。这个概念是针对的是有多个相同的排序项参加排序的原创 2012-04-08 17:54:51 · 6067 阅读 · 3 评论 -
判断单链表是否有环及确定环的入口结点问题
1. 判断单链表是否有环设置两个指针 fast 和 slow 遍历链表,初始时它们都指向链表的头指针,fast指针在遍历时每次移动两步,而slow指针在遍历时一次移动一步,这样,如果单链表中存在环,fast指针必定先进入环,待slow指针也进入环时,fast指针和slow指针所指结点之间的距离会在遍历的过程中一步一步的缩小直到它们都指向同一个结点;如果链表中不存在环,那么fast指针会先到达链原创 2011-12-06 23:53:58 · 2060 阅读 · 0 评论 -
选择排序算法
假定存在数组 array[0..n-1], 选择排序的核心思想是:第 i 趟排序是从后面的 n - i + 1(i = 1,2,3,4,. . .,n - 1)个元素中选择一个值最小的元素与该 n - i + 1 个元素的最前门的那个元素交换位置,即与整个序列的第 i 个元素交换位置。如此下去,直到 i = n - 1,排序结束。也可描述为:每一趟排序从序列中未排好序的那些元素中选择一原创 2012-04-08 20:46:43 · 26739 阅读 · 3 评论 -
串的模式匹配
串的模式匹配也称字串定位。设S和PAT分别为两个字符串,串的模式匹配就是以PAT为模式,查看字符串S中有无PAT这样的字串。若S中存在这样的字串,则给出其在S中首次出现的位置;否则给出0。方法如下:先测试PAT的末尾字符与S中相对应位置的字符是否相同,若不相同,则将PAT的末尾字符和S的下一个字符比较,直到相同;然后再从PAT的第一个字符开始与S中对应位置的字符比较。当PAT的每一个字符与原创 2012-01-05 23:21:10 · 929 阅读 · 0 评论 -
将非空单链表中的数据域值最大的那个链结点移至链表的末尾的算法
已知非空线性链表第1个链结点的指针为list,在算法的设计中需要用到4个LinkList指针,q 用来记录域值最大的那个链结点,s 用来记录域值最大的那个链结点的直接前驱结点,p用来遍历整个链表,r 用来记录在遍历过程中当前正在比较的链结点的直接前驱结点。在算法设计中需要分两步,第一步是要找到最大值结点,第二步是要将最大值结点移动至链表的末尾(如果最大值结点不是末尾结点)。在将最大值结点移动到原创 2011-11-27 21:12:51 · 13396 阅读 · 2 评论 -
用循环链表解决约瑟夫(josephu)问题
约瑟夫问题:已知n个人(以编号1, 2, 3, ...., n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的人又出列;依次规则重复下去,直到圆桌周围的人全部出列。例如当n = 8, m =4, k =3时,出列的顺序依次为6, 2, 7, 4, 3, 5, 1, 8.现在利用一个具有n个链接点且不带头结点的循环链表。将圆桌周围的每原创 2011-12-05 22:41:41 · 1825 阅读 · 0 评论 -
双向链表的插入和删除算法
1.在带有头结点的双向循环链表中第1个数据域内容为x的结点右边插入一个数据信息为item的新结点,算法如下:typedef struct node{ int data; struct node *llink, *rlink;}DNode, *DLinkList;int insertElem( DLinkList list, int x, int item ){ D原创 2011-12-07 20:50:04 · 4180 阅读 · 0 评论 -
稀疏矩阵的十字链表存储
稀疏矩阵可用三元组表存储方法存储,但是当稀疏矩阵中非零元素的位置或者个数经常发生变化时,使用三元组表就不太方便,十字链表存储能够提高访问效率,这种方法不仅为稀疏矩阵的每一行设置一个单独的行循环链表,同样也为每一列设置一个单独的列循环链表。这样,稀疏矩阵中的每一个非零元素同时包含在两个链表中,即包含在它所在的行链表和所在的列链表中,也就是两个链表的交汇处。稀疏矩阵的链接点构造有5个域值:row,原创 2011-12-18 13:15:18 · 11727 阅读 · 0 评论 -
顺序堆栈的基本算法
顺序堆栈的存储结构类型描述如下:#define M 1000 /* 定义堆栈的最大容量 */SElemType STACK[ M ];int top; /* 栈顶指针变量 */下面是基本算法描述,很简单:#include#include#define M 1000 /* 定义堆栈的最大容量 *//* 初始化一个堆栈 */void in原创 2011-12-19 20:35:49 · 2191 阅读 · 0 评论 -
利用堆栈进行数制转换
下面以无符号十进制转换为八进制为例简述数制转换问题。将十进制数num转换为八进制可以反复执行以下步骤得到:1,将num除以8,取其余数2,判断num除以8的商: 若商为零,则转换到此结束; 若商不为零,则将商送num,转到第1步。算法描述如下:/* 将无符号十进制数转换为八进制数 *//* 堆栈采用顺序存储结构 */#define M 100void c原创 2011-12-21 00:25:15 · 2586 阅读 · 0 评论 -
顺序队列的基本算法及循环队列
队列的顺序存储结构类型描述如下:#define M 1000QElemType queue[ M ];int front, rear;队头指针front指出实际队头元素所在位置的前一个位置,而队尾指针rear指出实际队尾元素所在的位置,初始时,队列为空有front = rear = -1, 测试一个队列是否为空的条件是front = rear.顺序队列的基本算法如下:/* 顺原创 2011-12-26 01:02:01 · 7770 阅读 · 0 评论 -
迷宫问题
迷宫问题的总体思路是,从迷宫的入口出发,沿着某一个方向向前试探,若能够行得通,则继续往前走,否则原来返回,再换另一个方向继续试探,直到所有可能的通路都被试探过,为了保证在任何一个位置都能够原来返回,需要设置一个堆栈结构来保存从入口到当前位置的路径。迷宫可以用一个二维数组maze[1..m][1..n]来表示。数组中的元素值为1时表示该点道路阻塞,为0时表示该点可以进入,这里假定迷宫的入口处元素原创 2011-12-25 14:36:08 · 9009 阅读 · 5 评论 -
链接队列的基本算法
所谓链接队列就是用一个线性链表来表示一个队列,队列中每个元素对应链表中一个链接点,队头指针front指向线性链表的第1个链接点,队尾指针rear指向链表的最后一个链接点,与顺序存储结构的队列不同的是,队头指针和队尾指针都是指向实际队头元素和队尾元素所在的链接点。测试链接队列为空的条件是front为NULL,链接队列的类型定义如下:/* 定义一个链接队列的类型 */typedef struct原创 2011-12-26 21:02:15 · 2890 阅读 · 0 评论 -
二路归并排序算法
将两个按值有序序列合并成一个按值有序序列,则称之为二路归并排序,下面有自底向上和自顶向下的两种排序算法,自顶向下的排序在本文末讲述,使用递归实现,代码较简洁,经供参考。1. 归并子算法:把位置相邻的两个按值有序序列合并成一个按值有序序列。例如把序列 X[s..u] = {3, 12, 23, 32}和 序列 X[u+1..v] = {2, 5, 8, 99} 合并成序列 Z[s..v] =原创 2012-04-19 00:28:37 · 45250 阅读 · 11 评论