摘要:今天来讨论下C/C++中的预处理。预处理(1)概念:预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理的编程语言一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分进行处理,处理完毕自动进入对源程序的编译。处理预处理语句的程序称为预处理程序,也就是常说的预处理器,它包含在编译器中。预处理程序首先读源文件。预处理的输出是“翻译单元”,它是存放在内存听临时文件。编译器接受预处理的输出,并把源代码化成包含机器语言指令的目标文件。 预处理器的作用是通过预处理的内建功能对一个资源进行等价替换。(2)常见的预处理:文件包.
阅读全文
摘要:今天讨论下数据结构中的排序算法。排序算法的相关知识:(1)排序的概念:所谓排序就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。(2)稳定的排序方法:在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的。相反,如果发生改变,这种排序方法不稳定。(3)排序算法的分类(分为5类):插入排序、选择排序、交换排序、归并排序和分配排序。(4)排序算法两个基本操作:<1>比较关键字的大小。 <2>改变指向记录的指针或移动记录本身。具体的排序方法:插入排序<1>插入排序(Insertion
阅读全文
摘要:接着上节讲数据结构中的树,要理解树,最重要的是要理解:二叉排序树、平衡二叉树和红黑树。今天就来讨论这几种树。二叉排序树 概念:二叉排序树又叫二叉查找树、二叉搜索树、二叉检索树。二叉排序树是二叉树的一个特化,二叉排序树规定了每个结点的关键字均大于其左子树上所有的结点的关键字,同时小于或等于其右子树上所有结点的关键字。所以,从二叉排序树的根结点一直往左走,直到底,就可以得到最小值;从根结点一起往右走,直到底,就可以得到最大值。二叉排序树的这种特殊性质使得它在查找元素方面的时候特别方便,每一次查找都可以去掉一半的元素,因此查找的时间是O(logN)。二叉排序树的算法:(1)二叉排序树的查找算法typ
阅读全文
摘要:树是数据结构中很重要的一环,更是C/C++高手的挚爱。 今天就来讨论下数据结构中的树。 先梳理下关于树一些基本概念。树的基本概念(1)树(Tree)的概念:树是一种递归定义的数据结构,是一种重要的非线性数据结构。树可以是一棵空树,它没有任何的结点;也可以是一棵非空树,至少含有一个结点。(2)根(Root):有且仅有一个结点的非空树,那个结点就是根。(3)子树(Subtree):在一棵非空树中,除根外,其余所有结点可以分为m(m≥0)个互不相交的集合。每个集合本身又是一棵树,称为根的子树。(4)结点(Node):表示树中的元素及若干指向其子树的分支。(5)结点的度(Degree):一个结点拥有.
阅读全文
摘要:今天来讨论下链表中的双向链表。双向链表:概念:在双向链表中,结点除含有数据域外,还含有两个指针域:一个存储直接后继结点的地址,称为右链域;另一个存储直接前驱结点的地址,称为左链域。typedef struct node{ int num; //数值域 struct node *lnext; //左链域指针 struct node *rnect; //右链域指针}stud; 双向链表常用算法:先对三个指针作个声明:head:用来指向链表的头部。链表需要一个指针来标识,这就是头指针。p1:用来指向新结点,以及用来遍历链表的每一个结点。p2:...
阅读全文
摘要:本文就循环链表做一些讨论:循环链表: 概念:所谓循环链表,就是在单链表的基础上,把链表最后一个结点的链表指针指向链表的头结点的地址,就构成了一个循环链表。 关键算法:先对三个指针作下声明:head:用来指向链表的头部。链表需要一个指针来标识,这就是头指针。p1:用来指向新结点,以及用来遍历链表的每一个结点。p2:用来指向当前结点。(1)循环链表创建算法创建一个结点数目为n的循环链表:#include <malloc.h>typedef struct node{ int num; struct node *next;}stud;stud* Create(int n){ stud...
阅读全文
摘要:链表主要就单链表、循环链表和双向链表3种链表进行讨论。一、单链表 概念:所谓单链表,是指数据结点是单向排列的。一个单链表结点,其结构类型分为两部分: (1)数据域:用于存储数据元素的值。 (2)指针域(链域):用于存储下一个结点地址或者说指向其直接后继结点的指针。算法:一般声明3个指针来操作链表:head:用来指向链表的头部。链表需要一个指针来标识链表,这就是头指针。p1:用来指向新结点,以及用来遍历链表的每一个结点。p2:用来指向当前结点。(1)单链表创建算法创建结点数目为n的链表:#include <malloc.h>typedef struct node{ int num;
阅读全文
摘要:C/C++内存存储问题是笔试中必须掌握的。先看下面的程序:#include <stdio.h>#include "string.h"#include "malloc.h"void Swap(int a,int b){ int temp; temp=a; a=b; b=temp;}int Get_Int(int a){ int i=1+a; return i;}char* Get_Memory0(){ char* p=(char*)malloc(sizeof(char)* 20); strcpy(p,"hello world"
阅读全文
摘要:继承和派生:(1)子类不加修改的延续父类的特征,我们把它叫做继承。(2)在原有基础上建立新类并且添加新新征的过程叫做“类的派生”。(3)把原有的类叫做“基类”,又叫“父类”,把新建的类叫做“派生类”,又叫子类。 例如:class Son : public Father(4)公有派生的公有成员仍然为公有成员;公有派生的保护成员仍然为保护成员;公有派生的私有成员是不能为派生访问的。(5)私有继承:class Son :private Father 私有方式派生的子类,父类的公有和保护成员在子类中是私有的,而私有成员是不可访问的;由于私有派生不利于继续派生,所以实际中用的不多。不管以仅有还是私有形式
阅读全文
摘要:1.求两整数的最大公约数:int mcd(unsigned int a,unsigned int b){ if(b==0) { return a; } return mcd(b,a%b);} 对上述解法,出现a%b取模运算对于大数来说效率很低,针对这个方法的改进见《编程之美》2.7节最大公约数问题。2.判断一个整数是否为素数:bool IsPrime(uint x){ for(uint i=2;i<=x/2;i++) { if(x%i==0) { return false; } } retur...
阅读全文
摘要:1.Windows API动态链接库:Kernel32.dll User32.dll GDI32.dll2.静态库:扩展名为.lib 动态库: 包括:(1) 引入库:扩展名为.lib,引入库包含被DLL导出的函数和变量的符号名 (2) 动态链接库:扩展名为.dll,DLL包含实际的函数和数据,DLL中的函数代码和数据并不复制到可执行文件中,在运行的时候,再去加载DLL访问DLL中导出的函数3.使用动态链接库的好处:(1)可以采用多种编程语言来编写(2)增强产品的功能(3)提供二次开发的平台(4)简化项目管理(5)可以节省磁盘空间的内存(6)有助于资源的共享(7)有助于实现应用程序的本地化4.动
阅读全文
摘要:定义和声明区别:(1)定义分配内存,声明没有(2)定义只能出现一次,而声明可以出现多次(3)extern char a[] 与extern char a[100]等价,因为这里只是声明,不分配空间(4)extern int a extern 告诉编译器a这个名字已经在别的文件定义了,下面的代码使用的名字a是别的文件定义的数组名的值:(1)在绝大多数表达式中,数组名的值是指向数组第1个元素的指针。这个规则只有两个例外:sizeof返回整个数组所占用的字节而不是一个指针所占用字节;单目操作符&返回一个指向数组的指针,而不是一个指向数组第1个元素的指针的指针高手写code的惯用法:(1)将变
阅读全文