My Github
上一页 1 ··· 18 19 20 21 22 23 24 25 26 ··· 28 下一页
摘要: 图的“多对多”特性使得图在结构设计和算法实现上较为困难,这时就需要根据具体应用将图转换为不同的树来简化问题的求解。对于一个无向图,含有连通图全部顶点的一个极小连通子图成为生成树(Spanning Tree)。其本质就是从连通图任一顶点出发进行遍历操作所经过的边,再加上所有顶点构成的子图。如果连通图是一个带权的网络,称该网络的所有生成树中权值综合最小的生成树为最小生成树(Minimum Spanning Tree,MST),简称MST生成树。 阅读全文
posted @ 2015-07-29 01:05 EdisonZhou 阅读(7820) 评论(4) 推荐(5) 编辑
摘要: 上一篇我们了解了图的基本概念、术语以及存储结构,还对邻接表结构进行了模拟实现。本篇我们来了解一下图的遍历,和树的遍历类似,从图的某一顶点出发访问图中其余顶点,并且使每一个顶点仅被访问一次,这一过程就叫做图的遍历(Traversing Graph)。如果只访问图的顶点而不关注边的信息,那么图的遍历十分简单,使用一个foreach语句遍历存放顶点信息的数组即可。但是,如果为了实现特定算法,就必须要根据边的信息按照一定的顺序进行遍历。图的遍历算法是求解图的连通性问题、拓扑排序和求解关键路径等算法的基础。 阅读全文
posted @ 2015-07-27 00:50 EdisonZhou 阅读(4608) 评论(2) 推荐(4) 编辑
摘要: 前面几篇已经介绍了线性表和树两类数据结构,线性表中的元素是“一对一”的关系,树中的元素是“一对多”的关系,本章所述的图结构中的元素则是“多对多”的关系。图(Graph)是一种复杂的非线性结构,在图结构中,每个元素都可以有零个或多个前驱,也可以有零个或多个后继,也就是说,元素之间的关系是任意的。现实生活中的很多事物都可以抽象为图,例如世界各地接入Internet的计算机通过网线连接在一起,各个城市和城市之间的铁轨等等。 阅读全文
posted @ 2015-07-25 14:52 EdisonZhou 阅读(5068) 评论(0) 推荐(14) 编辑
摘要: 一个由C/C++编译的程序占用的内存分为以下几个部分:1、栈区(stack):又编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构的栈。2、堆区(heap):一般是由程序员分配释放,若程序员不释放的话,程序结束时可能由OS回收,值得注意的是他与数据结构的堆是两回事,分配方式倒是类似于数据结构的链表。 阅读全文
posted @ 2015-07-23 01:07 EdisonZhou 阅读(19254) 评论(3) 推荐(14) 编辑
摘要: void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据。和用int表示指针异曲同工,只是更明确是“指针”。因此void*只能表示一个地址,不能用来&取值,也不能++--移动指针,因此不知道多少字节是一个数据单位。从输出结果可以看出,无论是无类型的void指针还是int类型指针,指向的地址都是一样的: 阅读全文
posted @ 2015-07-22 01:30 EdisonZhou 阅读(6685) 评论(1) 推荐(8) 编辑
摘要: 当我们创建一个内存区域的时候,内存中的数据可能是乱七八糟的(可能是其他代码用过后遗留的数据),如下面一段代码.其运行结果是如下图所示的乱码,因为printf的%s是“打印一直遇到'\0'”。那么,如何解决上面我们有可能会访问的脏内存区域呢?在C语言中,可以采用如下的两种方法:(1)使用memset函数首先清理一下内存;(2)使用初始化填充0; 阅读全文
posted @ 2015-07-21 00:57 EdisonZhou 阅读(4951) 评论(2) 推荐(5) 编辑
摘要: 前面几篇基础介绍之后,本篇我们来做几个指针的小案例。首先,实现一个方法“多个返回值”的效果:返回一个三位数数字的个位、十位、百位。这里,我们借助指针来”返回“分解后的结果。这种应用也是最常见的指针应用。其次,我们知道strlen是计算字符串的长度,其内部是通过判断是否以'\0'作为结束符,虽然其不是一个安全的方式,但是却是各大C教材中最常见的函数。这里,我们来自己实现一个strlen函数,利用指针的移动来辅助计算长度,这也是指针的一个最常见的应用。最后,实现判断一个字符串是否以另一个子子字符串结尾。 阅读全文
posted @ 2015-07-20 00:48 EdisonZhou 阅读(2612) 评论(0) 推荐(0) 编辑
摘要: 如果在作用域内,变量以数组形式声明,则可以使用sizeof求数组大小,下面一段代码展示了如何使用sizeof。其中sizeof(nums)代表计算nums数组的总字节数,而sizeof(int)则代表计算int类型所占用的字节数(32位系统下是4个字节,64位下可能不同,因此这里使用sizeof(int)可以向程序员屏蔽这个差异),运行结果为: 阅读全文
posted @ 2015-07-19 16:17 EdisonZhou 阅读(4696) 评论(1) 推荐(0) 编辑
摘要: 指针每次加一就是指针向前移动指针类型对应的字节数。下面通过一个int指针来指向一个int数组,看看指针的加法运算到底是个什么鬼?可以看到,指针的加法就是向前移动指定类型字节数,在数组中就是指向下一个元素。下面再来看看与加法相反的减法,仍然以上面的代码为例,新增一句:ptr--; 阅读全文
posted @ 2015-07-19 02:11 EdisonZhou 阅读(7622) 评论(2) 推荐(2) 编辑
摘要: At first,计算机中绝大部分数据都放到内存中的,不同的数据放到不同的内存区域中。But,内存角度没有数据类型,只有二进制;数据以字节(8位二进制)为单位存取。不同数据类型占据不同的字节,例如在32位系统中:int 为4个字节,short为2个字节(下面如未特殊声明,均为32为系统环境下的说明)。下面我们看看int类型、short类型和double类型的数字分别在内存中如何存储: 阅读全文
posted @ 2015-07-18 14:56 EdisonZhou 阅读(2219) 评论(0) 推荐(2) 编辑
摘要: GCC(GNU Compiler Collection)是一套功能强大、性能优越的编程语言编译器,它是GNU计划的代表作品之一。GCC是Linux平台下最常用的编译器,GCC原名为GNU C Compiler,即GNU C语言编译器,随着GCC支持的语言越来越多,它的名称也逐渐变成了GNU Compiler Collection。下面对GCC的基本使用方法进行介绍。这里我们主要使用Windows系统进行C程序的开发调试,所以我们选择GCC for Windows版本的编译器。 阅读全文
posted @ 2015-07-18 13:21 EdisonZhou 阅读(2748) 评论(1) 推荐(2) 编辑
摘要: 上面两篇我们了解了树的基本概念以及二叉树的遍历算法,还对二叉查找树进行了模拟实现。数学表达式求值是程序设计语言编译中的一个基本问题,表达式求值是栈应用的一个典型案例,表达式分为前缀、中缀和后缀三种形式。这里,我们通过一个四则运算的应用场景,借助二叉树来帮助求解表达式的值。首先,将表达式转换为二叉树,然后通过先序遍历二叉树的方式求出表达式的值。 阅读全文
posted @ 2015-07-17 00:38 EdisonZhou 阅读(3679) 评论(1) 推荐(7) 编辑
摘要: 在上一篇中,我们了解了树的基本概念以及二叉树的基本特点和代码实现,还用递归的方式对二叉树的三种遍历算法进行了代码实现。但是,由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多。而且,如果递归深度太大,可能系统撑不住。因此,我们使用非递归(这里主要是循环,循环方法比递归方法快, 因为循环避免了一系列函数调用和返回中所涉及到的参数传递和返回值的额外开销)来重新实现一遍各种遍历算法,再对二叉树的另外一种特殊的遍历—层次遍历进行实现,最后再了解一下特殊的二叉树—二叉查找树。 阅读全文
posted @ 2015-07-14 01:55 EdisonZhou 阅读(3154) 评论(2) 推荐(11) 编辑
摘要: 前面所讨论的线性表元素之间都是一对一的关系,今天我们所看到的结构各元素之间却是一对多的关系。树在计算机中有着广泛的应用,甚至在计算机的日常使用中,也可以看到树形结构的身影,如下图所示的Windows资源管理器和应用程序的菜单都属于树形结构。树形结构是一种典型的非线性结构,除了用于表示相邻关系外,还可以表示层次关系。本文重点讨论树与二叉树的基本结构和遍历算法等内容。 阅读全文
posted @ 2015-07-12 14:16 EdisonZhou 阅读(4431) 评论(0) 推荐(12) 编辑
摘要: 最近看了看一个C#游戏开发的公开课,在该公开课中使用面向对象思想与Unity3D游戏开发思想结合的方式,对一个简单的赛车游戏场景进行了实现。原本在C#中很方便地就可以完成的一个小场景,使用Unity3D的设计思想(即一切游戏对象皆空对象,拖拽组件才使其具有了活力)来实现却需要花费大量时间与精力,究竟它神奇在什么地方?本文通过实现这个小例子来看看。 阅读全文
posted @ 2015-07-08 01:23 EdisonZhou 阅读(12857) 评论(2) 推荐(4) 编辑
摘要: 在日常生活中,队列的例子比比皆是,例如在车展排队买票,排在队头的处理完离开,后来的必须在队尾排队等候。在程序设计中,队列也有着广泛的应用,例如计算机的任务调度系统、为了削减高峰时期订单请求的消息队列等等。与栈类似,队列也是属于操作受限的线性表,不过队列是只允许在一端进行插入,在另一端进行删除。在其他数据结构如树的一些基本操作中(比如树的广度优先遍历)也需要借助队列来实现,因此这里我们来看看队列。 阅读全文
posted @ 2015-07-05 10:27 EdisonZhou 阅读(2625) 评论(3) 推荐(9) 编辑
摘要: 现实生活中的事情往往都能总结归纳成一定的数据结构,例如餐馆中餐盘的堆叠和使用,羽毛球筒里装的羽毛球等都是典型的栈结构。而在.NET中,值类型在线程栈上进行分配,引用类型在托管堆上进行分配,本文所说的“栈”正是这种数据结构。栈和队列都是常用的数据结构,它们的逻辑结构与线性表相通,不同之处则在于操作受某种特殊限制。因此,栈和队列也被称为操作受限的线性表。这里,我们首先来了解一下栈。 阅读全文
posted @ 2015-07-04 01:55 EdisonZhou 阅读(3208) 评论(3) 推荐(12) 编辑
摘要: 在上一篇中,我们了解了单链表与双链表,本次将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表(circular linked list)。循环链表和单链表的主要差异就在于循环的判断条件上,原来是判断p.next是否为空,现在则是p.next不等于头结点,则循环未结束。本文还会使用循环链表以及.NET中内置的LinkedList解决约瑟夫问题。 阅读全文
posted @ 2015-07-03 01:05 EdisonZhou 阅读(2523) 评论(4) 推荐(11) 编辑
摘要: 在上一篇中,我们学习了线性表最基础的表现形式-顺序表,但是其存在一定缺点:必须占用一整块事先分配好的存储空间,在插入和删除操作上需要移动大量元素(即操作不方便),于是不受固定存储空间限制并且可以进行比较快捷地插入和删除操作的链表横空出世,所以我们就来复习一下链表。 阅读全文
posted @ 2015-07-01 01:23 EdisonZhou 阅读(4530) 评论(10) 推荐(29) 编辑
摘要: 线性表是最简单也是在编程当中使用最多的一种数据结构。例如,英文字母表(A,B,C,D...,Z)就是一个线性表,表中的每一个英文字母都是一个数据元素;又如,成绩单也是一个线性表,表中的每一行是一个数据元素,每个数据元素又由学号、姓名、成绩等数据项组成。顺序表和链表作为线性表的两种重要的存在形式,它们是堆栈、队列、树、图等数据结构的实现基础。线性表中的元素在位置上是有序的,类似于储户去银行排队取钱,人们依次排着队,排在前面的先取,排在后面的则后取。这种位置上的有序性就是一种线性关系。由此可以看出:线性表的前后两个元素存在一一对应关系。 阅读全文
posted @ 2015-06-23 00:40 EdisonZhou 阅读(8780) 评论(14) 推荐(56) 编辑
上一页 1 ··· 18 19 20 21 22 23 24 25 26 ··· 28 下一页