数据结构
Julinus
希望在这里和大家一起学习交流。
展开
-
数据结构之线性表
// 线性表#include#define MAXSIZE 100using namespace std;// 结构体typedef struct{ int elem[MAXSIZE]; int last;}SeqList;void InitList(SeqList *L) // 初始化线性表{ for (int i =原创 2017-03-01 13:20:56 · 253 阅读 · 0 评论 -
栈之逆波兰计算器
逆波兰表达式 逆波兰表达式又叫做后缀。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法,按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。表达式逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后缀原创 2017-07-02 19:01:38 · 282 阅读 · 0 评论 -
排序之直接选择排序
直接选择排序直接选择排序(Straight Select Sorting) 也是一种简单的排序方法,它的基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,....,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,.....,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换原创 2017-06-24 15:59:08 · 424 阅读 · 0 评论 -
递归值汉诺塔
算法思想: 汉诺塔有三个塔座,假设为A,B,C。 移动布步骤: 第一步:如果只有一个盘子的话,可以直接A塔座上移动到B塔座上; 第二步:如果有n个盘子的话,先把n-1个盘子借助C塔座移动到B塔坐上; 把第n个盘子从A塔坐上移动到C塔坐上; 把原创 2017-07-07 17:06:27 · 301 阅读 · 0 评论 -
二叉树的创建以及遍历方法
二叉树的递归遍历和非递归遍历 在此分别总结先序,中序,后序的结点输出顺序。 先序: 1.访问根结点 2.访问左子树 3.访问右子树 先序较简单,不予以即系解释。 中序:1.访问左子树 2.访问根结点 3.访问右子树 原则:访问左子树。【先访问左子树中的左子树,再访问左子树中的右子树。】直到访问到叶子结点原创 2017-07-20 21:08:46 · 684 阅读 · 0 评论 -
递归之八皇后问题
八皇后问题简介: 八皇后是一道很具典型性的题目。它的基本要求是这样的:在一个8*8的矩阵上面放置8个物体,一个矩阵点只允许放置一个物体,任意两个点不能在一行上,也不能在一列上,不能在一条左斜线上,当然也不能在一条右斜线上。 初看到这道题目,大家的第一印象是遍历,但是经过实践之后发现遍历其实不好写,而且复杂度很低。不仅需要遍历8*8*8*8*8*8*8*8*8 = 2^2原创 2017-07-08 10:32:19 · 210 阅读 · 0 评论 -
字符串和BF算法的实现
// 串的实现#include#includeusing namespace std;#define MAXSIZE 40 // 串结构定义typedef struct _String{ char ch[MAXSIZE]; int len;}String;// 生成一个值等于sp中的内容的字符串void StrAgain(String *s,cha原创 2017-07-09 00:41:16 · 520 阅读 · 0 评论 -
二叉树的创建,遍历和销毁
#include#include#include#includeusing namespace std;// 二叉树的定义typedef struct _BiNode{ char data; // 数据域 struct _BiNode*LChlid; // 左孩子指针 struct _BiNode*RChlid; // 右孩子指针}BiNode,*BiTree;原创 2017-07-23 19:25:37 · 796 阅读 · 0 评论 -
排序之直接插入排序
排序方法1.简单方法首先在当前有序区R[1..i-1]中查找R[i]的正确插入位置k(1≤k≤i-1);然后将R[k..i-1]中的记录均后移一个位置,腾出k位置上的空间插入R[i]。注意:若R[i]的关键字大于等于R[1..i-1]中所有记录的关键字,则R[i]就是插入原位置。2.改进的方法一种查找比较操作和记录移动操作交替地进行的方法。具体做法:将待插入记录R[i]的关原创 2017-06-22 23:14:46 · 251 阅读 · 0 评论 -
排序之冒泡排序
冒泡排序算法的运作如下:(从后往前)比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。[时间复杂度所以,冒泡排序最好的时间复杂度为原创 2017-06-22 23:09:52 · 230 阅读 · 0 评论 -
循环链表应用------Josephus环问题
// 编号为1-N的N个人按顺时针方向围坐一圈,每个人持有一个密码(正整数,可以自由输入)开始选一个正整数作为报数上限值M,// 从第一个人开始按顺时针方向自1开始顺序报数,报到M时停止报数。报到M的值的人出列,将它的值作为新的M值,从他顺时针方// 向的下一个人开始从1报数,如此下去,直到所有人出列为止;#includeusing namespace std;// 循环链原创 2017-03-18 08:29:26 · 357 阅读 · 0 评论 -
魔术师发牌问题和拉丁布方阵
本文利用经典的魔术师发牌问题与拉丁法阵分别讲解了循环链表与单向链表的使用,作为算法中的经典,对于链表的学习和理解都有着很大的帮助,不妨一看。魔术师发牌问题问题描述:魔术师利用一副牌中的13张黑牌,预先将他们排好后叠放在一起,牌面朝下。对观众说:“我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听,不信?现场演示。”魔术师将最上面的那张牌数为1,把原创 2017-03-20 22:54:57 · 303 阅读 · 0 评论 -
判断链表是否有环
#includeusing namespace std;// 循环链表结构体typedef struct _Node{ int data; // 数据域; struct _Node *next; // 指针域;}DNode,*DLinkList;// 初始化函数void InitDLinkList(DLinkList *pHead){原创 2017-03-21 08:48:45 · 441 阅读 · 0 评论 -
数据结构中的头结点、头指针、开始结点有什么区别
数据结构 开始结点是指链表中的第一个结点,它没有直接前驱头指针是指指向开始结点的指针(没有头结点的情况下)。一个单链表可以由其头指针唯一确定,一般用其头指针来命名单链表头结点是在链表的开始结点之前附加的一个结点。有了头结点之后头指针指向头结点,不论链表是否为空,头指针总是非空,而且头结点的设置使得对链表的第一个位置上的操作与在表中其它位置上的操作一致原创 2017-03-12 10:04:33 · 21047 阅读 · 0 评论 -
双向循环链表的实现
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。#includeusing namespace std;// 数据类型结构体typedef int ElemType;// 双向循环链表结构体type原创 2017-03-22 16:59:40 · 618 阅读 · 0 评论 -
单链表的冒泡排序以及逆序(交换指针法)
一直苦于单链表进行排序操作,在博客上看到好多的链表排序都是以值交换为主,实在是很难受。自己有一个需求就是写一个单链表的冒泡排序和逆序。然后自己也写了值交换法的单链表冒泡排序和逆序,希望能对需要帮助的朋友产生一些启发,当然本人的水平有限,写的不好,请大家指导。#include#include// 链表结构体typedef struct _Node{ int da原创 2017-04-11 07:21:38 · 4257 阅读 · 0 评论 -
约瑟夫环实现算法
约瑟夫环约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后[1] 结果+1即为原问题的解。 算法原理约瑟原创 2017-07-29 10:50:40 · 555 阅读 · 0 评论