ping命令   Linux系统ping命令是常用的网络命令,用来测试网络的连通性,向网络上的主机发送应答请求,根据响应信息可以判断远程主机是否可用 。ping命令通过将 icmp 回显数据包发送到计算机并侦听回显回复数据包来验证与一台或多台远程计算机的连接,该命令只有在安装了 tcp/ip 协议后才可以使用。通常我们打不开网页时就会说”ping 一下”。 语法: ping [参数] [主机名或ip地址] 参数说明: -a 将地址解析为计算机名。 -d 使用Socket的SO_DEBUG功能。 -c<完成次数> 设置完成要求回应的次数。 -f 极限检测。 -i<间隔秒数> 指定收发信息的间隔时间。 -I<网络界面> 使用指定的网络界面送出数据包。 -l<前置载入> 设置在送出要求信息之前,先行发出的数据包。 -n 只输出数值。 -p<范本样式> 设置填满数据包的范本样式。 -q 不显示指令执行过程,开头和结尾的相关信息除外。 -r 忽略普通的Routing Table,直接将数据包送 继续阅读 >>


杜肖孟 16/10/20 17:51:23
运算符重载的概念和语法 重载,就是赋予新的含义,运算符重载和函数重载类似,同一个运算符可以有不同的功能。 运算符重载的方式就是定义一个函数,在函数体内实现想要的功能,当用到该运算符时,编译器就会自动调用这个函数。也就是说,运算符重载就是通过函数定义实现的,它本质上是函数重载。 返回值类型 operator 运算符名称(形参列表){ //TODO; } operator是关键字,专门用于定义重载运算符的函数。 重载运算符的规则: 1):并不是所有运算符都可以重载。例如长度运算符(sizeof)、条件运算符(: ?)、成员选择符(.)、对象选择符(.*)、域解析符(::)不能被重载。 2):重载不能改变运算符的优先级和结合性。 3):重载不会改变运算符的用法。例如"+"号总是出现在两个操作数之间。 4):重载运算符的函数不能有默认的参数,否则就改变了运算符操作数的个数,显然是错误的。 下面的代码定义了一个复数类,通过运算符重载,用”+”号实现了复数的加法。 /************************************ 继续阅读 >>


杜肖孟 16/10/20 14:40:11
何为二叉堆? 二叉堆是一种特殊的堆,二叉堆是完全二叉树或者近似完全二叉树。二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左右子树都是一个二叉堆。 当父节点的键值总是大于或等于任何一个子节点的键值时为最大堆(大顶堆)。 当父节点的键值总是小于或等于任何一个子节点的键值时为最小堆(小顶堆)。 根据二叉树的性质,可得: 1. 如果根节点在数组的位置是1,第n个位置的子节点分别在2n和2n+1,第n个位置的双亲节点在[i/2]。因此,第1个位置的子节点在2和3。 2. 如果根节点在数组的位置是0,第n个位置的子节点分别在2n+1和2n+2,第n个位置的双亲节点在[(i-1)/2]。因此,第0个位置的子节点在1和2。 二叉堆一般用数组来表示,得益于数组的随机存储能力,我们能够很快确定堆中节点的父节点和子节点。 在本文中,我们主要介绍大顶堆的C++模板实现过程,以根节点在0位置存储为例。 二叉堆的具体实现 1. 二叉堆的抽象数据类型 /*大顶堆类定义*/ template <typename T> 继续阅读 >>


杜肖孟 16/10/15 17:21:53
何为二叉查找树? 二叉查找树也称为二叉搜索树或二叉排序树。二叉排序树的节点包含键值key。二叉排序树或者是一棵空树,否则要求: 1.若它的左子树不为空,那么左子树上所有节点的key都小于根节点的key 2.若它的右子树不为空,那么右子树上所有节点的key都大于根节点的key 3.它的左右子树也分别为二叉排序树 从定义得,二叉查找树中没有重复key值的节点。 二叉查找树的构建 节点结构 template <typename T> struct BSNode { //初始化 只赋予权值 BSNode(T t):value(t),lchild(NULL),rchild(NULL) {} //BSNode() = default; T value; //节点的值 BSNode<T>* lchild; //左孩子 BSNode<T>* rchild; //右孩子 BSNode<T>* parent; //节点的 继续阅读 >>


杜肖孟 16/10/14 19:09:43
  哈夫曼树又称最优二叉树,是带权路径长度最短的树,可用来构造最优编码,用于信息传输、数据压缩等方面,是一种应用广泛的二叉树。 几个相关的基本概念: 1.路径:从树中一个结点到另一个结点之间的分支序列构成两个节点间的路径 2.路径长度:路径上的分支的条数称为路径长度 3.树的路径长度:从树根到每个结点的路径长度之和称为树的路径长度 4.结点的权:给树中结点赋予一个数值,该数值称为结点的权 5.带权路径长度:结点到树根间的路径长度与结点的权的乘积,称为该结点的带权路径长度 6.树的带权路径长度:树中所有叶子结点的带权路径长度之和,通常记为WPL 7.最优二叉树:在叶子个数n以及各叶子的权值确定的条件下,树的带权路径长度WPL值最下的二叉树称为最优二叉树。 哈夫曼树的建立 由哈夫曼最早给出的建立最优二叉树的带有一般规律的算法,俗称哈夫曼算法。描述如下: 1):初始化:根据给定的n个权值(W1,W2,…,Wn),构造n棵二叉树的森林集合F={T1,T2,…,Tn},其中每棵二叉树Ti只有一个权值为Wi的根节点,左右子树均为空。 继续阅读 >>


杜肖孟 16/10/13 17:46:55
何为队列? 队列(Queue)也是一种线性存储结构,它具有如下特点: 队列中的数据元素遵守“先进先出”(First In First Out)的原则,简称FIFO结构。 在队尾添加元素,在对首删除元素。 队列的相关概念与操作 1.对头与队尾:允许元素插入的一端称为队尾,允许删除元素的一端称为对首。 2.入队:队列的插入操作。 3.出队:队列的删除操作。 4.求队列的大小 5.求对首元素的值 6.判断队列是否为空 栈是一种线性结构,能以数组或链表作为底层数据结构来实现。 基于数组的队列实现 以数组做为底层数据结构时,一般将队列实现为循环队列。这是因为: 1.如果采用顺序存储,每次从数组头部删除元素后,其后的元素都要依次往前移一个位置,时间复杂度为O(n); 2.对于上述问题,有人提议将对首标志往后移就不用移动元素了,可是这回造成空间的浪费。 所以为了实现队列的插入删除都是O(1)的时间复杂度,同时不造成空间的流失,我们采用循环队列。 何为循环队列? 即把数组看成一个首尾相连的圆环,删除元素时将队首标志往后移动,添加元素时若数组尾部 继续阅读 >>


杜肖孟 16/10/11 22:46:10
何为栈? 栈(Stack)是一种线性存储结构,它具有如下特点: 栈中的数据元素遵守“先进后出”(First In Last Out)的原则,简称FILO结构。 限定只能在栈顶进行插入和删除操作。 栈的相关概念与操作 1.栈顶与栈底:允许元素插入与删除的一端称为栈顶,另一端称为栈底。 2.压栈:栈的插入操作,叫做进栈,也称压栈、入栈。 3.弹栈:栈的删除操作,也叫做出栈。 4.求栈的大小 5.求栈顶元素的值 6.判断栈是否为空 ps:压栈的过程中,栈顶为位置一直在向上移动,而栈底是固定不变的。 类似,弹栈的过程中,栈顶为位置一直在向上移动,而栈底是固定不变的。 栈是一种线性结构,能以数组或链表作为底层数据结构来实现。 基于数组的栈实现 通常以数组头为栈底,数组尾为栈顶。 /*栈的抽象数据类型*/ template <typename T> class ArrayStack { public: //初始化,指定模拟栈的容量 和 目前大小 ArrayStack(int s,int a=0):maxsi 继续阅读 >>


杜肖孟 16/10/11 15:58:22
普通指针   C、C++没有自动内存回收机制,程序员需要手动释放,如果忘记则会导致内存泄露,另外普通指针存在悬垂指针的问题。 何为悬垂指针?   当有多个指针指向同一个对象时,如果某个指针delete了该对象,对这个指针来说它是明确了它所指的对象被释放了,所以它不会再对此对象进行操作,但是对于剩下的其他指针来说呢?它们还傻傻地指向已经被删除的对象,并随时准备对它进行操作,于是悬垂指针就形成了。 /************************************************************************* > File Name: 悬垂指针.cpp > Author: Tanswer_ > Mail: 98duxm@gmail.com > Created Time: 2016年10月10日 星期一 19时33分44秒 ********************************************************************** 继续阅读 >>


杜肖孟 16/10/10 22:46:29
如果派生类和基类中的成员相同,会发生什么情况呢?   如果派生类和基类的成员变量或者成员函数相同,那么就会遮蔽从基类继承来的成员函数或者成员变量,即使用新增的成员变量,而不是使用继承来的。 /************************************************************************* > File Name: 继承_名字遮蔽.cpp > Author: Tanswer_ > Mail: 98duxm@gmail.com > Created Time: 2016年10月05日 星期三 17时50分36秒 ************************************************************************/ #include <iostream> #include <string> #include <algorithm> #include <vector&g 继续阅读 >>


杜肖孟 16/10/08 15:28:43
何为继承? 继承是类与类之间的关系,与现实世界的继承类似。被继承的类称为父类或基类,继承的类称为子类或派生类。例如类B继承于类A,那么B拥有A的成员变量和成员函数。 派生类除了拥有基类的成员还可以定义自己的新成员。 使用继承的场景: 1.要创建的新类与已有的类类似,只是多出几个成员变量或者成员函数 2.当要创建多个类,它们拥有很多类似的成员变量或者成员函数时,可以把这些类共同的成员提取出来,定义一个基类,然后由基类继承。 声明派生类的语法: class 派生类名 : [继承方式] 基类名 { 派生类新增加的成员 } ; 来举个继承的小实例 /************************************************************************* > File Name: 继承1.cpp > Author: Tanswer_ > Mail: 98duxm@gmail.com > Created Time: 继续阅读 >>


杜肖孟 16/10/07 17:03:38