简介
严蔚敏的《数据结构(第二版)》采用一种介于伪码和 C 语言之间的类 C 语言作为描述工具,与 Weiss 的《数据结构与算法分析——C 语言描述》相似。使用类 C 语言可以使数据结构与算法的描述与讨论简明清晰,不拘泥于 C 语言的细节,又容易转换成 C 或 C++程序。
类 C 语言的简要说明
预定义常量及类型
// 函数结果状态代码
#define OK 1
#define ERROR 0
#define OVERFLOW -2
// Status是函数返回值类型,其值是函数结果状态代码。
typedef int Status;
数据结构的表示
数据结构的表示(存储结构)用类型定义(typedef)描述;数据元素类型约定为 ElemType,由用户在使用该数据类型时自行定义。
基本操作
基本操作的算法都用如下格式的函数来描述:
函数类型 函数名 (函数参数表) {
// 算法说明
语句序列
} // 函数名
当函数返回值为函数结果状态代码时,函数类型定义为Status 。
为了便于描述算法,除了值调用方式外,增加了 C++语言引用调用的参数传递方式。在形参表中,以“&”打头的参数即为引用参数。传递引用给函数与传递指针的效果是一样的,形参变化实参也发生变化,但引用使用起来比指针更加方便、高效。
内存的动态分配与释放
使用 new 和 delete 动态分配和释放内存空间:
//分配空间
指针变量 = new 数据类型;
// 释放空间
delete 指针变量;
赋值语句
// 简单赋值
变量名 = 表达式;
// 串联赋值
变量名1 = 变量名2 = ... = 变量名n = 表达式;
// 成组赋值
(变量名1, ..., 变量名n) = (表达式1, ..., 表达式n);
// 结构赋值
结构名1 = 结构名2;
结构名 = (值1, 值2, ..., 值n);
// 条件赋值
变量名 = 条件表达式 ? 表达式T: 表达式F;
// 交换赋值
变量名1 <-->变量名2;
疑问:交换赋值是什么
选择语句
// 条件语句 1
if (表达式) 语句;
// 条件语句 2
if (表达式) 语句;
else 语句;
// 开关语句
switch (表达式) {
case 值1: 语句序列1; break;
case 值2: 语句序列2; break;
...
case 值n: 语句序列n; break;
default: 语句序列n+1;
}
循环语句
// for语句
for (表达式1; 条件; 表达式2) 语句;
// while语句
while (条件) 语句;
// do-while语句
do {
语句序列
} while (条件);
结束语句
// 函数结束语句
return 表达式;
return;
case 或循环结束语句 break;
异常结束语句 exit (异常代码);
输入输出语句
输入输出语句使用 C++流式输入输出的形式:
// 输入语句
cin>>变量1>>...>>变量n;
// 输出语句
cout<<表达式1<<...<<表达式n;
基本函数
// 求最大值
Max (表达式1, ..., 表达式n)
// 求最小值
Min (表达式1, ..., 表达式n)
抽象数据类型的定义、表示和实现
以复数为例,给出一个完整的 ADT 定义、表示和实现。
定义部分
ADT Complex {
数据对象:D = {e1,e2|e1,e2∈R, R是实数集}
数据关系:S = {<e1,e2>|e1是复数的实部,e2是复数的虚部}
基本操作:
Create (&C, x, y)
操作结果:构造复数C,其实部和虚部分别被赋以参数x和y的值。
GetReal (C)
初始条件:复数C已存在。
操作结果:返回复数C的实部值。
GetImag (C)
初始条件:复数C已存在。
操作结果:返回复数C的虚部值。
Add (C1, C2)
初始条件:C1, C2是复数。
操作结果:返回两个复数C1和C2的和。
Sub (C1, C2)
初始条件:C1, C2是复数。
操作结果:返回两个复数C1和C2的差。
} ADT Complex
表示部分
typedef struct { // 复数类型
float Realpart; // 实部
float Imagepart; // 虚部
} Complex;
实现部分
// 构造一个复数
void Create (&Complex C, float x, float y) {
C.Realpart = x;
C.Imagepart = y;
}
// 取复数的实部
float GetReal (Complex C) {
return C.Realpart;
}
// 取复数的虚部
float GetImage (Complex C) {
return C.Imagepart;
}
// 求两个复数C1和C2的和sum
Complex Add (Complex C1, Complex C2) {
Complex sum;
sum.Realpart = C1.Realpart + C2.Realpart;
sum.Imagepart = C1.Imagepart + C2.Imagepart;
return sum;
}
// 求两个复数的差difference
Complex Sub (Complex C1, Complex C2) {
Complex difference;
difference.Realpart = C1.Realpart + C2.Realpart;
difference.Imagepart = C1.Imagepart + C2.Imagepart;
return difference;
}