数据结构与算法
文章平均质量分 80
微信公众号
Hello world
展开
-
判断循环链表是否有环
判断一个单向链表是否有环。(指向表头结点的指针为head)方法一:(1)用两个指针p1和p2分别指向表头结点,即p1=p2=head(2)p1和p2分别采用1和2作为步长遍历该链表。(注意,p2应该检查当前结点的下一个结点是否为NULL)(3)如果p1或者p2遇到了NULL,则证明该链表没有环;若p1和p2在某时刻指向转载 2013-06-13 11:45:32 · 7816 阅读 · 0 评论 -
浅谈算法和数据结构:哈希表
在前面的系列文章中,依次介绍了基于无序列表的顺序查找,基于有序数组的二分查找,平衡查找树,以及红黑树,下图是它们在平均以及最差情况下的时间复杂度:可以看到在时间复杂度上,红黑树在平均情况下插入,查找以及删除上都达到了lgN的时间复杂度。那么有没有查找效率更高的数据结构呢,答案就是本文接下来要介绍了散列表,也叫哈希表(Hash Table)什么是哈希表哈希表就转载 2015-04-09 15:20:40 · 2816 阅读 · 0 评论 -
浅谈字符串匹配算法—BF算法及KMP算法
字符串匹配,在实际编程中经常遇到。其相应的算法有很多,本文就BF算法和KMP算法,谈一下自己的理解。并结合平时编程,修改了一下,使其更符合我们的使用习惯。(注:标准BF算法和KMP算法,为研究方便,其字符数组[0]存放的都是字符串的长度。本文讲解中,并没有保存字符串长度。后面给出的示例代码中,字符数组中是否保存有字符串长度,都给出了相应的算法代码。)一、BF算法(Brute Force):原创 2013-06-26 15:41:16 · 8051 阅读 · 5 评论 -
马踏棋盘算法(骑士周游问题)
马踏棋盘算法(骑士周游问题)定义:将马随机放在国际象棋的8×8棋盘Board[0~7][0~7]的某个方格中,马按走棋规则进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格。算法:如图:用一个二维数组来存放棋盘,假设马儿的坐标为(x,y),那么可供选择的下一个位置共有8种可能。我们所要做的,就是从0号位置开始,依次判断新的马儿位置是否可用,不可用的话(即马儿已经走过该位原创 2013-07-10 17:56:11 · 30591 阅读 · 0 评论 -
利用递归求解八皇后问题
利用递归求解八皇后此类问题。#include #include #define ROW 8 //8行 修改行数、列数,可求解对应的N皇后问题#define COLUMN 8 //8列int notDanger(int row,int column,int (*chess)[]);void EightQueen(int row,int column,int (*chess)[]原创 2013-06-23 14:11:48 · 1416 阅读 · 1 评论 -
线索二叉树
定义:按照某种遍历方式对二叉树进行遍历,可以把二叉树中所有结点排序为一个线性序列。在该序列中,除第一个结点外每个结点有且仅有一个直接前驱结点;除最后一个结点外每一个结点有且仅有一个直接后继结点。这些指向直接前驱结点和指向直接后续结点的指针被称为线索(Thread),加了线索的二叉树称为线索二叉树。n个结点的二叉链表中含有n+1个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的原创 2013-07-02 14:01:21 · 11611 阅读 · 7 评论 -
冒泡排序,选择排序,快速排序
#include #include #include void traverse_array(int,int *);void output_array(int,int *);void select_sort_array(int,int *);void bubble_sort_array(int,int*);void quick_sort_array(int,int[]);int原创 2013-03-13 11:55:56 · 996 阅读 · 0 评论 -
如何利用堆栈及逆波兰表达式进行数学四则运算(C语言版)
本文演示如何利用自定义堆栈(可实现通用性)和逆波兰表达式(后缀表达式)来进行数学四则运算。阅读须知:了解堆栈定义过程、了解中缀表达式、了解后缀表达式(逆波兰表达式)。不清楚的同学百度一下,用10分钟了解一下即可。示例程序优点:1,自己做了一些注释, 尽量将转换原理和计算原理说清一些,如果还有看不明白的同学,只好移步百度谷歌了。2,自己定义了一个堆栈,可实现数据类型无关性。简称通用性原创 2013-06-18 19:09:39 · 9437 阅读 · 6 评论 -
用链式结构实现二叉搜索树
先明确几个概念:树:是一种重要的非线性数据结构,它是数据元素(在树中称为结点)按分支关系组织起来的结构。二叉树:二叉树是每个节点最多有两个子树的有序树。(树和二叉树的2个主要差别:1. 树中结点的最大度数没有限制,而二叉树结点的最大度数为2;2. 树的结点无左、右之分,而二叉树的结点有左、右之分。)满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点。完全二叉树:若原创 2013-01-22 15:44:44 · 1548 阅读 · 0 评论 -
二分查找算法
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以原创 2013-06-19 16:16:00 · 1365 阅读 · 1 评论 -
队列的基本操作(采用链式存储结构)
队列的初始化、入队、出对、销毁队列。#include #include #define TRUE 1#define FALSE 0#define ERROR -1typedef int Status;typedef char ElemType;typedef struct qNode{ ElemType data; struct qNode *next;原创 2013-06-19 14:51:05 · 4319 阅读 · 0 评论 -
递归和分治思想的典型应用—汉诺塔问题
首先,讲解一下汉诺塔问题的由来:一位法国数学家曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根原创 2013-06-19 18:00:18 · 2742 阅读 · 1 评论 -
栈的基本操作(采用顺序存储结构)
关于栈的基本操作,记录一下,方便以后查看。包括栈的初始化、入栈、出栈、清空栈、销毁栈、获取已入栈元素个数#include #include #define TRUE 1#define FALSE 0#define ERROR -1#define STACKINITSIZE 20#define STACKADDSIZE 5typedef int ElemType;type原创 2013-06-14 11:25:52 · 16035 阅读 · 1 评论 -
C语言求解约瑟夫问题
约瑟夫问题简述:著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数到3,循环直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,于是,他将朋原创 2013-06-09 14:39:15 · 4909 阅读 · 0 评论 -
函数式编程扫盲篇
原文地址:http://www.cnblogs.com/kym/archive/2011/03/07/1976519.html1. 概论在过去的近十年的时间里,面向对象编程大行其道。以至于在大学的教育里,老师也只会教给我们两种编程模型,面向过程和面向对象。孰不知,在面向对象产生之前,在面向对象思想产生之前,函数式编程已经有了数十年的历史。那么,接下来,就让我们回顾这转载 2015-11-22 23:47:37 · 30875 阅读 · 11 评论