图
1.若无向图G = (V.E)中含7个顶点,则保证图G在任何情况下都是连通的,则需要的边数最少是(16)
解析:任何情况都连通的最少边数的意思是:边分布最浪费的最少边情况。最浪费的最少边肯定就是浪费1个边。所以取点数减1的完全图,得到6* 5/2=15,然后加1条边得到16。
2.其实树就是一种无环图,树的深度优先遍历就相当于拓扑排序。
3.拓扑排序能够判断出有向图是否有回路。
4.设G是有p个顶点q条边的(简单)无向图,且G中每个顶点的度数不是k就是k+1,则G中度为k的顶点的个数是多少?
解析:由于无向图中的度数为边数的2倍。所以假设读为k的顶点有x个,可以列出下面的方程:
kx+(p-x)(k+1)=2q
解之得:x=p(k+1)-2q
C/C++
感觉半个月没接触过C/C++真的是忘干净了
- C++中的动态存储说明符:auto、register,静态存储说明符:static、extern。另外一种动态存储还有函数的形式参数。
- linux中查看cpu占用命令是top,查看内存是free,检查文件系统的磁盘空间占用状况df,查看网络连接、路由器、网络接口信息等是netstat。
定义函数模板add,
template<typename T>T add( T &x, T &y){ return x+y;}const int (*pfun1)(const int &a, const int &b);const int (*pfun2)(int &a, int &b);int (*pfun3)(const int &a, const int &b);int (*pfun4)(int &a, int &b);
可以得到以下结论:
①pfun1 =add 调用正确,类型相符。
②pfun2=add失败,会显示no matches converting fuction 'add' to type 'const int (*)(int&, int&);
,原因是int 和 const int不是一种类型,无法进行隐式转换。
③pfun3=add同样失败,add无法正确推导。
④pfun4=add
- 要记住,函数调用的时候,参数入栈的顺序是从右往左,但是实际打印的时候还是先打印左边的(FILO)。比如下面这个程序,输出结果就是666。
main(){ int a=666,b=888; printf("%d\n",a,b);
- 变量定义问题:变量定义的时候可以这样定义
int a,b,c;a=b=c=1;
但是不可以这样定义int a=v=c=1;
- C语言字符串以
\0
结尾,\0
在内存中的表示为0,对应空字符NULL,其作用是识别字符串,简化字符串处理过程,在使用过程中要为其分配内存空间,但不计入字符串长度。 - const在C语言中表示道义上保证变量的值不会被修改,但是实际上并不能阻止修改,通过指针可以修改常变量的值,但是往往会出现一些不可知的结果。值得注意的是,如果a被定义为全局常变量,使用指针修改会引发segment fault(段错误)。
- 在小端序机器中,如果
union X{ int x; char y[4];}X a;a.x=0x11223344;
那么里面取值如何?
解析:这个题目考察了两个方面:首先作为union,其长度决定于最长的变量,其实也就是X里面其实指的是y了,所以把0x11223344保存到了y[4]里面。第二个方面就是大小端存储。若是大端存储(高位存储在低字节,低位存储在高字节,对于11223344来说,11是高位,44是低位),则如下图所示
小端存储则是反过来,高位存储在高字节,低位存储在低字节。如下图所示
9. 预处理命令可以当做用户标识符,例如define,scanf,printf,include等。
10. 当使用free释放掉一个指针内容的时候,指针还是指向了那一块,只不过系统认为那块内存已经不使用了。
11. 下面程序的输出结果是:
void main(){ int n[][3]={10,20,30,40,50,60}; int (*p)[3]; p=n; cout<<p[0][0]<<","<<*(p[0]+1)<<","<<(*p)[2]<<endl;}
解析,n数组为
| 10 | 20 | 30 |
| — | — | — |
| 40 | 50 | 60 |
所以来说,p[0][0]指向的是第一行的1个元素,p[0]+1指向的是第一行第二个元素的地址,p指向的是第一行第一个元素的地址,所以(*p)[2]就相当于p[0][2]相当于n[0][2]。故分别是10,20,30
- C++中,对函数参数设定了默认参数之后,为了防止参数匹配发生歧义,后边的参数也必须设置默认参数,也就是说从当前项开始往后都得有默认参数。
- 以下程序经过编译连接生成可执行文件tt.txt,若运行以下命令行 tt 12 345 678,则结果是什么?
答案:136
解析:
实际上,这里面的argv[1]是’1’,而不是’12’,所以实际上是n=11010+3*10+6=136。一直以为argv[1]=12,argv[2]=345,argv[3]=678,实际上并不是,实际上只是首位数。
- 不能被重载的运算符 1、. (成员访问运算符) 2、.* (成员指针访问运算符) 3、:: (域运算符) 4、sizeof(长度运算符) 5、?: (条件运算符)
- cin是istream类的对象。
- 一 重载(overload)
基本条件:函数名必须相同;函数参数必须不相同,可以是参数类型或者参数个数不同;函数返回值可以相同,也可以不相同;
二 重写(override)
基本条件:重写的函数和被重写的函数必须为virtual函数,分别位于基类和派生类中;重写的函数和被重写的函数函数名和函数参数必须一致;重写的函数和被重写的函数返回值相同,或者都返回指针或引用,并且派生类虚函数所返回的指针或引用的类型是基类中被替换的虚函数所返回的指针或引用的类型的子类型。
三 隐藏
基本条件:
子类和父类的函数名称相同,但参数不同,此时不管父类函数是不是virtual函数,都将被隐藏。子类和父类的函数名称相同,参数也相同,但是父类函数不是virtual函数,父类的函数将被隐藏。