第一部分 C语言基础 1
第1章 C语言概述 1
1.1 C语言的简要历史 1
1.2 C是中级语言 2
1.3 C是结构化语言 2
1.4 C是面向程序员的语言 3
1.5 编译和解释 4
1.6 C程序的格式 4
1.7 库和链接 6
1.8 分别编译 7
1.9 编译C程序 7
1.10 C的内存映像 7
1.11 C与C++ 7
1.12 术语 8
第2章 C表达式 9
2.1 基本数据类型 9
2.2 修饰基本类型 9
2.3 标识符命名 10
2.4 变量 11
2.4.1 定义变量的位置 11
2.4.2 局部变量 11
2.4.3 形式参数 14
2.4.4 全局变量 14
2.4.5 C语言的四个域 15
2.5 类型修饰符 16
2.5.1 const 16
2.5.2 volatile 17
2.6 存储类型说明符 17
2.6.1 extern 18
2.6.2 static变量 19
2.6.3 register变量 20
2.7 变量初始化 21
2.8 常量 22
2.8.1 16进制和8进制常量 22
2.8.2 串常量 23
2.8.3 反斜线字符常量 23
2.9 操作符 23
2.9.1 赋值操作符 23
2.9.2 赋值中的类型转换 24
2.9.3 多重赋值 25
2.9.4 复合赋值 25
2.9.5 算术操作符 25
2.9.6 增量和减量 26
2.9.7 关系和逻辑操作符 27
2.9.8 位操作符 28
2.9.9 问号(?)操作符 31
2.9.10 指针操作符 和? 32
2.9.11 编译时操作符sizeof() 33
2.9.12 逗号(,)操作符 33
2.9.13 圆点(.)和箭头(→)操作符 34
2.9.14 []和()操作符 34
2.9.15 优先级小结 34
2.10 表达式 35
2.10.1 求值顺序 35
2.10.2 表达式中的类型转换 35
2.10.3 强制类型转换 36
2.10.4 间隔和括号 36
第3章 语句 38
3.1 C的真值和假值 38
3.2 选择语句 38
3.2.1 if语句 38
3.2.2 嵌套if语句 39
3.2.3 if-else-if梯次 40
3.2.4 代替if的问号(?) 42
3.2.5 条件表达式 44
3.2.6 switch 44
3.2.7 嵌套switch语句 46
3.3 重复(Iteration)语句 47
3.3.1 for循环 47
3.3.2 for循环的变形 48
3.3.3 无限循环 51
3.3.4 无循环体的循环 51
3.3.5 在for循环中声明变量 52
3.3.6 while循环 52
3.3.7 do-while循环 54
3.4 跳转语句 55
3.4.1 return语句 55
3.4.2 goto语句 55
3.4.3 break语句 56
3.4.4 exit()函数 57
3.4.5 continue语句 58
3.5 表达式语句 59
3.6 块语句 59
第4章 数组和串 61
4.1 一维数组 61
4.2 指向数组的指针 62
4.3 向函数传一维数组 62
4.4 串 63
4.5 二维数组 65
4.5.1 字符串数组 68
4.6 多维数组 69
4.7 指针的下标操作 69
4.8 数组初始化 71
4.8.1 无尺寸数组初始化 72
4.9 可变长数组 73
4.10 一担挑游戏 73
第5章 指针 77
5.1 什么是指针 77
5.2 指针变量 77
5.3 指针操作符 77
5.4 指针表达式 78
5.4.1 指针赋值 78
5.4.2 指针转换 79
5.4.3 指针算术操作 80
5.4.4 指针比较 80
5.5 指针和数组 82
5.5.1 指针数组 83
5.6 多级间址 83
5.7 指针初始化 84
5.8 函数指针 86
5.9 动态分配函数 89
5.9.1 动态分配的数组 90
5.10 由restrict修饰的指针 92
5.11 与指针有关的问题 92
第6章 函数 96
6.1 函数的一般形式 96
6.2 理解函数的作用域规则 96
6.3 函数的变元 96
6.3.1 值调用和引用调用 97
6.3.2 引用调用 97
6.3.3 用数组调用 99
6.4 main()的变元argc和argv 101
6.5 返回语句 103
6.5.1 从函数中返回 103
6.5.2 返回值 104
6.5.3 返回指针 106
6.5.4 void型函数 106
6.6 main()的返回值 107
6.7 递归 107
6.8 函数原型 108
6.8.1 老式风格的函数声明 110
6.8.2 标准的库函数原型 110
6.9 定义可变长度的参数表 111
6.10 “隐含的int”规则 111
6.11 参数声明的老式方法和现代方法 112
6.12 inline关键字 112
第7章 结构、联合、枚举和用户定义类型 114
7.1 结构 114
7.1.1 存取结构成员 115
7.1.2 结构赋值 116
7.2 结构数组 116
7.2.1 通信录实例 117
7.3 向函数传递结构 123
7.3.1 向函数传结构成员 123
7.3.2 向函数传递全结构 124
7.4 结构指针 125
7.4.1 定义结构指针 125
7.4.2 使用结构指针 125
7.5 结构中的数组和结构 128
7.6 联合 128
7.7 位域 130
7.8 枚举 132
7.9 C与C++之间的重要差别 133
7.10 用sizeof确保可移植性 134
7.11 typedef 135
第8章 控制台I/O 136
8.1 读写字符 136
8.1.1 getchar()的问题 137
8.1.2 代替getchar()的函数 137
8.2 读写串 138
8.3 格式化控制台I/O 140
8.4 printf() 140
8.4.1 打印字符和串 141
8.4.2 打印数值 141
8.4.3 显示地址 142
8.4.4 格式说明符%n 143
8.4.5 格式修饰符 143
8.4.6 最小域宽说明符 143
8.4.7 精度说明符 145
8.4.8 对齐输出 145
8.4.9 处理其他数据类型 146
8.4.10 修饰符?和 146
8.5 scanf() 147
8.5.1 格式说明符 147
8.5.2 输入数值 147
8.5.3 输入无符号整数 148
8.5.4 用scanf()读单字符 148
8.5.5 用scanf()读串 148
8.5.6 输入地址 149
8.5.7 格式符%n 149
8.5.8 使用扫描集合 149
8.5.9 过滤多余空白符 150
8.5.10 控制串中的非空白符 150
8.5.11 必须向scanf()传地址 150
8.5.12 格式修饰符 150
8.5.13 忽略输入 151
第9章 文件I/O 152
9.1 C与C++ I/O 152
9.2 标准C的I/0和UNIX C的I/O 152
9.3 流和文件 152
9.4 流 152
9.4.1 文本流 152
9.4.2 二进制流 153
9.5 文件 153
9.6 文件系统基础 153
9.6.1 文件指针 154
9.6.2 打开文件 154
9.6.3 关闭文件 155
9.6.4 写字符 156
9.6.5 读字符 156
9.6.6 使用fopem()、getc()、putc()和fclose() 156
9.6.7 使用feof() 158
9.6.8 用fputs()和fgets()处理串 159
9.6.9 rewind() 160
9.6.10 ferror() 160
9.6.11 删除文件 162
9.6.12 对流清仓 163
9.7 fread()和fwrite() 163
9.7.1 使用fread()和fwrite() 163
9.7.2 通信录实例 164
9.8 fseek()和随机存取I/O 170
9.9 fprintf()和fscanf() 171
9.10 标准流 172
9.10.1 控制台I/O的连接 173
9.10.2 用freopen()重定向标准流 174
第10章 预处理程序和注释 175
10.1 预处理程序 175
10.2 #define 175
10.2.1 定义类函数宏 176
10.3 #error 177
10.4 #include 177
10.5 条件编译指令 177
10.5.1 #if、#else、#elif和#endif 178
10.5.2 #ifdef和#ifndef 180
10.6 #undef 180
10.7 使用defined 181
10.8 #line 181
10.9 #pragma 182
10.10 预处理操作符#和 182
10.11 预定义宏 183
10.12 注释 183
10.12.1 单行注释 184
第二部分 C99标准 185
第11章 C99 185
11.1 C89与C99概述 185
11.1.1 增加的特性 185
11.1.2 删除的特性 186
11.1.3 修改的特性 186
11.2 由restrict修饰的指针 186
11.3 inline 187
11.4 新的内置数据类型 188
11.4.1 _Bool 188
11.4.2 _ Complex和_Imaginary 188
11.4.3 long long int类型 189
11.5 对数组的增强 189
11.5.1 变长数组 189
11.5.2 类型修饰符在数组声明中的应用 189
11.6 单行注释 190
11.7 分散代码和声明 190
11.8 预处理程序的修改 190
11.8.1 变元表 190
11.8.2 _Pragma操作符 191
11.8.3 内置的编译指令(Pragmas) 191
11.8.4 增加的内置宏 191
11.9 在for循环中声明变量 191
11.10 复合赋值 192
11.11 柔性数组结构成员 193
11.12 指定的初始化符 193
11.13 printf()和scanf()函数系列的新增内容 194
11.14 C99中的新库 194
11.15 __func__预定义标识符 194
11.16 放宽的转换限制 195
11.17 不再支持隐含的int 195
11.18 删除了隐含的函数声明 196
11.19 对返回值的约束 196
11.20 扩展的整数类型 196
11.21 对整数类型提升规则的修改 197
第三部分 C标准库 199
第12章 链接、库和头部 199
12.1 链接程序 199
12.1.1 分别编译 199
12.1.2 可重定位代码与绝对代码 200
12.1.3 覆盖链接 200
12.1.4 DLL链接 200
12.2 C标准库 201
12.2.1 库和目标码文件 201
12.3 头部 201
12.3.1 头部文件中的宏 202
12.4 重新定义库函数 202
第13章 I/O函数 204
13.1 clearerr 204
13.1.1 例子 204
13.1.2 有关函数 205
13.2 fclose 205
13.2.1 例子 205
13.2.2 有关函数 206
13.3 feof 206
13.3.1 例子 206
13.3.2 有关函数 206
13.4 ferror 206
13.4.1 例子 207
13.4.2 有关函数 207
13.5 fflush 207
13.5.1 例子 207
13.5.2 有关函数 207
13.6 fgetc 208
13.6.1 例子 208
13.6.2 有关函数 208
13.7 fgetpos 208
13.7.1 例子 209
13.7.2 有关函数 209
13.8 fgets 209
13.8.1 例子 209
13.8.2 有关函数 210
13.9 fopen 210
13.9.1 例子 211
13.9.2 有关函数 211
13.10 fprintf 211
13.10.1 例子 211
13.10.2 有关函数 212
13.11 fputc 212
13.11.1 例子 212
13.11.2 有关函数 212
13.12 fputs 212
13.12.1 例子 212
13.12.2 有关函数 213
13.13 fread 213
13.13.1 例子 213
13.13.2 有关函数 214
13.14 freopen 214
13.14.1 例子 214
13.14.2 有关函数 215
13.15 fscanf 215
13.15.1 例子 215
13.15.2 有关函数 215
13.16 fseek 215
13.16.1 例子 216
13.16.2 有关函数 216
13.17 fsetpos 216
13.17.1 例子 216
13.17.2 有关函数 217
13.18 ftell 217
13.18.1 例子 217
13.18.2 有关函数 217
13.19 fwrite 217
13.19.1 例子 217
13.19.2 有关函数 218
13.20 getc 218
13.20.1 例子 218
13.20.2 有关函数 219
13.21 getchar 219
13.21.1 例子 219
13.21.2 有关函数 219
13.22 gets 219
13.22.1 例子 220
13.22.2 有关函数 220
13.23 perror 220
13.23.1 例子 220
13.24 printf 221
13.24.1 C99为printf()增加的格式修饰符 222
13.24.2 例子 223
13.24.3 有关函数 223
13.25 putc 223
13.25.1 例子 223
13.25.2 有关函数 223
13.26 putchar 223
13.26.1 例子 224
13.26.2 有关函数 224
13.27 puts 224
13.27.1 例子 224
13.27.2 有关函数 224
13.28 remove 224
13.28.1 例子 225
13.28.2 有关函数 225
13.29 rename 225
13.29.1 例子 225
13.29.2 有关函数 225
13.30 rewind 225
13.30.1 例子 226
13.30.2 有关函数 226
13.31 scanf 226
13.31.1 C99为scanf()增加的格式修饰符 228
13.31.2 例子 228
13.31.3 有关函数 229
13.32 setbuf 229
13.32.1 例子 229
13.32.2 有关函数 229
13.33 setvbuf 229
13.33.1 例子 230
13.33.2 有关函数 230
13.34 snprintf 230
13.34.1 有关函数 230
13.35 sprintf 230
13.35.1 例子 231
13.35.2 有关函数 231
13.36 sscanf 231
13.36.1 例子 231
13.36.2 有关函数 231
13.37 tmpfile 231
13.37.1 例子 232
13.37.2 有关函数 232
13.38 tmpnam 232
13.38.1 例子 232
13.38.2 有关函数 233
13.39 ungetc 233
13.39.1 例子 233
13.39.2 有关函数 233
13.40 vpirintf、vfprintf、vsprintf及vsnprintf 233
13.40.1 例子 234
13.40.2 有关函数 234
13.41 vscanf、vfscanf及vsscanf 234
13.41.1 有关函数 235
第14章 串和字符函数 236
14.1 isalnum 236
14.1.1 例子 236
14.1.2 有关函数 237
14.2 isalpha 237
14.2.1 例子 237
14.2.2 有关函数 237
14.3 isblank 237
14.3.1 例子 237
14.3.2 有关函数 238
14.4 iscntrl 238
14.4.1 例子 238
14.4.2 有关函数 239
14.5 isdigit 239
14.5.1 例子 239
14.5.2 有关函数 239
14.6 isgraph 239
14.6.1 例子 239
14.6.2 有关函数 240
14.7 islower 240
14.7.1 例子 240
14.7.2 有关函数 240
14.8 isprint 241
14.8.1 例子 241
14.8.2 有关函数 241
14.9 ispunct 241
14.9.1 例子 241
14.9.2 有关函数 242
14.10 isspace 242
14.10.1 例子 242
14.10.2 有关函数 242
14.11 isupper 243
14.11.1 例子 243
14.11.2 有关函数 243
14.12 isxdigit 243
14.12.1 例子 243
14.12.2 有关函数 244
14.13 memchr 244
14.13.1 例子 244
14.13.2 有关函数 244
14.14 memcmp 244
14.14.1 例子 245
14.14.2 有关函数 245
14.15 memcpy 245
14.15.1 例子 246
14.15.2 有关函数 246
14.16 memmove 246
14.16.1 例子 246
14.16.2 有关函数 247
14.17 memset 247
14.17.1 例子 247
14.17.2 有关函数 247
14.18 strcat 247
14.18.1 例子 247
14.18.2 有关函数 248
14.19 strchr 248
14.19.1 例子 248
14.19.2 有关函数 248
14.20 strcmp 249
14.20.1 例子 249
14.20.2 有关函数 249
14.21 strcoll 249
14.21.1 例子 249
14.21.2 有关函数 250
14.22 strcpy 250
14.22.1 例子 250
14.22.2 有关函数 250
14.23 strcspn 250
14.23.1 例子 250
14.23.2 有关函数 251
14.24 strerror 251
14.24.1 例子 251
14.25 strlen 251
14.25.1 例子 251
14.25.2 有关函数 251
14.26 strncat 251
14.26.1 例子 251
14.26.2 有关函数 252
14.27 strncmp 252
14.27.1 例子 252
14.27.2 有关函数 253
14.28 strncpy 253
14.28.1 例子 253
14.28.2 有关函数 253
14.29 strpbrk 253
14.29.1 例子 254
14.29.2 有关函数 254
14.30 strrchr 254
14.30.1 例子 254
14.30.2 有关函数 254
14.31 strspn 255
14.31.1 例子 255
14.31.2 有关函数 255
14.32 strstr 255
14.32.1 例子 255
14.32.2 有关函数 256
14.33 strtok 256
14.33.1 例子 256
14.33.2 有关函数 256
14.34 strxfrm 257
14.34.1 例子 257
14.34.2 有关函数 257
14.35 tolower 257
14.35.1 例子 257
14.35.2 有关函数 257
14.36 toupper 257
14.36.1 例子 257
14.36.2 有关函数 258
第15章 数学函数 259
15.1 acos 260
15.1.1 例子 260
15.1.2 有关函数 260
15.2 acosh 261
15.2.1 有关函数 261
15.3 asin 261
15.3.1 例子 261
15.3.2 有关函数 261
15.4 asinh 261
15.4.1 有关函数 262
15.5 atan 262
15.5.1 例子 262
15.5.2 有关函数 262
15.6 atanh 262
15.6.1 有关函数 263
15.7 atan2 263
15.7.1 例子 263
15.7.2 有关函数 263
15.8 cbrt 263
15.8.1 例子 264
15.8.2 有关函数 264
15.9 ceil 264
15.9.1 例子 264
15.9.2 有关函数 264
15.10 copysign 264
15.10.1 有关函数 264
15.11 cos 265
15.11.1 例子 265
15.11.2 有关函数 265
15.12 cosh 265
15.12.1 例子 265
15.12.2 有关函数 266
15.13 erf 266
15.13.1 有关函数 266
15.14 erfc 266
15.14.1 有关函数 266
15.15 exp 266
15.15.1 例子 267
15.15.2 有关函数 267
15.16 exp2 267
15.16.1 有关函数 267
15.17 expml 267
15.17.1 有关函数 267
15.18 fabs 267
15.18.1 例子 268
15.18.2 有关函数 268
15.19 fdirn 268
15.19.1 有关函数 268
15.20 floor 268
15.20.1 例子 268
15.20.2 有关函数 269
15.21 fma 269
15.21.1 有关函数 269
15.22 fmax 269
15.22.1 有关函数 269
15.23 fmin 269
15.23.1 有关函数 269
15.24 fmod 269
15.24.1 例子 270
15.24.2 有关函数 270
15.25 frexp 270
15.25.1 例子 270
15.25.2 有关函数 270
15.26 hypot 271
15.26.1 有关函数 271
15.27 ilogb 271
15.27.1 有关函数 271
15.28 ldexp 271
15.28.1 例子 271
15.28.2 有关函数 272
15.29 lgamma 272
15.29.1 有关函数 272
15.30 llrint 272
15.30.1 有关函数 272
15.31 llround 272
15.31.1 有关函数 272
15.32 log 273
15.32.1 例子 273
15.32.2 有关函数 273
15.33 loglp 273
15.33.1 有关函数 273
15.34 log10 274
15.34.1 例子 274
15.34.2 有关函数 274
15.35 1og2 274
15.35.1 有关函数 274
15.36 logb 275
15.36.1 有关函数 275
15.37 lrint 275
15.37.1 有关函数 275
15.38 lround 275
15.38.1 有关函数 275
15.39 modef 275
15.39.1 例子 276
15.39.2 有关函数 276
15.40 nan 276
15.40.1 有关函数 276
15.41 nearbyint 276
15.41.1 有关函数 276
15.42 nextafter 276
15.42.1 有关函数 277
15.43 nexttoward 277
15.43.1 有关函数 277
15.44 pow 277
15.44.1 例子 277
15.44.2 有关函数 278
15.45 remainder 278
15.45.1 有关函数 278
15.46 remquo 278
15.46.1 有关函数 278
15.47 rint 278
15.47.1 有关函数 279
15.48 round 279
15.48.1 有关函数 279
15.49 scalbln 279
15.49.1 有关函数 279
15.50 scalbn 279
15.50.1 有关函数 280
15.51 sin 280
15.51.1 例子 280
15.51.2 有关函数 280
15.52 sinh 280
15.52.1 例子 280
15.52.2 有关函数 281
15.53 sqrt 281
15.53.1 例子 281
15.53.2 有关函数 281
15.54 tan 281
15.54.1 例子 282
15.54.2 有关函数 282
15.55 tanh 282
15.55.1 例子 282
15.55.2 有关函数 283
15.56 tgamma 283
15.56.1 有关函数 283
15.57 trunc 283
15.57.1 有关函数 283
第16章 时间、日期和本地化函数 284
16.1 asctime 284
16.1.1 例子 284
16.1.2 有关函数 285
16.2 clock 285
16.2.1 例子 285
16.2.2 有关函数 285
16.3 ctime 285
16.3.1 例子 286
16.3.2 有关函数 286
16.4 difftime 286
16.4.1 例子 286
16.4.2 有关函数 287
16.5 gmtime 287
16.5.1 例子 287
16.5.2 有关函数 287
16.6 localeconv 287
16.6.1 例子 288
16.6.2 有关函数 289
16.7 localtime 289
16.7.1 例子 289
16.7.2 有关函数 290
16.8 mktime 290
16.8.1 例子 290
16.8.2 有关函数 290
16.9 setlocale 290
16.9.1 例子 291
16.9.2 有关函数 291
16.10 strftime 291
16.10.1 例子 292
16.10.2 有关函数 293
16.11 time 293
16.11.1 例子 293
16.11.2 有关函数 294
第17章 动态分配函数 295
17.1 calloc 295
17.1.1 有关函数 295
17.2 free 295
17.2.1 例子 296
17.2.2 有关函数 296
17.3 malloc 296
17.3.1 例子 296
17.3.2 有关函数 297
17.4 realloc 297
17.4.1 例子 297
17.4.2 有关函数 298
第18章 工具函数 299
18.1 abort 299
18.1.1 例子 299
18.1.2 有关函数 299
18.2 abs 299
18.2.1 例子 300
18.2.2 有关函数 300
18.3 assert 300
18.3.1 例子 300
18.3.2 有关函数 300
18.4 atexit 300
18.4.1 例子 301
18.4.2 有关函数 301
18.5 atof 301
18.5.1 例子 301
18.5.2 有关函数 302
18.6 atoi 302
18.6.1 例子 302
18.6.2 有关函数 302
18.7 atol 302
18.7.1 例子 303
18.7.2 有关函数 303
18.8 atoll 303
18.8.1 有关函数 303
18.9 bsearch 303
18.9.1 例子 304
18.9.2 有关函数 304
18.10 div 305
18.10.1 例子 305
18.10.2 有关函数 305
18.11 exit 305
18.11.1 例子 305
18.11.2 有关函数 306
18.12 _Exit 306
18.12.1 有关函数 306
18.13 getenv 306
18.13.1 例子 306
18.13.2 有关函数 307
18.14 labs 307
18.14.1 例子 307
18.14.2 有关函数 307
18.15 llabs 307
18.l5.1 有关函数 307
18.16 ldiv 307
18.16.1 例子 308
18.16.2 有关函数 308
18.17 lldiv 308
18.17.1 有关函数 308
18.18 longjmp 308
18.18.1 例子 309
18.18.2 有关函数 309
18.19 mblen 310
18.19.1 例子 310
18.19.2 有关函数 310
18.20 mbstowcs 310
18.20.1 例子 310
18.20.2 有关函数 310
18.21 mbtowc 310
18.21.1 例子 311
18.21.2 有关函数 311
18.22 qsort 311
18.22.1 例子 311
18.22.2 有关函数 312
18.23 raise 312
18.23.1 有关函数 312
18.24 rand 312
18.24.1 例子 312
18.24.2 有关函数 313
18.25 setjmp 313
18.25.1 有关函数 313
18.26 signal 313
18.26.1 有关函数 313
18.27 srand 314
18.27.1 例子 314
18.27.2 有关函数 314
18.28 strtod 314
18.28.1 例子 315
18.28.2 有关函数 315
18.29 strtof 315
18.29.1 有关函数 316
18.30 strtol 316
18.30.1 例子 316
18.30.2 有关函数 316
18.31 strtold 316
18.31.1 有关函数 317
18.32 strtoll 317
18.32.1 有关函数 317
18.33 strtoul 317
18.33.1 例子 317
18.33.2 有关函数 318
18.34 strtoull 318
18.34.1 有关函数 318
18.35 system 318
18.35.1 例子 318
18.35.2 有关函数 318
18.36 va_arg、va_cpoy、va_start及va_end 318
18.36.1 例子 319
18.36.2 有关函数 320
18.37 wcstombs 320
18.37.1 有关函数 320
18.38 wctomb 320
18.38.1 有关函数 320
第19章 宽字符函数 321
19.1 宽字符分类函数 321
19.2 宽字符I/0函数 322
19.3 宽字符串函数 323
19.4 宽字符串变换函数 324
19.5 宽字符数组函数 325
19.6 多字节/宽字符变换函数 325
第20章 C99增加的库函数特性 327
20.1 复数库 327
20.2 浮点环境库 329
20.3 <stdint.h>头部 329
20.4 整数格式转换函数 330
20.5 一般类型数学宏 330
20.6 <stdbool.h>头部 331
第四部分 算法和应用 333
第21章 排序和查找 333
21.1 排序 333
21.1.1 排序算法的分类 333
21.1.2 排序算法的评价 334
21.1.3 气泡排序 334
21.1.4 选择排序 337
21.1.5 插入排序 338
21.1.6 改进的排序 338
21.1.7 谢尔排序 339
21.1.8 快速排序 340
21.2 选择排序算法 341
21.3 对其他数据结构排序 342
21.3.1 对串排序 342
21.3.2 对结构排序 343
21.4 对随机访间的磁盘文件排序 344
21.5 查找 347
21.5.1 查找方法 348
21.5.2 顺序查找 348
21.5.3 对分查找 348
第22章 队列、堆栈、链表和树 350
22.1 队列 350
22.2 循环队列 354
22.3 堆栈 356
22.4 链表 360
22.5 单向链表 360
22.6 双向链表 364
22.7 通信录实例 367
22.8 二叉树 374
第23章 稀疏数组 381
23.1 理解稀疏数组的作用 381
23.2 链表稀疏数组 382
23.2.1 链表方法的性能分析 384
23.3 二叉树方法 384
23.3.1 二叉树方法的性能分析 386
23.4 指针数组方法 386
23.4.1 指针数组方法的性能分析 389
23.5 散列方法 389
23.5.1 散列方法的性能分析 392
23.6 决策 392
第24章 表达式分析和求值 393
24.1 表达式 393
24.2 表达式分解 394
24.3 表达式分析 396
24.4 简单表达式分析程序 396
24.5 能处理变量的分析程序 402
24.6 递归下降分析程序中的语法检查 410
第25章 人工智能问题求解 411
25.1 表示和术语 411
25.2 组合爆炸 412
25.3 搜索技术 413
25.4 评价搜索技术 413
25.5 用图表示问题 414
25.6 深度优先搜索 415
25.6.1 深度优先算法的性能分析 424
25.7 宽度优先搜索 424
25.7.1 宽度优先搜索的性能分析 425
25.8 探试式搜索 425
25.9 爬山搜索 426
25.9.1 爬山搜索的性能分析 431
25.10 最小代价搜索 431
25.10.1 最小代价搜索的性能分析 432
25.11 选择搜索技术 432
25.12 寻找多重解 433
25.12.1 路径剪除 433
25.12.2 节点摘除 434
25.13 寻找“最优”解 440
25.14 再谈丢钥匙的例子 445
第五部分 C语言软件开发 451
第26章 构造Windows 2000框架 451
26.1 Windows 2000编程前景 451
26.1.1 桌面模式 451
26.1.2 鼠标 452
26.1.3 图标、位图和图形 452
26.1.4 菜单、控件和对话框 452
26.2 Win32应用编程接口 452
26.3 窗口组件 452
26.4 Windows与用户程序进行交互的方法 453
26.5 Windows 2000应用基础 453
26.5.1 WinMain() 453
26.5.2 窗口过程 454
26.5.3 窗口类型 454
26.5.4 消息环 454
26.5.5 Windows数据类型 454
26.6 Windows 2000框架 454
26.6.1 窗口类型的定义 457
26.6.2 创建窗口 459
26.6.3 消息环 460
26.6.4 窗口函数 461
26.7 无需定义文件 461
26.8 命名约定 462
第27章 C语言软件工程 463
27.1 自顶向下设计 463
27.1.1 构造程序草案 463
27.1.2 选择数据结构 464
27.2 防弹函数 464
27.3 使用MAKE 466
27.3.1 使用MAKE中的宏 468
27.4 使用集成的开发环境 468
第28章 效率、移植和调试 470
28.1 效率 470
28.1.1 增量和减量操作符 470
28.1.2 使用寄存器变量 470
28.1.3 指针和数组索引 471
28.1.4 函数的用法 471
28.2 移植程序 474
28.2.1 使用#define 474
28.2.2 对操作系统的依赖 475
28.2.3 数据大小的差异 475
28.3 调试 475
28.3.1 处理顺序错 475
28.3.2 指针问题 476
28.3.3 解释语法错 477
28.3.4 出界错 478
28.3.5 越界错 479
28.3.6 函数原型遗漏 480
28.3.7 变元错 481
28.3.8 栈溢出 481
28.3.9 使用调试程序 481
28.3.10 一般调试理论 482
第六部分 C解释程序 483
第29章 C解释程序 483
29.1 解释程序的现实重要性 483
29.2 Little C说明 484
29.2.1 Little C约束条件 484
29.3 解释结构化语言 486
29.4 C的非正式理论 486
29.4.1 C表达式 487
29.4.2 求表达式的值 487
29.5 表达式分析程序 488
29.5.1 将源代码缩减为部件 488
29.5.2 Little C递归下降分析程序 494
29.6 Little C解释程序 506
29.6.1 解释程序预扫 507
29.6.2 main()函数 509
29.6.3 intecp_block()函数 510
29.6.4 处理局部变量 525
29.6.5 调用用户定义的函数 526
29.6.6 为变量赋值 529
29.6.7 执行if语句 530
29.6.8 处理while循环 531
29.6.9 处理do-while循环 531
29.6.10 for循环 532
29.7 Little C库函数 533
29.8 编译和链接Little C解释程序 536
29.9 演示Little C 536
29.10 改进Little C 540
29.11 扩充Little C 541
29.11.1 增加新的C特征 541
29.11.2 增加附加特征 541