
本书不仅是C,C++和数据结构的综合性教材,也可以单独用作C和C++教材,或C和C++描述的数据结构教材。本书配有多媒体软件,既可以助教,又可以助学。而且内容丰富,读者可以根据自己的专业特点,选择相应的内容。
C/C++与数据结构与第1版相比,第2版教材主要改进部分有:
1. 第2章增加了第14节“程序设计综合举例”,包含C程序设计的典型算法,其中的“起泡排序”、“数制转换”、“Palindrom”、“删除重复数据”、“约瑟夫问题”、“划分”等算法在数据结构部分还有新的描述,学习时可以相互对比。这进一步体现了第一版中所阐述的“学习数据结构与学习程序语言共进”的思想。
2. 重新编写了第2章第13节“文件”,并改名为“流与文件”,增加了第14章“C++的I/O流库”。这两部分内容是一一对应的,分别用C语言和C++语言详细描述了对文件的各种运算和处理。为我们在第一版中所阐述的“学习C语言和学习C++语言成为一个过程”提供了更充实的内容。
3. 在第1章第3节“子程序调用过程”中加进具体的程序,为学习C语言的函数调用,尤其是递归调用,提供了更为具体、形象的感性认识。
4. 第2章“基本类型变量和指针”、“一维数组和指针”、“二维数组和指针”、“函数”和“指针参量”等节都做了整体的修改,进一步详述了变量、数组、指针、函数之间的关系:从直接引用的局限性引进了数组;根据模块化程序设计思想,由复合语句引入函数;从函数的形参与实参之间的关系,研究了指针变量与数组之间的匹配问题。
5. 第2章第12节“编译预处理”的内容更充实,划分更仔细,包括“文件包含处理”、“无参宏定义”、“带参宏定义”、“条件编译”。
6. 第2章还增加了“不同类型数据的混合运算”、“强制类型转换”、“混合赋值和复合的赋值运算符”、“逗号运算符”、“void指针”、“转义字符”等内容。
7. 第13章“C++程序”中的“注释和输入输出语句”、“常量修饰符const”、“模板函数”、“模板类”、“继承”、“派生类中的构造函数和析构函数”、“虚函数”、“纯虚函数和抽象类”等内容都做了改写。
8. 在主要章节的作业中增加了论述题(有关题目的基本内容可以在教材中找到),这有助于读者去发现C、C++与数据结构的内在联系。而这种联系是由计算机科学本身的整体性决定的,通过自己独立的思考,认识这种整体性,有助于培养科学的态度,掌握正确的学习方法。
9. 配书多媒体软件的内容更丰富,与教材联系更紧密,使用更方便。
另外,我们对一些复杂算法,例如“迷宫求解”进行了改进,算法更简洁。
本书如果用作C和C++教材,可选择第1章、第2章、第3章、第4章、第7章、第13章和第14章。从C语言“程序设计综合举例”中的典型算法过渡到数据结构中的“顺序表”和“新类型串”,再过渡到C++。
如果用作数据结构教材,可选择第3章至第12章。如果想用C++描述数据结构,我们在第13章中提供了将数据结构的C版本转化为数据结构C++版本的算法实例。光盘文件夹struct_vc包含了数据结构C++版本的典型程序。
本教材自2002年3月第1版发行后,两次印刷,在一年多的时间内又发行第2版,这要感谢天津师范大学各级领导和同仁的关怀和支持,感谢读者的认同与厚望。
读者有问题,欢迎直接与作者联系。
C/C++与数据结构第1章机器语言程序简介1
1.1电子计算机的基本组成及其工作过程1
1.2机器语言程序设计3
1.3子程序调用过程6
习题8第2章C语言基础9
2.1基本类型变量和指针9
2.2基本类型14
2.2.1整型14
2.2.2字符型15
2.2.3实型18
2.2.4指针类型(地址类型)18
2.2.5不同类型数据的混合运算18
2.2.6强制类型转换19
2.2.7混合赋值和复合的赋值运算符19
2.3一维数组和指针21
2.3.1一维数组21
2.3.2指针23
2.3.3一维数组和指针变量的比较25
2.3.4void指针27
2.4二维数组和指针27
2.4.1二维数组和二维指针27
2.4.2二维数组和一维指针30
2.4.3指针数组和指针的指针31
2.5结构和指针34
2.5.1结构变量34
2.5.2结构指针和数组36
2.6枚举类型39
2.7类型名选择40
2.8条件表达式与控制语句41
2.8.1关系运算41
2.8.2逻辑运算42
2.8.3条件控制语句43
2.8.4循环控制语句48
2.8.5break语句和continue语句52
2.8.6逗号运算符52
2.9函数53
2.9.1函数与指针53
2.9.2函数调用与变量的存储类别59
2.9.3动态单元的分配和释放66
2.10指针参量69
2.11输入输出函数72
2.11.1printf函数72
2.11.2scanf函数74
2.11.3getchar函数和putchar函数77
2.12编译预处理78
2.12.1文件包含处理78
2.12.2无参宏定义80
2.12.3带参宏定义82
2.12.4条件编译84
2.13流与文件86
2.13.1流与文件概述86
2.13.2文件打开关闭函数87
2.13.3无格式读写函数89
2.13.4字符读写函数91
2.13.5字符串读写函数93
2.13.6其他常用写函数95
2.13.7文件复制97
2.14初始化与赋值98
2.15程序设计综合举例102
2.15.1起泡排序102
2.15.2删除重复数据104
2.15.3数制转换105
2.15.4回文105
2.15.5约瑟夫问题(Josephus)106
2.15.6划分数组元素108
2.15.7模拟人工洗牌109
2.15.8三天打鱼两天晒网110
2.15.9筛法求素数111
2.15.10保序插入112
2.15.11折半查找113
2.15.12打印年历113
习题114
第3章数据结构概论117
3.1数据结构和数据类型117
3.2算法和程序120
3.3算法分析123
习题126
第4章顺序表127
习题134
第5章顺序队列135
5.1顺序队列的定义135
5.2队列与文件140
习题141
C / C ++与数据结构
第6章顺序栈142
6.1顺序栈的定义142
6.2中缀表达式求值146
习题152第7章字符串153
7.1C语言串153
7.2新类型串157
习题167
第8章链表168
8.1单向链式存储结构168
8.2单向链表174
8.3双向链式存储结构178
8.4双向链表183
习题187
第9章链队列188
9.1链队列的定义188
9.2事件驱动模拟190
习题200
第10章二叉树201
10.1二叉树的概念和性质201
10.1.1树和二叉树的概念201
10.1.2二叉树的性质202
10.2二叉树的存储203
10.2.1顺序存储结构203
10.2.2链式存储结构205
10.3二叉树层次遍历206
10.3.1层次遍历206
10.3.2建立二叉链表208
10.3.3垂直输出二叉树209
10.4二叉树的前序遍历213
10.4.1前序遍历213
10.4.2求二叉树从根至叶子的所有路径215
10.4.3求集合的幂集218
10.4.4快速排序221
10.5二叉树中序遍历224
10.5.1汉诺塔问题224
10.5.2由前序和中序序列建立二叉链表226
10.6二叉树后序遍历228
10.7递归评估230
10.8递归遍历的模拟232
10.8.1递归前序遍历的模拟232
10.8.2递归中序遍历的模拟236
10.8.3递归后序遍历的模拟238
10.9堆241
10.10哈夫曼树248
10.10.1哈夫曼树的定义248
10.10.2建立哈夫曼树249
10.10.3哈夫曼编码251
10.11二叉搜索树252
10.12平衡二叉搜索树259
10.13线索二叉树266
习题270
第11章树272
11.1树的存储与遍历272
11.1.1树的存储272
11.1.2树的层次遍历276
11.1.3树的前序遍历278
11.1.4树的后序遍历283
11.2八皇后问题285
11.3八皇后解的图形输出289
11.3.1图形系统初始化289
11.3.2图形设计与实现290
习题298
第12章图299
12.1图的概念和存储299
12.1.1图的概念299
12.1.2邻接矩阵表示法300
12.1.3邻接表表示法304
12.2图的遍历305
12.2.1广度遍历305
12.2.2深度遍历307
12.3最小生成树309
12.4单源最短路径314
12.5拓扑排序319
12.6关键路径322
12.7迷宫求解326
12.8骑士巡游和汉密尔顿路332
习题335
第13章C++程序336
13.1C++ 对C 的基本扩充336
13.1.1注释和输入输出语句336
13.1.2作用域说明337
13.1.3默认函数338
13.1.4引用338
13.1.5常量修饰符const340
13.1.6内存的动态申请和释放341
13.2C++的基本要素342
13.2.1类和对象342
13.2.2this指针347
13.2.3友元348
13.2.4外部运算符重载350
13.2.5初始化与赋值351
13.3重载354
13.3.1函数重载354
13.3.2成员和友元运算符重载358
13.4形式数据类型362
13.4.1模板函数363
13.4.2模板类364
13.4.3中缀表达式求值367
13.5继承和抽象类369
13.5.1继承369
13.5.2派生类中的构造函数和析构函数373
13.5.3虚函数375
13.5.4纯虚函数和抽象类379
习题381
第14章C++的I/O流库382
14.1屏幕输出382
14.1.1预定义的插入符382
14.1.2成员函数put384
14.1.3成员函数write385
14.2键盘输入385
14.2.1预定义的提取符385
14.2.2成员函数get,getline387
14.2.3成员函数read389
14.3插入符和提取符的重载389
14.4格式化输入输出390
14.4.1设置流的格式化标志390
14.4.2格式输出函数392
14.4.3操作子393
14.5文件394
14.5.1文件的打开关闭函数394
14.5.2无格式读写函数396
14.5.3字符读写函数397
14.5.4字符串读写函数398
14.5.5随机访问400
14.5.6文件错误处理401
参考文献403