自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

CCPP Blog

结构、算法、c、c++

  • 博客(23)
  • 资源 (39)
  • 收藏
  • 关注

原创 数据结构:图的实现--邻接矩阵

为了表现图中顶点之间的关联,我们可以使用邻接矩阵来实现图结构。所谓的邻接矩阵,就是一个反应边与边之间联系的二维数组。这个二维数组我们用matrix[numV][numV]表示,其中numV是顶点数。对于无权图若顶点Vi和Vj之间有边,则matrix[Vi][Vj]=1;否则matrix[Vi][Vj]=0。对于有权图若顶点Vi和Vj之间有边,且权值为weight,则matrix[Vi][Vj]=weight;否则matrix[Vi][Vj]=0或MAXWEIGHT(取最小权值或最大权值)。

2014-07-31 23:29:34 23206 1

原创 娓娓道来c指针 (8)开发可变参数函数

在c语言中,可变参数的函数极其常见,如常用的printf()。可变参数函数的一般形式如下:返回值类型 函数名(类型1 参数1,类型2 参数2,...类型n 参数n,...);如上所示,这是一个典型的可变参数样式,它共有n个确定的参数,最后的...表示可变参数的含义。必须指出...必须位于最后,并且它至少要有一个确定的参数,原因后面陈述。为了开发可变参数的函数,需用到头文件stdarg.h。下面共给出两个实例,在实例中详细解释用法。一是求可变个整数的和;二是模仿printf函数。

2014-07-29 23:56:30 2813

原创 娓娓道来c指针 (7)指针运算

在前几篇文章中,我们已经见过指针运算的使用场景,并多次使用指针运算来进行验证。这里我们来特别地总结下,指针运算的本质含义。在c语言中,假设p、pa、pb都是某种类型的指针,这样的运算被称为指针运算: ,前提:pa和pb类型相同。其本质是1.。2.,得到的是逻辑存储单元数,而不是简单的物理字节数。

2014-07-27 00:11:16 4112

原创 娓娓道来c指针 (6)const的使用

c中的const表达着“常量”的意思,更准确地说是“read-only”(只读)的含义。当const与指针相遇时,由于其与*的相对位置不同,会产生不一样的效果。举例说明(1)const位于*的左侧如,const int *p;此时等同于int const *p;此时,const的含义体现在:*p是只读的。(1)const位于*的右侧如,int *const p;此时,const的含义体现在:p是只读的。

2014-07-27 00:02:36 3444 3

原创 娓娓道来c指针 (5)c数组本质

c中的数组是一种聚合类型,把同种类型的元素按顺序存储,即是数组。c中数组类型的特点在于:它是嵌套定义的。

2014-07-26 00:59:33 5059

原创 娓娓道来c指针 (4)解析c的声明语句

在继续探索c指针之前,有必要来解析下c语言中复杂的声明语法。只需要记住两则:一个原则,一个规则。原则:先看标示符。规则:运算符优先级是规则。

2014-07-26 00:55:42 4002 4

原创 娓娓道来c指针 (3)指针和数组

在c中指针和数组似乎有着千丝万缕的关系。其实它们不是一回事:指针是指针,数组是数组,两者不相同。

2014-07-25 00:58:09 6135 4

原创 娓娓道来c指针 (2)内存分配

c语言中描述变量的时候常用的两个用语1.作用域:也叫可见域,指的是变量的作用范围。在哪个范围内,该变量是可以使用的,可见的。2.生存期:也叫存储期,指的是变量从创建到销毁的生存时间段。作用域和存在域是两个不同的概念,比如在程序的某个位置,某变量存在(内存中分配了地址)但不可见(不可使用)。

2014-07-25 00:18:48 4891 2

原创 娓娓道来c指针 (1)指针就是地址

首先明确一个观点:指针就是地址。这是理解指针的起始一步。

2014-07-24 00:38:17 10829 12

原创 娓娓道来c指针 (0)c语言的梦魇:c指针

c语言中有一个重点:c指针。它也是一个难点。当然,这是一句废话:重点往往也是难点。在c标准中,对指针的定义是这样的:指针的类型是derived from其它类型,也就是说指针的类型是由它指向的类型决定的;指针是一种reference类型,即引用类型; c指针似乎很难理解,以至于有人指出:掌握了c指针,就掌握了c语言的精髓。本系列就来聊聊c指针,要想弄懂c指针。光就指针本身进行理解,还不够。 因为指针的本质就一句话:指针就是地址。这句话大多数学过c语言的人都明白,但对很多使用指针的场景仍然

2014-07-24 00:37:49 20241 5

原创 串的匹配:朴素匹配&KMP算法

引言字符串的模式匹配是一种常用的操作。模式匹配(pattern matching),简单讲就是在文本(text,或者说母串str)中寻找一给定的模式(pattern)。通常文本都很大,而模式则比较短小。典型的例子如文本编辑和DNA分析。在进行文本编辑时,文本通常是一段话或一篇文章,而模式则常常是一个单词。若是对某个指定单词进行替换操作,则要在整篇文章中进行匹配,效率要求肯定是很高的。模式匹配的朴素算法最简单也最容易想到的是朴素匹配。何为朴素匹配,简单讲就是把模式串跟母串从左向右或从右向左一点一点比较:

2014-07-23 22:30:13 4315 1

原创 图论基础

图概述图(Graph)是一种比线性结构和树形结构都要复杂的数据结构。简单讲,图是由表示数据元素的的集合V和表示数据之间关系的集合E组成。其中,数据元素常称作顶点(vertex),数据之间的关系常称作边(edge)。故图可记为G=<V,E>,其中V是顶点的有穷非空集合,E是边的集合。在图中顶点的前驱和后继是不设限制的,因此图描述的是一种网状关系。无向图若边是无序的或者说是无向的,则称此图是无向图。若无向图中有边(v1,v2)(无向图中边用圆括号表示),则显然(v2,v1)和(v1,v2)是同一条边。

2014-07-18 00:20:35 7532 6

原创 索引排序

索引排序在排序时,若是数据很复杂,对数据的移动显然是费时的。若把数据移动改为指针移动,则减少了操作复杂度。索引排序,也叫地址排序,就是这种排序思想。索引含义根据索引的含义不同,索引排序的算法上也主要分为两种。一、index[i]为array[i]最终在有序序列中的位置。二、index[i]为位置i上最终应存放元素的下标。即最终元素按array[index[0]]、array[index[1]]……有序。

2014-07-17 00:30:50 10195

原创 二分检索

二分检索二分检索(Binary Search)也叫二分查找,是应用于有序表上的一种检索方法。二分检索的思想是:由于序列已经有序,故不需要顺序遍历,每次只需和序列中间位置的元素进行比较即可,以此确定下次查找的位置。显然每次都可以排除一半的元素,很高效。

2014-07-13 15:20:32 3506

原创 哈夫曼树

哈夫曼树给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。节点的带权长度是这样定义的:节点的权值*根节点到该节点的路径长度。树的带权路径长度(Weighted Path Length of Tree,简记为WPL)则是指所有节点的带权长度和。哈夫曼树就是使WPL最小的一种树,并且哈夫曼树是满二叉树。它的构造方法是哈夫曼方法。哈夫曼树是这样构造的:

2014-07-12 00:03:35 4441 7

原创 桶排序

桶排序桶排序(Bucket Sort)是对基数排序的一个变种。在排序过程中没有用到计数数组,而是用不同的桶来暂时存储关键字。看一个示意图:整个过程就是在不断地分配、收集。在实际应用中,根据桶的创建策略,桶排序也有不同的写法。下面给出两种不同的桶创建方式。一、使用静态队列创建桶。二、使用二维数组模拟桶。

2014-07-11 01:07:57 2556 2

原创 基数排序

前言当序列中元素范围比较大时,就不适合使用计数排序。针对这种情况,就有了基数排序,这是一种按位排序。它仍然是以计数排序为基础。基数排序基数排序的基数:十进制数的基数自然是10,二进制的基数自然是2。通常有两种按位排序策略:1.高位优先法(most significant digit first,MSD):简单讲就是从高位排起。2.低位优先法(least significant digit first,LSD):它与高位优先相反,从低位排起。从排序效果上看,高位优先比较直观,但却涉及到递归的过程,故

2014-07-10 21:39:29 3357

原创 计数排序

前言一般的排序都是需要进行关键字的比较的。有没有不需要比较的的呢?有的,计数排序就是其中一种。计数排序假设输入序列都是0到k之间的整数,则可使用计数排序。具体操作是这样的:创建一个同类型同等大小的临时数组temp,用于备份输入序列。创建一个整型大小为k的数组count,用于统计序列中各元素出现的次数。接下来只需把备份序列从大到小放回原数组即可。一个示例图:

2014-07-09 22:09:15 2272

原创

堆的概述堆作为一种树形结构,也是二叉树的一种应用。二叉搜索树是规定了节点之间的大小关系:左孩子<根节点<右孩子。而堆中规定的节点之间的次序是:根节点<左孩子,根节点<右孩子;根节点>左孩子,根节点>右孩子。前者我们称之为小顶堆,后者是大顶堆。不同的逻辑定义,会得到不同的性质。关于堆的一些性质描述,我们在选择排序:堆排序中已详细介绍过。堆的存储结构堆是一种特殊的完全二叉树。通常所说的堆,就是指二叉堆。特殊是指它的节点大小次序是有规定的,但其本质还是一棵完全二叉树。而完全二叉树最常用的是顺序存储结构。

2014-07-08 14:02:11 2181

原创 二叉树前序、中序、后序遍历非递归写法的透彻解析

前言在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历。递归写法,只要理解思想,几行代码。可是非递归写法却很不容易。这里特地总结下,透彻解析它们的非递归写法。其中,中序遍历的非递归写法最简单,后序遍历最难。我们的讨论基础是这样的:

2014-07-06 22:14:43 130815 47

原创 二叉搜索树

定义二叉搜索树(Binary Search Tree)或称二叉查找树,也称二叉排序树(Binary Sort Tree)。它或者是一棵空树,或者是具有下列性质的二叉树:若左子树不空,则左子树上所有节点的值均小于它的根节点的值;若右子树不空,则右子树上所有节点的值均大于它的根节点的值;左、右子树也分别为二叉搜索树;性质二叉搜索树与普通二叉树相比,有一些优秀的特征或性质:由于节点是有序排放的:左子树<根节点<右子树。故在查找一个节点的时候,只需先和根节点比较,再决定是进入左子树还是右子树查找。而

2014-07-05 18:14:47 4057 2

原创 二叉树

在计算机科学中,树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构。二叉树(Binary Tree)是每个节点最多有两个子树的有序树。通常子树被称作"左子树"(left subtree)和"右子树"(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。值得注意的是,二叉树不是树的特殊情形。在图论中,二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根结点的度不大于2。有了根结点后,每个顶点定义了唯一的根结点,和最多2个子结点。

2014-07-03 19:09:49 11081 1

原创 树、二叉树基础

前面介绍的栈、队列都是线性结构(linear structure)。而树是非线性结构(non-linear structure)。因此,树中的元素之间一般不存在类似于线性结构的一对一的关系,更多地表现为多对多的关系。直观地看,它是数据元素(在树中称为节点)按分支关系组织起来的结构。显然,树形结构是比线性结构更复杂的一种数据结构类型。树的定义:树是含有n个节点的有穷集合,其中有一个节点比较特殊称为根节点。在图示树时,用一条边连接两个有逻辑关系的节点,这个关系被称为父子关系。二叉树(Binary Tree)由节

2014-07-02 12:37:01 4783

前缀、中缀、后缀表达式

利用STL中stack,解析前、后缀表达式,并将中缀表达式转换到相应的前、后缀表达式。

2015-06-23

去除停用词.c

使用C语言,根据停用词表,对指定文件的内容扫描,从而删除文件中出现的停用词。

2015-06-22

大整数的加、减、乘、除

使用C++语言,实现大整数的加、减、乘、除。使用到了标准库的string类型。关键是逻辑上的处理。

2015-06-10

十六进制数转化为八进制数

把位数在10W以内的十六进制数成功转化为八进制数,思想是:先转化为2进制数,再把2进制数转换为8进制数。

2015-03-17

函数模板模拟printf

利用C++中的函数模板简易模拟printf()函数。设计的知识点包括函数模板、可变参数等。

2015-02-17

外排序-多路归并

外排序问题的出现,主要是因为内存不够。当需要排序的数据量过多,以至于无法一次性把所有的数据都放入内存,这导致了外排序问题的出现。解决大数据量排序的方法是:先分块排序,后进行块合并。

2014-08-23

最小生成树:Prim算法

使用Prim算法求解图的最小生成树,其中图用邻接矩阵存储。

2014-08-05

图:FLoyd算法

使用Floyd算法,求解点对之间的最短距离。图结构使用邻接矩阵存储。

2014-08-04

求解单源最短路径:Dijkstara算法

使用Dijkstra算法求解单源最短路径问题,不仅求出最短路径,同时给出最短路径序列。

2014-08-03

有向图的拓扑排序

对于有向图进行拓扑排序,图使用邻接矩阵的存储结构。

2014-08-03

图的遍历:深度优先、广度优先

在邻接矩阵的存储结构下,实现图的深度优先遍历和广度优先遍历。

2014-08-02

图的实现:邻接表

使用邻接表实现图结构,无向的、有向的、无权的和有权的都可支持。

2014-08-01

图的实现:邻接矩阵

使用邻接矩阵实现图结构,无论是有向图、无向图、带权图还是无权图,都可以指定。

2014-07-31

模式匹配:KMP算法

使用KMP算法实现模式匹配,包括next数组的求解,kmp算法的实现。关键代码有详细注释。

2014-07-23

哈夫曼树&哈弗曼编码

哈夫曼树 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。用c++实现构造哈夫曼树、哈夫曼编码。

2014-07-12

桶排序(二维数组)

桶排序(Bucket Sort)是对基数排序的一个变种。在排序过程中没有用到计数数组,而是用不同的桶来暂时存储关键字。使用二维数组模拟桶。

2014-07-11

桶排序(静态队列)

桶排序(Bucket Sort)是对基数排序的一个变种。在排序过程中没有用到计数数组,而是用不同的桶来暂时存储关键字。使用静态队列模拟桶,实现桶排序。

2014-07-11

二叉堆:最大堆

使用c++实现最大堆。提供常见操作,如插入、删除、堆化数组、堆排序、上下调整、向下调整。

2014-07-08

二叉堆:最小堆

使用c++实现最小堆。提供常见操作,如堆化数组,插入,删除,堆排序,遍历堆。

2014-07-08

二叉搜索树的c++实现

使用二叉链表和c++来实现二叉搜索树,提供插入、删除、遍历、求最小节点、最大最节点等操作。

2014-07-05

二叉树的二叉链表实现

使用二叉链表实现二叉树,提供常见的操作:各种遍历,求树高,节点数。

2014-07-03

一元多项式的加法、减法、乘法

使用链表来实现单元多项式的加法、减法、乘法。其中,加法是其它运算的基础,减法:poly1-poly2=poly1+(-poly2),乘法:poly1*poly2,可用poly1乘以poly2的每一项,相加其乘积结果。

2014-06-17

队列的应用:优先级队列

使用顺序存储实现优先级队列,展示优先级队列和普通队列的区别之处。

2014-06-12

队列的实现:链式队列

用链表的形式实现队列,提供常见操作,出队、入队……

2014-06-09

队列的实现:顺序队列

使用顺序存储的方式实现队列,提供队列的常见操作。

2014-06-07

栈的实现:链式栈

使用链式结构来实现栈,提供常见的栈操作,push() pop() top() empty() size()

2014-06-05

栈结构解析算术表达式

使用栈结构解析算术表达式,加、减、乘、除、求余,并支持多位数运算

2014-05-28

用栈解析算术表达式

用栈解析算术表达式,并且做到了多位数运算,运算包括加、减、乘、除、求余

2014-05-28

栈的实现顺序栈

栈的顺序栈形式,简易的实现,push() pop() top() size() empty()

2014-05-24

约瑟夫问题的静态链解法

这是约瑟夫问题的静态链解法,代码量少,易理解,是一种很好的思路

2014-05-24

单向循环链表解决约瑟夫问题

用单向循环链表解决约瑟夫问题。使用c++语言,结构体,链表的操作。

2014-05-12

线性表-单链表

单链表的类定义和类实现,常见操作,插入、删除。

2014-05-12

查找数组中第k大的数

给定一数组,查找数组中第k大的数。代码中借助快速排序中的partition方法来实现。

2016-01-08

字符串转化为整数

把一个字符串转化为相应的整数。特别注意符号与溢出的问题。

2016-01-06

单双精度浮点数解析.c

对于计算机中常见的浮点数存储格式进行分析,编程提取float和double中的阶码好尾码。

2015-12-16

printf的类模板实现.cpp

使用C++的类模板机制来简单实现库函数printf。

2015-12-16

LeetCode--Linked List.cpp

文件中包含了LeetCode中Tag为LinkedList的题目参考代码。

2015-12-14

LeetCode-Linked List.cpp

这是LeetCode中Linked List所有题目的参考代码。(截止到目前为止:2015年12月14日)。

2015-12-14

在同一段内存上存储不同类型的数据

使用malloc动态分配一段内存,在该段内存的首地址处的四字节下记录不同数据块的个数,使用合适的方式存入数据,并相应读取。

2015-06-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除