My Github

随笔分类 -  【012】计算机专业基础

数据结构与算法、操作系统原理、计算机网络原理、深入理解计算机系统...
摘要:前面几篇基础介绍之后,本篇我们来做几个指针的小案例。首先,实现一个方法“多个返回值”的效果:返回一个三位数数字的个位、十位、百位。这里,我们借助指针来”返回“分解后的结果。这种应用也是最常见的指针应用。其次,我们知道strlen是计算字符串的长度,其内部是通过判断是否以'\0'作为结束符,虽然其不是一个安全的方式,但是却是各大C教材中最常见的函数。这里,我们来自己实现一个strlen函数,利用指针的移动来辅助计算长度,这也是指针的一个最常见的应用。最后,实现判断一个字符串是否以另一个子子字符串结尾。 阅读全文
posted @ 2015-07-20 00:48 EdisonZhou 阅读(2626) 评论(0) 推荐(0) 编辑
摘要:如果在作用域内,变量以数组形式声明,则可以使用sizeof求数组大小,下面一段代码展示了如何使用sizeof。其中sizeof(nums)代表计算nums数组的总字节数,而sizeof(int)则代表计算int类型所占用的字节数(32位系统下是4个字节,64位下可能不同,因此这里使用sizeof(int)可以向程序员屏蔽这个差异),运行结果为: 阅读全文
posted @ 2015-07-19 16:17 EdisonZhou 阅读(4743) 评论(1) 推荐(0) 编辑
摘要:指针每次加一就是指针向前移动指针类型对应的字节数。下面通过一个int指针来指向一个int数组,看看指针的加法运算到底是个什么鬼?可以看到,指针的加法就是向前移动指定类型字节数,在数组中就是指向下一个元素。下面再来看看与加法相反的减法,仍然以上面的代码为例,新增一句:ptr--; 阅读全文
posted @ 2015-07-19 02:11 EdisonZhou 阅读(7966) 评论(2) 推荐(2) 编辑
摘要:At first,计算机中绝大部分数据都放到内存中的,不同的数据放到不同的内存区域中。But,内存角度没有数据类型,只有二进制;数据以字节(8位二进制)为单位存取。不同数据类型占据不同的字节,例如在32位系统中:int 为4个字节,short为2个字节(下面如未特殊声明,均为32为系统环境下的说明)。下面我们看看int类型、short类型和double类型的数字分别在内存中如何存储: 阅读全文
posted @ 2015-07-18 14:56 EdisonZhou 阅读(2240) 评论(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 阅读(2775) 评论(1) 推荐(2) 编辑
摘要:上面两篇我们了解了树的基本概念以及二叉树的遍历算法,还对二叉查找树进行了模拟实现。数学表达式求值是程序设计语言编译中的一个基本问题,表达式求值是栈应用的一个典型案例,表达式分为前缀、中缀和后缀三种形式。这里,我们通过一个四则运算的应用场景,借助二叉树来帮助求解表达式的值。首先,将表达式转换为二叉树,然后通过先序遍历二叉树的方式求出表达式的值。 阅读全文
posted @ 2015-07-17 00:38 EdisonZhou 阅读(3762) 评论(1) 推荐(7) 编辑
摘要:在上一篇中,我们了解了树的基本概念以及二叉树的基本特点和代码实现,还用递归的方式对二叉树的三种遍历算法进行了代码实现。但是,由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多。而且,如果递归深度太大,可能系统撑不住。因此,我们使用非递归(这里主要是循环,循环方法比递归方法快, 因为循环避免了一系列函数调用和返回中所涉及到的参数传递和返回值的额外开销)来重新实现一遍各种遍历算法,再对二叉树的另外一种特殊的遍历—层次遍历进行实现,最后再了解一下特殊的二叉树—二叉查找树。 阅读全文
posted @ 2015-07-14 01:55 EdisonZhou 阅读(3199) 评论(2) 推荐(11) 编辑
摘要:前面所讨论的线性表元素之间都是一对一的关系,今天我们所看到的结构各元素之间却是一对多的关系。树在计算机中有着广泛的应用,甚至在计算机的日常使用中,也可以看到树形结构的身影,如下图所示的Windows资源管理器和应用程序的菜单都属于树形结构。树形结构是一种典型的非线性结构,除了用于表示相邻关系外,还可以表示层次关系。本文重点讨论树与二叉树的基本结构和遍历算法等内容。 阅读全文
posted @ 2015-07-12 14:16 EdisonZhou 阅读(4516) 评论(0) 推荐(12) 编辑
摘要:在日常生活中,队列的例子比比皆是,例如在车展排队买票,排在队头的处理完离开,后来的必须在队尾排队等候。在程序设计中,队列也有着广泛的应用,例如计算机的任务调度系统、为了削减高峰时期订单请求的消息队列等等。与栈类似,队列也是属于操作受限的线性表,不过队列是只允许在一端进行插入,在另一端进行删除。在其他数据结构如树的一些基本操作中(比如树的广度优先遍历)也需要借助队列来实现,因此这里我们来看看队列。 阅读全文
posted @ 2015-07-05 10:27 EdisonZhou 阅读(2715) 评论(3) 推荐(9) 编辑
摘要:现实生活中的事情往往都能总结归纳成一定的数据结构,例如餐馆中餐盘的堆叠和使用,羽毛球筒里装的羽毛球等都是典型的栈结构。而在.NET中,值类型在线程栈上进行分配,引用类型在托管堆上进行分配,本文所说的“栈”正是这种数据结构。栈和队列都是常用的数据结构,它们的逻辑结构与线性表相通,不同之处则在于操作受某种特殊限制。因此,栈和队列也被称为操作受限的线性表。这里,我们首先来了解一下栈。 阅读全文
posted @ 2015-07-04 01:55 EdisonZhou 阅读(3260) 评论(3) 推荐(12) 编辑
摘要:在上一篇中,我们了解了单链表与双链表,本次将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表(circular linked list)。循环链表和单链表的主要差异就在于循环的判断条件上,原来是判断p.next是否为空,现在则是p.next不等于头结点,则循环未结束。本文还会使用循环链表以及.NET中内置的LinkedList解决约瑟夫问题。 阅读全文
posted @ 2015-07-03 01:05 EdisonZhou 阅读(2570) 评论(4) 推荐(11) 编辑
摘要:在上一篇中,我们学习了线性表最基础的表现形式-顺序表,但是其存在一定缺点:必须占用一整块事先分配好的存储空间,在插入和删除操作上需要移动大量元素(即操作不方便),于是不受固定存储空间限制并且可以进行比较快捷地插入和删除操作的链表横空出世,所以我们就来复习一下链表。 阅读全文
posted @ 2015-07-01 01:23 EdisonZhou 阅读(4604) 评论(10) 推荐(30) 编辑
摘要:线性表是最简单也是在编程当中使用最多的一种数据结构。例如,英文字母表(A,B,C,D...,Z)就是一个线性表,表中的每一个英文字母都是一个数据元素;又如,成绩单也是一个线性表,表中的每一行是一个数据元素,每个数据元素又由学号、姓名、成绩等数据项组成。顺序表和链表作为线性表的两种重要的存在形式,它们是堆栈、队列、树、图等数据结构的实现基础。线性表中的元素在位置上是有序的,类似于储户去银行排队取钱,人们依次排着队,排在前面的先取,排在后面的则后取。这种位置上的有序性就是一种线性关系。由此可以看出:线性表的前后两个元素存在一一对应关系。 阅读全文
posted @ 2015-06-23 00:40 EdisonZhou 阅读(8964) 评论(14) 推荐(56) 编辑