自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 问答 (4)
  • 收藏
  • 关注

原创 红黑树详解

红黑树是具有下列着色性质的二叉查找树:1.每一个节点或者着红色,或者着黑色。2.根是黑色的。3.如果一个节点是红色的,那么它的子节点必须是黑色。4.从一个节点到一个NULL指针的每一条路径必须包含相同数目的黑色节点。下面是一棵红黑树。1.自底向上插入通常把新项作为树叶放到树中。如果我们把该项涂成黑色,那么违反条件4,因为将会建立一条更长的

2017-07-22 14:02:01 2533 5

原创 B+tree详解及实现(C语言)

1 什么是B+tree如果你还不了解B-tree,那么请自行了解。可以参考我的这篇帖子---B-tree详解及实现。B+tree是B-tree的一个变种:在B-tree的基础上,为叶子节点增加链表指针,而且所有的关键字都在叶子节点中出现,且数据只存储在叶子节点中。非叶子节点的关键字仅作为叶子节点的索引。下图是一棵B+tree。B+tree 的插入和删除基本和B-tree一样,只是多了数据结构多了next字段,所以要注意。

2017-08-11 18:01:28 20906 13

原创 B-tree详解及实现(C语言)

M阶的B-tree是一棵具有下列结构特性的树:(1)树的根或者是一片树叶,或者其儿子树在2到M之间。(2)除根外,所有非树叶节点的儿子数在[M/2]到M之间。(符号[]表示向上取整)(3)所有树叶都在相同的深度上。所有的数据都存储在树叶上。也有把数据存储在内部节点的,但我这里选择前者,内部节点只是用来索引。在每一个内部节点上皆含有指向该节点各个儿子的指针P1,P2.

2017-08-05 10:54:08 11010 6

原创 伸展树详解及实现(C语言)

1.什么是伸展树简单的说,伸展树是一棵二叉查找树,对每个节点的访问,都要将该节点通过旋转操作,把它翻转到根处。然后进行操作。下图是访问关键字1的过程(自底向上翻转)。可以看到伸展的效果可以让树的深度变小了,这是伸展树的好处所在。另外,当执行其他操作,如插入和删除,也要先进行类似的伸展。2.自顶向下伸展树前面简单地说明自底向上的伸展方式,下面要详细介绍

2017-07-27 10:29:05 2631

原创 栈应用之简易计算器算法的原理及实现(C语言)

1.后缀表达式a * b上面表达式称为中缀表达式,其特点是操作符位于中间位置(仅一个操作符)。a b *上面表达式称为后缀表达式,其特点是操作符位于后面位置(仅一个操作符)。计算器算法的原理是将中缀表达式转换为后缀表达式,然后进行计算。我们在下一章节对中缀转后缀进行介绍。表达式:6*(5+(2+3)*8+3)其后缀表达式为:6 5 2 3 +

2017-07-25 17:52:44 8530

原创 图论算法之最短路径(有向无权图)

1.算法介绍下图是一个无权图G。使用某个顶点s作为输入参数,我们想要找出从s到所有其他顶点的最短路径。设我们选择s为v2.此时立刻可以说出从s到v2的最短路径长为0的路径。把这个信息做个标记。如下图。现在我们可以开始找寻所有与s距离为1的顶点。这些顶点通过考查与s邻接的那些顶点可以找到。此时我们看到,v0和v5与s出发只有一步之遥。标记如下。

2017-06-12 02:40:00 1973

原创 图论算法之最短路径(Dijkstra算法)

1 算法介绍如果图是有向赋权图,那么问题将比无权图困难。Dijkstra算法向无权图最短路径算法一样。按阶段进行。在每一个阶段,Dijkstra算法选择一个顶点v。它在所有未知顶点中具有最小距离的dist,同时算法声明从s到v的最短路径是已知的。阶段的其余更新邻接点的信息。表1表示初始配置。假设开始s是v0。第一个选择的顶点是v0.路径长0.该顶点标记为已知。既

2017-06-12 02:34:51 564

原创 图论算法之最短路径(具有负边值的图)

1 算法介绍如果图具有负边值,那么Dijkstra算法行不通。但是把赋权的和无权的算法结合起来将会解决这个问题。开始,我们把s放到队列中。然后,在每个阶段我们让一个顶点出队。找出所有与v邻接的顶点w,使得dw > dv + cvw。然后更新dw和pw,并在w不在队列中的时候把它放到队列中。2 算法实现//// main.c// WeightedNegative///

2017-06-12 02:22:57 1563

原创 优先队列之二项队列

1 二项队列的结构二项队列不同于我们已经看到的所有优先队列的实现之处在于,一个二项队列不是一棵堆序的树,而是堆序树的集合,成为森林。堆序树的每一棵树都是有约束的形式,叫做二项树。每一个高度至多存在一棵二项树。高度为0的二项树是一棵单节点树;高度为k的二项树Bk通过一棵二项树BK-1附接到另一棵二项树Bk-1的根上而构成。如下图,B0,B1,B2,B3,B4皆为二项树。而它们合起来就是二项队

2017-06-05 15:26:11 840

原创 优先队列之左式堆

1.左式堆的性质我们把任一节点X的零路径长(null path length,NPL)Npl(X)定义为从X到一个没有两个儿子的节点的最短路径的长。因此,具有0个或1个儿子的节点的Npl为0,而Npl(NULL) = -1。左式堆性质是:对于堆中的每一个节点X,左儿子的零路径长至少与右儿子的零路径长一样大。下图左边是左式堆,右边不是。2.左式堆的操作(1)合并

2017-06-05 13:10:51 530 1

原创 排序(希尔排序,堆排序,归并排序,快速排序)

1.希尔排序1.1 算法希尔排序(shell-sort)使用一个序列h1,h2,...,ht,叫做增量序列。只要h1 = 1,任何增量序列都是可行的。在使用增量hk的一趟排序之后,对于每一个i都有A[i] ≤ A[i + hk]。所有相隔hk的元素都被排序。此时称文件是hk-排序。直到h1排序完成,排序完成。1.2 增量的序列增量序列的选择极大的影响了希尔算法的效率。

2017-06-03 19:48:26 812

原创 排序(冒泡,选择,插入)

1.冒泡排序1.1算法冒泡排序(buddle-sort)算法的运作如下:(从后往前)比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。1.2 实现

2017-06-03 19:41:34 329

原创 优先队列之二叉堆

1.优先队列简介1.1模型优先队列是允许至少下列两种操作的数据结构:Insert(插入),它的工作是显而易见的,以及DeleteMin(删除最小者),它的工作是找出、返回和删除优先队列中最小的元素。Insert操作等价于Enqueue(入队),而DeleteMin则是队列中的Dequeue(出队)在优先队列中的等价操作。优先队列的基本模型如下图。1.2 一些简单的实现

2017-06-02 01:20:00 611

原创 AVL树

AVL树是带有平衡条件的二叉查找树。主要的一种AVL树是这样一种树:它带有平衡条件,它的每个节点的左子树和右子树的的高度最多相差1。下面左边的树是AVL树,右边不是,因为7的左右子树的高度相差大于1。当一个节点插入破坏了某个点的平衡。我们假设这个点是a。可能有下面有下面四种情况破坏了平衡。1.对a的左儿子的左子树进行一次插入。2.对a的左儿子的右子树进行一次插入。

2017-05-29 01:16:01 486

原创 经典抽象数据类型

《C与指针》读书笔记1. 内存分配所有的ADT都必须确定一件事情——如何获取内存来存储值。有三种可选的方案:静态数组、动态数组、动态链式结构。2 堆栈堆栈这种数据最鲜明的特点就是其后进先出(Last-In First-Out)的方式。2.1 堆栈接口堆栈基本的操作通常被称为push和pop。push就是把一个新值压入到堆栈的顶部。pop就是把堆栈顶部的值移出堆栈

2017-05-24 01:20:33 761

原创 标准函数库

《C与指针》读书笔记1 整型函数1.1 算术int abs(int value);long int labs(long int value);div_t div(int numerator,denominator);ldiv_t ldiv(long int numer,long int denom);abs函数返回它的参数的绝对值。labs用

2017-05-24 01:19:45 362

原创 输入输出函数

《C与指针》读书笔记1. 错误报告void perror(char const *message);perror函数以一种简单、同一的方式报告错误。2.终止执行void exit(int status);它用于终止一个程序。预定义的符号EXIT_SUCCESS和EXIT_FAILURE分别代表程序的终止时成功还是失败。3 标准I/O函数库AN

2017-05-24 01:19:03 287

原创 预处理器

《C与指针》读书笔记1. 预定义符号符号样例值含义__FILE__“name.c”进行编译的源文件名__LINE__25文件当前的行号__DATE__“Jan 31 1997”文件被编译的日期__TIME__“18:04:30”文件被编译的时间__

2017-05-24 01:18:23 268

原创 高级指针

《C与指针》读书笔记1.进一步探讨指向指针的指针int i;int *pi = &i;int **ppi = π它们在内存中的表示如下:pi是int*类型的指针,指向i。ppi是int**类型的指针,指向pi。2. 高级声明从简单的声明开始,由浅及深了解高级声明。(1)int f;一个整形变量。(2)in

2017-05-24 01:17:08 272

原创 使用结构和指针

《C与指针》读书笔记1.链表链表就是一些包含数据的独立数据结构(节点)的集合。链表中的每个节点通过链或指针连接起来。2.单链表typedef struct NODE {struct NODE *link;int value;}链表中的每个节点都有一个指向它的指针。对于第一个节点,这个指针是根指针。对于其他节点,这个指针是前一个节点的link字

2017-05-24 01:13:17 310

原创 动态内存分配

《C与指针》读书笔记1.为什么使用动态内存分配数组在使用的时候可能造成内存浪费,使用动态内存分配可以解决这个问题。2. malloc和freeC函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放。(1)void *malloc(size_t size);malloc的参数就是需要分配的内存字节数。malloc分配一块连续的内存。如果

2017-05-24 01:12:20 306

原创 结构和联合

《C与指针》读书笔记1.结构基础知识结构是一些值的集合,这些值成为它的成员。1.1 结构声明struct tag {member-list} varialbe-list;下面是结构的声明示例:(1)简单声明struct {int a;char b;float c;} x;(2)使用tag。struct

2017-05-24 01:06:20 369

原创 字符串、字符、字节

《C与指针》读书笔记1.字符串基础字符串就是一串零个或多个字符,并且以一个位模式为0的NUL字节结尾。NUL字节是字符串的终止符,但它本身不是字符串的一部分,所以字符串的长度不包括NUL字节。2.字符串长度size_t strlen(char const *string);3.不受限制的字符串函数3.1 复制字符串char *strcpy(char *dst

2017-05-24 01:05:46 601

原创 数组

《C与指针》读书笔记1.一维数组1.1 数组名在C中,在几乎所有使用数组名的表达式中,数组名的值是一个指针常量,也就是数组第一个元素的地址。但是数组和指针并不是相同的。数组具有确定数量的元素,而指针只是一个标量值。编译器用数组名来记住这些属性。只有当数组名在表达式中使用时,编译器才会为它产生一个指针常量。只有在两个场合下,数组名并不用指针常量来表示——就是当数组名作

2017-05-24 01:00:48 318

原创 函数

《C与指针》读书笔记1.函数的定义函数的定义就是函数体的实现。函数体就是一个代码块,它在函数被调用时执行。函数的定义语法如下:类型 函数名(形式参数)代码块return语句当执行流到达函数定义的末尾时,函数就将返回,也就是说,执行流返回到函数被调用的地方。return语句允许你从函数体的任何位置返回,并不一定要在函数体的末尾。它的语法如下所示:

2017-05-24 00:58:31 383

原创 指针

《C与指针》读书笔记1.内存与地址在计算机中,最小的存储单位是一个字节,一个字节由八个bit组成,可以存储无符号值0到255。在计算机内存中每一个字节都用一个地址来标记它的位置。如下图所示标记一段内存,从100到107八个字节。图1为了存储更大的值,我们把两个或更多的字节合在一起作为一个更大的内存单位。下图的一个存储单位大小为4个字节。可以容纳无符号整数的范围是

2017-05-23 23:50:49 328

原创 操作符与表达式

《C与指针》读书笔记1.操作符1.1算术操作符+ - * / %1.2 移位操作符>> : 右移位有两种方案(1)逻辑移位左边移入的位用0填充。(2)算术移位左边移入的位由原来的符号位决定,符号位为1则移入的为均为1,符号位为0则移入的符号位均为0。1.3 位操作符&:AND操作 两个位都是1,结果为1,否则结果为0。

2017-05-23 23:46:28 304

原创 语句

《C与指针》读书笔记1.空语句C最简单的语句是空语句,它只包含一个分号“;”。2.表达式语句在一个表达式后面加上一个分号,就可以把表达式转变成语句。x = y + 3;下面的语句也是完全合法的y + 3;当改语句被执行时,表达式被求值,但它的结果并不保存在任何地方。3.代码块代码块就是位于一对花括号之内的可选的声明和语句列表。代码

2017-05-23 23:45:20 252

原创 数据

本章节描述C语言中的数据,包括数据的基本类型,作用域,链接属性,存储类型。1.基本数据类型在C语言中有四种基本数据类型:整形,浮点型,指针,聚合类型1.1 整形整形包括字符、短整形、整形、长整形,它们都分为有符号和无符号。整形的类型与最小范围如下表类型最小范围char0 ~ 127signed char-127

2017-05-14 16:23:57 245

空空如也

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

TA关注的人

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