2018-2019-1 20189221 《从问题到程序》第 8 周学习总结
第九章 结构和其他数据机制
结构(struct)、联合(union)、枚举(enum)等数据机制的概念、意义和用途,使用方法。
9.1结构(struct)
C语言的结构(structure)用于把多个类型可能不同的数据对象集合起来。C结构是由若干结构的成分或成员(可不同类型的数据项对象)组合而成的复合数据。一个(或一类)结构中的每个成员都给定了一个名字,通过成员名实现对结构成员的访问。
9.1.1结构声明与变量定义
结构描述用关键字struct引导,结构说明的 基本形式是:
struct { 成员说明序列 };
定义结构变量:
struct {
int n;
double x, y;
} st1, st2;
定义结构类型
typedef struct {
double x, y;
} POINT;
typedef struct {
POINT center;
double radius;
} CIRCLE;
typedef struct {
POINT lu;
POINT rd;
} RECTANGLE;
9.1.2结构变量的初始化和使用
结构变量也可以在定义时直接初始化。为结构提供初始值的形式与数组一样。
对结构变量的操作主要是整体赋值和结构成员访问。
访问结构成员的操作用圆点运算符(.)描述
pt2.y = pt1.y + 2.4;
circ1.center.x = 2.07;
circ1.center.y = pt1.y;
9.1.3结构、数组与指针
结构里可以包含数组成员,也可以定义以结构作为元素的数组。
两种实现方式:
用一个两维字符数组和一个计数器数组,用一个字符指针数组和一个计数器数组
可能更合理的方式——采用一种结构来表示与一个关键字有关的所有信息。
typedef struct {
char * key;
int count;
} KEYC;
9.1.4 字段
字段:使人在需要时能把几个结构成员压缩到一个基本数据类型成员里存放,这可以看作是一种数据压缩表示方式。
struct pack {
unsigned a:2;
unsigned b:8;
unsigned c:6;
} pk1, pk2;
采用字段压缩方式,通常会使访问结构成员的操作效率下降很多。
9.2结构与函数
函数处理存储在结构中的数据:
-
- 个别地将结构成员的值传递给函数处理。
-
- 将整个结构作为参数值传递给函数,一般将这种参数称作结构参数。
-
- 将结构的地址传给函数,也就是说传递指向结构的指针值。这称为结构指针参数。
9.2.1处理结构的函数
采用动态建立与管理:
- 建立的结构的存在期不受建立操作所在位置的约束
- 通过指针传递也不必做整个结构的复制。
9.2.2程序实例
int main() {
int n, inum = 0;
ACCITEM accbook[NACCOUNT];
initialization();
while ((n = getcommand()) >= 0) {
switch (n) {
case 0: /* 由用户得到账目文件名并读入 */
inum = readfile(NACCOUNT, accbook);
break;
case 1: /* 计算 终余额 */
balance(inum, accbook);
break;
case 2: /* 统计所有收入 */
receipts(inum, accbook);
break;
case 3: /* 统计所有支出 */
expenditures(inum, accbook);
break;
case 4: /* 打印大额支出,向用户要求额度限 */
printsome(inum, accbook);
break;
default: /* 错误命令。输出错误信息 */
errmessage();
break;
}
}
finalization();
return 0;
}
9.3联合(union)
一个联合是几个类型不同(也可以相同)的成员的组合,其中每个成员各有一个名字。从这些方面看,联合与结构很相似。联合与结构的差异在于它们的表示方式不同。在一个结构(变量)里,结构的各成员顺序排列存储,每个成员都有自己独立的存储位置。联合的情况不是这样,一个联合变量的所有成员共享从同一片存储区。因此一个联合变量在每个时刻里只能保存它的某一个成员的值。
union {
int n;
double x;
char c;
} u1, u2;
9.4枚举(enum)
枚举说明的基本形式是:
enum 枚举标志 {枚举常量名, ...};
9.6链接结构(自引用结构)
简单的链接结构是通过线性链接形成的表,或称链接表。
二叉树结构:
两种方式定义自引用结构:
char word[20];
int count;
typedef struct node {
char word[20];
int count;
struct node *next;
} NODE, *LINK;