C++及数据结构复习笔记
Laotan
重庆邮电大学
2018 年 6 月
作者:
学校:
时间:
摘要
该复习文档是本人根据谭浩强老师的《C++程序设计》、邓俊辉的《数据结构(C++语
言版)》和 CSDN 博客上的众多文章总结而成的。感谢博客上各位大佬的总结,使我在复习
课本的同时补充了很多其他方面的关键知识,如 C++内存管理,STL 库等内容,这些补充的
内容可以参考笔者的另一篇文档。本文章适合 C++初学者的快速复习和应届生的笔试面试
准备,书中给出了大量的面试题,以帮助读者快速的掌握 C++的基本概念。对于初学者来
说,也可以加强对 C++的认识。
文档主要分为 C++基本知识,C++数据结构 2 个部分。C++基本知识部分介绍了 C++
的基本知识,如面向过程中的选择、循环和指针等,还有面向过程的内容,包括类,继承与
派生,多态性与虚函数。数据结构部分包括向量、列表、二叉树、图和排序的部分内容。其
他的部分主要来自于博主的总结。
笔者的话
笔者作为一个普通一本的屌丝研究生,和在看这篇文档的各位比起来没有一丝丝不同。
回顾本科和研究生已经度过的 2 年,感慨颇多。笔者的专业不是计算机相关专业的,但是彷
徨了 6 年发现其实毕业生可以选择的出路并不多,想有高收入,又没啥技术,唉,现实总是
很骨感。网申简历各种被拒,当初很难受,现在其实也就看淡了。经过前一段时间找实习各
种悲剧,笔者决定痛定思痛,好好补一下技术。想想自己曾经学过什么,好像也只有 C++和
数据结构可以拿得出手,其实对于通信专业的同学来说,找 IT 类的工作难度还是很大的,
毕竟只掌握一门语言并没有什么优势,可以说现在毕业的大学生几乎都会 C++。和计算机
专业的同学比起来,我们没学过算法导论,没学过 Linux 操作系统,甚至连数据库都不太会
用。所以仅看本文档的话是明显不够的,各位读者还是需要加强基础知识的学习。
天行健君子以自强不息,师父领进门修行在个人,想要有个好出路还是要看个人的修行,
除非你后台坚挺,否则没有什么人可以帮助你。好在从现在开始还不算太晚,抓紧时间学习
吧,达瓦里氏!
注意
本文所总结的内容均来自于笔者所写的 CSDN 博客,https://blog.csdn.net/Lao_tan 为
笔者的博客链接,转载请声明来源和作者。此外,未经本人授权,本文档总结不得用于任
何商业活动,笔者拥有对文档的绝对解释权。违反者将被依法追究法律责任。
目 录
第一章 C++基本知识....................................................................................................................................... 1
1.1 C++的初步认识 .................................................................................................................................. 1
1.2 数据类型与表达式 ............................................................................................................................ 1
1.3 程序设计初步 ..................................................................................................................................... 3
1.4 函数与预处理 ..................................................................................................................................... 5
1.5 数组 ..................................................................................................................................................... 13
1.6 指针 ..................................................................................................................................................... 17
1.7 自定义数据类型 .............................................................................................................................. 21
1.8 类和对象 ............................................................................................................................................ 22
1.9 关于类和对象的进一步讨论 ....................................................................................................... 26
1.10 继承与派生 ..................................................................................................................................... 36
1.11 多态性与虚函数 ............................................................................................................................ 45
1.12 C++程序设计中的其它要点 ...................................................................................................... 49
1.13 C++面试笔试概念性问题考点 .................................................................................................. 50
1.14 C++面试笔试编程问题考点 ...................................................................................................... 56
第二章 C++数据结构..................................................................................................................................... 58
2.1 向量 ..................................................................................................................................................... 58
2.2 列表 ..................................................................................................................................................... 65
2.3 栈与队列 ............................................................................................................................................ 71
2.4 二叉树 ................................................................................................................................................. 75
2.5 图 .......................................................................................................................................................... 83
2.6 C++数据结构面试笔试概念性问题考点 .................................................................................. 86
2.7 C++数据结构代码附录 .................................................................................................................. 87
第三章 参考文献.............................................................................................................................................. 87
第一章 C++基本知识
本章主要介绍了 C++基本的数据类型与表达式,面向过程的基本设计,函数与预处理
命令,数组,指针,结构体,类和对象,继承与派生和多态性与虚函数。主要的总结均来自
于谭浩强老师的《C++程序设计》,在每一小节的背后,给出了一些在网上总结的面试题,
以加强我们对 C++的理解。并且每一小节均给出了典型的 C++程序代码,理解这些代码是
读懂文章的关键。
1.1 C++的初步认识
C++的特点:类与对象、封装、继承和多态。
一个 C++程序通常由以下部分组成:预处理命令,全局声明部分,函数。函数由函数首
部和包含局部声明和执行的函数体构成。C++的语句分为声明语句和执行语句,执行语句用
于实现用户指定的操作。一个 C++程序总是从 main 函数开始执行的,不论 main 函数在整
个程序中的位置如何。
1.2 数据类型与表达式
1.2.1 C++的数据类型
整形(int):可以分为长整型(long int)和短整型(short int),长整型和整形的复制范
围是一样的,但是整形和短整型只占 2 字节,长整型占 4 字节。整形数据的存储方式为 2 进
制。Signed 和 unsigned 表示有符号和无符号,若为有符号,则数据以补码形式存放,无符
号的存储范围比有符号大一倍。
浮点型(float):分为单精度,双精度和长双精度。字母 e 表示其后数字都是以 10 为
底,即 e12 表示 1012。浮点型在内存中均已指数形式存储,存储单元分为存放数字的存储单
元和存放指数的存储单元。
字符常量:用单撇号括起来的一个字符就是字符型常量,如’a’,但只能包含一个字符,
且区分大小写。转义字符中有几个关键的需要掌握,如下表:
\n 换行
\t 跳到下一个 tab 位置
表 1.1 比较重要的的转义字符
\b 退格
\\ 输出反斜杠字符”\”
\’ 输出单撇号字符
\0 空字符
字符数据是以 ASCII 码存储的,A 的 ASCII 码是 65,a 的是 97,中间差了 32。
字符串常量会在最后自动加一个’\0’作为字符串结束标志,但它并不是字符串的一部分,
不会被输出,但是在内存中会多占用一个字节。字符串常量通过字符数组进行存放。
用来标识变量、符号常量、函数、数组和类等实体名字的有效字符序列称为标识符。标
识符只能由数字、字母和下划线 3 种字符组成。
1
1.2.2 常变量
Eg:
const int a=3;
const int a; a=3; (×)//常变量不能被赋值
在定义变量时,如果加上关键字 const,则变量的值在程序运行期间不能改变,这种变
量称为常变量。且常变量必须在声明时进行初始化,此后其值不会再改变。
1.2.3 C++运算符
&&与,||或,!非。sizeof 求字节运算符(后面要重点讲一下)。%取余运算符。运算符的
结合方向为自左向右。且在进行运算时,不同类型的数据需要先转化为同一类型,然后再进
行运算,转化规则如下图所示:
图 1.1 运算时的数据转换
++i:使用 i 之前,先给 i 加 1。(--i 同理)
i++:在使用 i 之后,使 i 的值加 1.(i--同理)
自增自减运算符只能用于变量,结合是自右向左的。如-i++相当于-(i++)。
例 1.1.1 下列语句输出结果是什么。
int i=3;
cout<
cout/cin 语句的一般格式为:
cout<<表达式 1<<表达式 2<<……<<表达式 n;
cin>>变量 1>>变量 2>>……>>变量 n;
关于输入输出流,有几个关键的控制符需要知道,见表 1.2。调用他们需要包含头文件:
#include
表 1.2 输入输出流的控制符
setprecision(n)
setw(n)
setiosflags(ios::fixed) 设置浮点数以固定的小数位数显示
setiosflags(ios::left) 输出数据左对齐
设置浮点数的精度为 n 位
设置字段宽度为 n 位
1.3 程序设计初步
1.3.1 putchar 和 getchar
putchar()函数的作用是向终端输出一个字符,当然也可以输出 ASCII 码。
getchar()函数是从终端输入一个字符。
1.3.2 关系运算和逻辑运算
优先级高的关系运算符(它们之间优先级相同):<.<=,>,>=。优先级低的关系运算符
(它们之间优先级相同):==,!=。
三种运算符之间的优先级关系:算术运算符>关系运算符>与和或>赋值运算符。
优先级:非>与>或
关系表达式的值是一个逻辑值,即“真”或“假”。1 表示真,0 表示假。
逻辑型变量要用标识符 bool 来定义,故又称布尔变量。
同或:相同为 1,不同为 0。a⊙b=ab+a’b’(a’为非 a,b’为非 b)。
异或:不同为 1,相同为 0。a⊕b=ab’+a’b。
1.3.3 选择结构
if 语句
if(表达式 1) 语句 1
else if (表达式 2) {语句 2}
……
else 语句 n
一、if 语句
switch 语句
switch(表达式)
{
case 常量表达式 1:语句 1;
case 常量表达式 2:语句 2;
……
default: 语句 n+;
}
3
if 语句中,else 总是与它上面最近的、且未配对的 if 配对。
条件运算符,又称三目运算符(?:),形式如下:
表达式 1? 表达式 2:表达式 3;
Eg:max(a>b)? a:b; //若括号内条件为真,则取 a,否则取“:”后面的值,即 b。
二、switch 语句
switch 后面括号内的“表达式”允许为任何类型。case 表达式的值不能相同,且 case 和
default 出现的顺序不影响执行结果。每执行完一个 case 子语句,流程就转移到下一个 case
子语句继续执行,会连续输出,若想跳出 switch 结构,需要在每个 case 子语句后加“break;”
1.3.4 循环结构
一、几种循环类型
①
while(表达式) {语句}
当满足括号内表达式条件时,执行循环体,上式称为当型循环。
②
do
语句
while (表达式)
先执行循环体,然后判断表达式。
③
for (循环变量赋初值;循环条件;循环变量增值) {语句}
Eg: for (i=1;i<=100;i++) sum=sum+i;
For 语句的第一个表达式可以省略,但需在 for 语句之前给循环变量赋初值、省略第 2
个表达式表示死循环。若想省略第三个表达式,需在循环体中做修改。
for(;;)相当于 while(1)。for 语句功能更强,凡能用 while 循环的均可用 for 实现。
二、break 和 continute
break 语句不仅可以跳出 switch 结构,在循环体内,还可以跳出循环体。continue 语句
作用为结束本次循环,接着进行下一次循环的判定。即 continue 语句只结束本次循环,break
语句结束整个循环过程。
例 1.3.1 找出 100~200 间的全部素数
判别 m 是否为素数的算法是这样的:让 m 被
除,若 m 不能被其中的任一个整
数整除,就可以确定 m 是素数。
#include
#include
#include
using namespace std;
int main()
{
4
2~m
int m,k,i,n=0;
bool prime; //定义 bool 变量 prime,以判定 m 是否为素数
for (m=101;m<=200;m=m+2)
{
prime=true;//prime 为真,即先默认 m 为素数
k=int(sqrt(m));//k 表示
的整数部分
for (i=2;i<=k;i++)//让 m 被
除,检查是否能整除
{
if (m%i==0)//若能整除,表示 m 不是素数
{
prime=false;
break;
}
if (prime)//若 m 为素数,则打印
{
cout<