第09章复杂数据类型

上传人:汽*** 文档编号:579041533 上传时间:2024-08-25 格式:PPT 页数:57 大小:1.33MB
返回 下载 相关 举报
第09章复杂数据类型_第1页
第1页 / 共57页
第09章复杂数据类型_第2页
第2页 / 共57页
第09章复杂数据类型_第3页
第3页 / 共57页
第09章复杂数据类型_第4页
第4页 / 共57页
第09章复杂数据类型_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《第09章复杂数据类型》由会员分享,可在线阅读,更多相关《第09章复杂数据类型(57页珍藏版)》请在金锄头文库上搜索。

1、第第第第9 9 9 9章章章章 复杂数据类型复杂数据类型复杂数据类型复杂数据类型C C C C数数数数据据据据类类类类型型型型指针类型指针类型指针类型指针类型空类型空类型空类型空类型voidvoid定义类型定义类型定义类型定义类型typedeftypedef构造类型构造类型构造类型构造类型枚举类型枚举类型枚举类型枚举类型enumenum数组数组数组数组结构体结构体结构体结构体structstruct共用体共用体共用体共用体unionunion基本类型基本类型基本类型基本类型字符类型字符类型字符类型字符类型charchar实型实型实型实型单精度型单精度型单精度型单精度型floatfloat双精度

2、型双精度型双精度型双精度型doubledouble整整整整 型型型型短整型短整型短整型短整型shortshort长整型长整型长整型长整型longlong整型整型整型整型intint只能定义单一的只能定义单一的只能定义单一的只能定义单一的数据类型,反映数据类型,反映数据类型,反映数据类型,反映事物单一属性事物单一属性事物单一属性事物单一属性第第9 9章:复杂数据类型章:复杂数据类型u学习的意义学习的意义 如定义学生成绩:如定义学生成绩:如定义学生成绩:如定义学生成绩: float score;float score;能定义复杂的数能定义复杂的数能定义复杂的数能定义复杂的数据类型,反映事据类型,反

3、映事据类型,反映事据类型,反映事物多个属性物多个属性物多个属性物多个属性如定义学生信息:如定义学生信息:如定义学生信息:如定义学生信息:structstruct STU STU char no9; char no9; / /学号学号学号学号 char name12; char name12; / /姓名姓名姓名姓名 char sex; char sex; / /性别性别性别性别 float score; float score; / /成绩成绩成绩成绩 student; student; 复杂数据类型丰富了复杂数据类型丰富了复杂数据类型丰富了复杂数据类型丰富了C C C C语言对数据信息的处理

4、能力。语言对数据信息的处理能力。语言对数据信息的处理能力。语言对数据信息的处理能力。 离开了复杂数据类型,很多信息的描述是无法进行定义,离开了复杂数据类型,很多信息的描述是无法进行定义,离开了复杂数据类型,很多信息的描述是无法进行定义,离开了复杂数据类型,很多信息的描述是无法进行定义,更无法进行处理的。更无法进行处理的。更无法进行处理的。更无法进行处理的。 计算机中的信息表示更多是由复杂数据类型来定义的,计算机中的信息表示更多是由复杂数据类型来定义的,计算机中的信息表示更多是由复杂数据类型来定义的,计算机中的信息表示更多是由复杂数据类型来定义的,象象象象数据结构数据结构数据结构数据结构课程中的

5、链表、树、图等课程中的链表、树、图等课程中的链表、树、图等课程中的链表、树、图等 可以更好地理解数据库中的记录的含义,可以更好地理解数据库中的记录的含义,可以更好地理解数据库中的记录的含义,可以更好地理解数据库中的记录的含义, 为为为为C+C+C+C+语言中类的概念的理解提供了帮助。语言中类的概念的理解提供了帮助。语言中类的概念的理解提供了帮助。语言中类的概念的理解提供了帮助。 9.19.1 结构体结构体 结构体是结构体是结构体是结构体是一种一种一种一种构造构造构造构造数据类型数据类型数据类型数据类型 用途:用途:用途:用途:把把把把不同类型不同类型不同类型不同类型的数据组合成一个整体的数据组

6、合成一个整体的数据组合成一个整体的数据组合成一个整体-自定自定自定自定义义义义数据类型数据类型数据类型数据类型 引入结构体的好处:引入结构体的好处:引入结构体的好处:引入结构体的好处:加强数据项之间的联系加强数据项之间的联系加强数据项之间的联系加强数据项之间的联系 如学生的基本信息,包括学号、姓名、性别、年龄、班如学生的基本信息,包括学号、姓名、性别、年龄、班如学生的基本信息,包括学号、姓名、性别、年龄、班如学生的基本信息,包括学号、姓名、性别、年龄、班级、成绩等数据项。这些数据项描述了一个学生的几个不同级、成绩等数据项。这些数据项描述了一个学生的几个不同级、成绩等数据项。这些数据项描述了一个

7、学生的几个不同级、成绩等数据项。这些数据项描述了一个学生的几个不同侧面。侧面。侧面。侧面。 nononamenamesexsexageageclassnoclassnogradegrade独立的变量表示:独立的变量表示:独立的变量表示:独立的变量表示: 数据项之间无关联数据项之间无关联数据项之间无关联数据项之间无关联nononamenamesexsexageageclassnoclassnogradegrade结构体变量表示:结构体变量表示:结构体变量表示:结构体变量表示: 数据项为一个整体数据项为一个整体数据项为一个整体数据项为一个整体char no9; char no9; / /学号学号学

8、号学号char name20; char name20; / /姓名姓名姓名姓名char sex; char sex; / /性性性性别别别别unsigned unsigned intint age; age; / /年龄年龄年龄年龄unsigned unsigned intint classnoclassno; ; / /班班班班级级级级float grade; float grade; / /成绩成绩成绩成绩1 1 1 1、结构体类型的定义、结构体类型的定义、结构体类型的定义、结构体类型的定义structstruct 结构体类型名结构体类型名结构体类型名结构体类型名 数据类型名数据类型名数

9、据类型名数据类型名1 1 成员名成员名成员名成员名1 1; 数据类型名数据类型名数据类型名数据类型名2 2 成员名成员名成员名成员名2 2; 数据类型名数据类型名数据类型名数据类型名n n 成员名成员名成员名成员名n n; ;structstruct是是是是关键字关键字关键字关键字, ,不能省略不能省略不能省略不能省略合法标识符合法标识符合法标识符合法标识符可省可省可省可省: : : :无名结构体无名结构体无名结构体无名结构体成员类型可以是成员类型可以是成员类型可以是成员类型可以是基本型或构造型基本型或构造型基本型或构造型基本型或构造型以分号以分号以分号以分号; ; ; ;结尾结尾结尾结尾 例

10、例例例1 1:structstruct Student_InfoStudent_Info char no9; char no9; / /学号学号学号学号 char name20; char name20; / /姓名姓名姓名姓名 char sex; char sex; / /性别性别性别性别 unsigned unsigned intint age; age; / /年龄年龄年龄年龄 unsigned unsigned intint classnoclassno; ; / /班级班级班级班级 float grade; float grade; / /成绩成绩成绩成绩; ;例例例例2 2:str

11、uctstruct Date Date intint year; year; / /年年年年 intint month; month; / /月月月月 intint day; day; / /日日日日; ; 在结构体中数据类型相同的成员,既可逐个、逐行分别在结构体中数据类型相同的成员,既可逐个、逐行分别在结构体中数据类型相同的成员,既可逐个、逐行分别在结构体中数据类型相同的成员,既可逐个、逐行分别定义,也可合并成一行定义,就象一次定义多个变量一样。定义,也可合并成一行定义,就象一次定义多个变量一样。定义,也可合并成一行定义,就象一次定义多个变量一样。定义,也可合并成一行定义,就象一次定义多个变

12、量一样。 structstruct Student_InfoStudent_Info char no9; char no9; / /学学学学号号号号 char name20; char name20; / /姓姓姓姓名名名名 char sex; char sex; / /性别性别性别性别 unsigned unsigned intint age; age; / /年龄年龄年龄年龄 unsigned unsigned intint classnoclassno; ; / /班级班级班级班级 float grade; float grade; / /成绩成绩成绩成绩; ;structstruct

13、Student_InfoStudent_Info char no9, name20, sex; char no9, name20, sex; unsigned unsigned intint age, age, classnoclassno; ; float grade; float grade; ; ;structstruct Date Date intint year; year; / /年年年年 intint month; month; / /月月月月 intint day; day; / /日日日日; ;structstruct Date Date intint year, month

14、, day; year, month, day; ; 注意:注意:注意:注意:结构类型只是用户自定义的一种数据类型,用结构类型只是用户自定义的一种数据类型,用结构类型只是用户自定义的一种数据类型,用结构类型只是用户自定义的一种数据类型,用来定义描述结构的组织形式来定义描述结构的组织形式来定义描述结构的组织形式来定义描述结构的组织形式, , , ,不分配内存不分配内存不分配内存不分配内存,只有用它来定,只有用它来定,只有用它来定,只有用它来定义某个变量时,才会为该变量分配结构类型所需要大小义某个变量时,才会为该变量分配结构类型所需要大小义某个变量时,才会为该变量分配结构类型所需要大小义某个变量时

15、,才会为该变量分配结构类型所需要大小的内存单元。的内存单元。的内存单元。的内存单元。所占内存的大小是它所包含的成员所占内所占内存的大小是它所包含的成员所占内所占内存的大小是它所包含的成员所占内所占内存的大小是它所包含的成员所占内存大小之和存大小之和存大小之和存大小之和。 structstruct Student_InfoStudent_Info char no9, name20, sex; char no9, name20, sex; unsigned unsigned intint age, age, classnoclassno; ; float grade; float grade; ;

16、 ;structstruct Student_InfoStudent_Info student; student;例:例:例:例:2 2 2 2、结构体变量的定义和引用、结构体变量的定义和引用、结构体变量的定义和引用、结构体变量的定义和引用structstruct 结构体类型名结构体类型名结构体类型名结构体类型名 数据类型名数据类型名数据类型名数据类型名1 1 成员名成员名成员名成员名1 1; 数据类型名数据类型名数据类型名数据类型名n n 成员名成员名成员名成员名n n; ;structstruct 结构体类型名结构体类型名结构体类型名结构体类型名 变量名列表;变量名列表;变量名列表;变量名

17、列表; 结构体变量的定义结构体变量的定义结构体变量的定义结构体变量的定义l l 间接定义法:间接定义法:间接定义法:间接定义法:先定义结构类型,再定义结构变量先定义结构类型,再定义结构变量先定义结构类型,再定义结构变量先定义结构类型,再定义结构变量 9 9字节字节字节字节2020字节字节字节字节1 1字节字节字节字节2 2字节字节字节字节2 2字节字节字节字节4 4字节字节字节字节nononamenamesexsexageageclassnoclassnogradegrade内存映像内存映像内存映像内存映像(BC(BC下下下下) )structstruct student; student;s

18、tructstruct Student_InfoStudent_Info student1, student2;student1, student2;一次定义多个结构体类型变量一次定义多个结构体类型变量一次定义多个结构体类型变量一次定义多个结构体类型变量 定义指向结构体类型的指针变量定义指向结构体类型的指针变量定义指向结构体类型的指针变量定义指向结构体类型的指针变量 structstruct Student_InfoStudent_Info * *pstupstu; ; 间接定义法中几种错误的结构体变量的定义方法间接定义法中几种错误的结构体变量的定义方法间接定义法中几种错误的结构体变量的定义方

19、法间接定义法中几种错误的结构体变量的定义方法 没有结构体类型名没有结构体类型名没有结构体类型名没有结构体类型名 Student_InfoStudent_Info student; student; 缺省缺省缺省缺省structstruct关键字关键字关键字关键字 structstruct Point Point p; p;structstruct Point Point intint x, y; x, y; ; 结构类型结构类型结构类型结构类型PointPoint定义定义定义定义在后在后在后在后 2 2 2 2、结构体变量的定义和引用、结构体变量的定义和引用、结构体变量的定义和引用、结构体变量

20、的定义和引用structstruct 结构体类型名结构体类型名结构体类型名结构体类型名 数据类型名数据类型名数据类型名数据类型名1 1 成员名成员名成员名成员名1 1; 数据类型名数据类型名数据类型名数据类型名n n 成员名成员名成员名成员名n n; 变量名列表变量名列表变量名列表变量名列表; 结构体变量的定义结构体变量的定义结构体变量的定义结构体变量的定义l l 直接定义法:直接定义法:直接定义法:直接定义法:定义结构体类型的同时定义结构体变量定义结构体类型的同时定义结构体变量定义结构体类型的同时定义结构体变量定义结构体类型的同时定义结构体变量 structstruct Student_In

21、foStudent_Info char no9; char no9; / /学学学学号号号号 char name20; char name20; / /姓姓姓姓名名名名 char sex; char sex; / /性别性别性别性别 unsigned unsigned intint age; age; / /年龄年龄年龄年龄 unsigned unsigned intint classnoclassno; ; / /班级班级班级班级 float grade; float grade; / /成绩成绩成绩成绩 student1, student2student1, student2; ;stru

22、ctstruct char no9; char no9; / /学学学学号号号号 char name20; char name20; / /姓姓姓姓名名名名 char sex; char sex; / /性别性别性别性别 unsigned unsigned intint age; age; / /年龄年龄年龄年龄 unsigned unsigned intint classnoclassno; ; / /班级班级班级班级 float grade; float grade; / /成绩成绩成绩成绩 student1, student2student1, student2; ;或或或或无名结构体定

23、义,无名结构体定义,无名结构体定义,无名结构体定义,变量只能一次变量只能一次变量只能一次变量只能一次 几点说明:几点说明:几点说明:几点说明:(1) (1) 结构体类型与结构体变量概念不同结构体类型与结构体变量概念不同结构体类型与结构体变量概念不同结构体类型与结构体变量概念不同 类型类型类型类型: : 不分配内存;不分配内存;不分配内存;不分配内存; 变量变量变量变量: : 分配内分配内分配内分配内存存存存 类型类型类型类型: : 不能赋值、存取、运算不能赋值、存取、运算不能赋值、存取、运算不能赋值、存取、运算; ; 变量变量变量变量: : 可以可以可以可以(2) (2) 结构体可以嵌套结构体

24、可以嵌套结构体可以嵌套结构体可以嵌套 例例例例: structstruct date date intint month; month; intint day; day; intint year; year; ;structstruct student student intint num; num; char name20; char name20; structstruct date birthday date birthday; ; stustu; ;numnumnamenamebirthdaybirthdaymonthmonthdaydayyearyear例例例例: structstr

25、uct student student intint num; num; char name20; char name20; structstruct date date intint month; month; intint day; day; intint year; year; birthdaybirthday; ; stustu; ;numnumnamenamebirthdaybirthdaymonthmonthdaydayyearyearstructstruct Point Point intint x, y; x, y; ;structstruct ImgImg intint ta

26、g; tag; structstruct ImgImg * *pimgpimg; ; / /正确,可以包含自身类型的指针正确,可以包含自身类型的指针正确,可以包含自身类型的指针正确,可以包含自身类型的指针 structstruct ImgImg imgimg; ; / /错误,不能包含自身类型的变量错误,不能包含自身类型的变量错误,不能包含自身类型的变量错误,不能包含自身类型的变量; ;(3) (3) 结构类型中的成员名,可以与程序中的变量同名,它们结构类型中的成员名,可以与程序中的变量同名,它们结构类型中的成员名,可以与程序中的变量同名,它们结构类型中的成员名,可以与程序中的变量同名,它们代

27、表不同的对象,互不干扰代表不同的对象,互不干扰代表不同的对象,互不干扰代表不同的对象,互不干扰 structstruct Student_InfoStudent_Info student; student;char name20;char name20;(4) (4) 结构体类型及变量的作用域和生存期与基本类型变量相结构体类型及变量的作用域和生存期与基本类型变量相结构体类型及变量的作用域和生存期与基本类型变量相结构体类型及变量的作用域和生存期与基本类型变量相同同同同 例例例例 structstruct student student intint num; num; char name20;

28、char name20; char sex; char sex; intint age; age; float score; float score; char addr30; char addr30; stu1, stu2stu1, stu2; ; if (if (stu1 = stu2stu1 = stu2) ) . ( . ( ) )例例例例 structstruct student student intint num; num; char name20; char name20; char sex; char sex; intint age; age; float score; fl

29、oat score; char addr30; char addr30; stustu, *, *pstupstu = & = &stustu; ; strcpystrcpy ( (stu.namestu.name, , zhangMingzhangMing);); stu.scorestu.score = 80; = 80; pstupstu-score += 10;-score += 10; printfprintf (%s %f, (%s %f, stu.namestu.name, , (*(*pstu).scorepstu).score); ); 结构体变量的引用结构体变量的引用结构体

30、变量的引用结构体变量的引用& 引用规则引用规则引用规则引用规则l l结构体变量结构体变量结构体变量结构体变量不能整体引用不能整体引用不能整体引用不能整体引用, , , ,只能引用变量只能引用变量只能引用变量只能引用变量成员成员成员成员引用方式:引用方式:引用方式:引用方式:结构体变量名结构体变量名结构体变量名结构体变量名. . . .成员名成员名成员名成员名 / /非指针型结构体变量的引用非指针型结构体变量的引用非指针型结构体变量的引用非指针型结构体变量的引用l l可以将一个可以将一个可以将一个可以将一个结构体变量赋值给另一个结构体变量结构体变量赋值给另一个结构体变量结构体变量赋值给另一个结构

31、体变量结构体变量赋值给另一个结构体变量l l结构体嵌套时结构体嵌套时结构体嵌套时结构体嵌套时逐级引用逐级引用逐级引用逐级引用结构体指针结构体指针结构体指针结构体指针-成员名成员名成员名成员名 或或或或 (* *结构体指针)结构体指针)结构体指针)结构体指针). .成员名成员名成员名成员名/ /指针型结构体变量的引用指针型结构体变量的引用指针型结构体变量的引用指针型结构体变量的引用成员成员成员成员( ( ( (分量分量分量分量) ) ) )运算符运算符运算符运算符结合性结合性结合性结合性: : : :从左向右从左向右从左向右从左向右成员成员成员成员( ( ( (分量分量分量分量) ) ) )运算

32、符运算符运算符运算符结合性结合性结合性结合性: : : :从左向右从左向右从左向右从左向右例例例例 structstruct student student intint num; num; char name20; char name20; char sex; char sex; intint age; age; float score; float score; char addr30; char addr30; stu1, stu2stu1, stu2; ; stu1.num = 10;stu1.num = 10;stu1.score = 85.5;stu1.score = 85.5;s

33、tu1.score += stu2.score;stu1.score += stu2.score; stu1.age+; stu1.age+;例例例例 structstruct student student intint num; num; char name20; char name20; char sex; char sex; intint age; age; float score; float score; char addr30; char addr30; stu1, stu2stu1, stu2; ; printf(“%d,%s,%c,%d,%f,%sn”,printf(“%d,

34、%s,%c,%d,%f,%sn”,stu1stu1); (); ( ) )stu1=101,“Wan Lin”,M,19,87.5,“DaLian”; (stu1=101,“Wan Lin”,M,19,87.5,“DaLian”; ( ) )结构体变量名结构体变量名结构体变量名结构体变量名. .成员名成员名成员名成员名. .子成员名子成员名子成员名子成员名最低级子成员名最低级子成员名最低级子成员名最低级子成员名例例例例 structstruct student student intint num; num; char name20; char name20; char sex; char s

35、ex; intint age; age; float score; float score; char addr30; char addr30; stu1, stu2stu1, stu2; ; Stu2 = stu1; (Stu2 = stu1; ( ) )例例例例 structstruct student student intint num; num; char name20; char name20; structstruct date date intint month; month; intint day; day; intint year; year; birthdaybirthd

36、ay; ; stu1, stu2, *stu1, stu2, *pstupstu = &stu1 = &stu1; ;numnumnamenamebirthdaybirthdaymonthmonthdaydayyearyearstu1.birthday.month = 12;stu1.birthday.month = 12;pstu1-pstu1-birthday.yearbirthday.year = 2008; = 2008;注意:注意:注意:注意:在利用指针引用结构体成员时,在利用指针引用结构体成员时,在利用指针引用结构体成员时,在利用指针引用结构体成员时,- - - -和和和和 之间不

37、能有空格。之间不能有空格。之间不能有空格。之间不能有空格。3 3 3 3、结构体变量的赋值、结构体变量的赋值、结构体变量的赋值、结构体变量的赋值 结构体变量初始化赋值结构体变量初始化赋值结构体变量初始化赋值结构体变量初始化赋值l l先定义结构体类型,再定义结构体变量时赋初值先定义结构体类型,再定义结构体变量时赋初值先定义结构体类型,再定义结构体变量时赋初值先定义结构体类型,再定义结构体变量时赋初值structstruct 结构体类型名结构体类型名结构体类型名结构体类型名 初值表初值表初值表初值表 ;structstruct 结构体类型名结构体类型名结构体类型名结构体类型名 变量名变量名变量名变

38、量名 = = 成员成员成员成员1 1的值,的值,的值,的值, , 成员成员成员成员n n的值的值的值的值 ; 注意:注意:注意:注意:赋初值时,赋初值时,赋初值时,赋初值时, 中间的数据顺序必须与结构体成员中间的数据顺序必须与结构体成员中间的数据顺序必须与结构体成员中间的数据顺序必须与结构体成员的定义顺序一致,否则就会出现混乱。的定义顺序一致,否则就会出现混乱。的定义顺序一致,否则就会出现混乱。的定义顺序一致,否则就会出现混乱。structstruct Student_InfoStudent_Info stustu = 20020306, = 20020306, ZhangMingZhangM

39、ing, M, 18, 1, 90;, M, 18, 1, 90; nononamenamesexsex ageage classnoclassno gradegradestructstruct Student_InfoStudent_Info stustu = 18, = 18, ZhangMingZhangMing, M, 20020306, 1, , M, 20020306, 1, 90;90; structstruct Date Date intint year; year; / /年年年年 intint month; month; / /月月月月 intint day; day; /

40、 /日日日日; ;structstruct Stu_InfoStu_Info char no9; char no9; / /学号学号学号学号 char name20; char name20; / /姓名姓名姓名姓名 char sex; char sex; / /性别性别性别性别 structstruct Date birthday; Date birthday; / /生日生日生日生日 unsigned unsigned intint classnoclassno; ; / /班级班级班级班级 float grade; float grade; / /成绩成绩成绩成绩; ;structstr

41、uct Stu_InfoStu_Info stustu = 20020306, = 20020306, ZhangMingZhangMing, M, , M, 1986, 12, 10,1986, 12, 10, 1, 1, 90;90; 3 3 3 3、结构体变量的赋值、结构体变量的赋值、结构体变量的赋值、结构体变量的赋值 结构体变量初始化赋值结构体变量初始化赋值结构体变量初始化赋值结构体变量初始化赋值l l定义结构体类型的同时,定义结构体变量并赋初值定义结构体类型的同时,定义结构体变量并赋初值定义结构体类型的同时,定义结构体变量并赋初值定义结构体类型的同时,定义结构体变量并赋初值struc

42、tstruct 结构体类型名结构体类型名结构体类型名结构体类型名 初值表初值表初值表初值表 变量名变量名变量名变量名 = = 成员成员成员成员1 1的值,成员的值,成员的值,成员的值,成员2 2的值,的值,的值,的值, , 成员成员成员成员n n的值的值的值的值 ;structstruct Date Date intint year, month, day; year, month, day; birthday = 1986, 12, 10;birthday = 1986, 12, 10; structstruct intint year, month, day; year, month, d

43、ay; birthday = 1986, 12, 10;birthday = 1986, 12, 10; 或或或或structstruct Student_InfoStudent_Info char no9; char no9; / /学号学号学号学号 char name20; char name20; / /姓名姓名姓名姓名 char sex; char sex; / /性别性别性别性别 unsigned unsigned intint age; age; / /年龄年龄年龄年龄 unsigned unsigned intint classnoclassno; ; / /班级班级班级班级 f

44、loat grade; float grade; / /成绩成绩成绩成绩 student = student = 20020306, 20020306, ZhangMingZhangMing, M, 18, 1, 90;, M, 18, 1, 90; strcpystrcpy (stu1.no, (stu1.no, stu.nostu.no); ); strcpystrcpy (stu1.name, (stu1.name, stu.namestu.name); );stu1.sex = stu1.sex = stu.sexstu.sex; ;stu1.age = stu1.age = stu.

45、agestu.age; ;stu1.classno = stu1.classno = stu.classnostu.classno; ;stu1.grade = stu1.grade = stu.gradestu.grade;structstruct Student_InfoStudent_Info stustu; ; strcpystrcpy ( (stu.nostu.no, 20020306); , 20020306); strcpystrcpy ( (stu.namestu.name, , ZhangMingZhangMing););stu.sexstu.sex = M; = M;stu

46、.agestu.age = 18; = 18;stu.classnostu.classno = 1; = 1;stu.gradestu.grade = 90; = 90;structstruct Student_InfoStudent_Info stu1; stu1;stu1 = stu1 = stustu; ;3 3 3 3、结构体变量的赋值、结构体变量的赋值、结构体变量的赋值、结构体变量的赋值 结构体变量在程序中赋值结构体变量在程序中赋值结构体变量在程序中赋值结构体变量在程序中赋值 如果在定义结构体变量时并未对其赋初始值,那么在程如果在定义结构体变量时并未对其赋初始值,那么在程如果在定义结

47、构体变量时并未对其赋初始值,那么在程如果在定义结构体变量时并未对其赋初始值,那么在程序中要对它赋值的话,就只能一个一个地对其成员序中要对它赋值的话,就只能一个一个地对其成员序中要对它赋值的话,就只能一个一个地对其成员序中要对它赋值的话,就只能一个一个地对其成员逐一赋值逐一赋值逐一赋值逐一赋值,或者或者或者或者用已赋值的同类型的结构体变量对它赋值用已赋值的同类型的结构体变量对它赋值用已赋值的同类型的结构体变量对它赋值用已赋值的同类型的结构体变量对它赋值 逐一赋值逐一赋值逐一赋值逐一赋值 利用已赋值的结构利用已赋值的结构利用已赋值的结构利用已赋值的结构体变量赋值体变量赋值体变量赋值体变量赋值 me

48、mcpymemcpy (&stu1, &(&stu1, &stustu, , sizeof(structsizeof(struct Student_InfoStudent_Info););【例例例例】 计算学生计算学生计算学生计算学生5 5 5 5门课的平均成绩,最高分和最低分。门课的平均成绩,最高分和最低分。门课的平均成绩,最高分和最低分。门课的平均成绩,最高分和最低分。#include #include structstruct score score float grade5; float grade5; float float avegradeavegrade, , maxgradem

49、axgrade, , mingrademingrade; ; ;void main ( )void main ( ) intint i; i; structstruct score m; score m; printfprintf (input the grade of five course:n); (input the grade of five course:n); for (i = 0; i 5; i+) for (i = 0; i 5; i+) / /输入输入输入输入5 5门课的成绩门课的成绩门课的成绩门课的成绩 scanfscanf (%f, & (%f, &m.gradeim.g

50、radei);); m.avegradem.avegrade = 0; = 0; m.maxgradem.maxgrade = m.grade0; = m.grade0; m.mingradem.mingrade = m.grade0; = m.grade0; for (i = 0; i 5; i+) for (i = 0; i m.maxgradem.maxgrade) ? ) ? m.gradeim.gradei : : m.maxgradem.maxgrade; ; m.mingradem.mingrade = ( = (m.gradeim.gradei m.mingradem.ming

51、rade) ? ) ? m.gradeim.gradei : : m.mingradem.mingrade; ; m.avegradem.avegrade /= 5; /= 5; printfprintf ( (avegradeavegrade = %5.1f = %5.1f maxgrademaxgrade = %5.1f = %5.1f mingrademingrade = %5.1fn, = %5.1fn, m.avegradem.avegrade, , m.maxgradem.maxgrade, , m.mingradem.mingrade); ); 运行结果运行结果运行结果运行结果(

52、 (设设设设5 5门课的成绩为:门课的成绩为:门课的成绩为:门课的成绩为:75 80 86 90 68 )75 80 86 90 68 ):avegradeavegrade = 79.8 = 79.8 maxgrademaxgrade = 90.0 = 90.0 mingrademingrade = 68.0 = 68.0&m.gradeim.gradei 的运算顺序:的运算顺序:的运算顺序:的运算顺序:& &m.gradeim.gradei 注:注:注:注: . .和和和和 同优先级,同优先级,同优先级,同优先级,具有左结合性,高于具有左结合性,高于具有左结合性,高于具有左结合性,高于&的的

53、的的优先级优先级优先级优先级4 4 4 4、简化结构体类型名、简化结构体类型名、简化结构体类型名、简化结构体类型名 利用利用利用利用typedeftypedef语句为结构体类型起别名,这样可使定义结语句为结构体类型起别名,这样可使定义结语句为结构体类型起别名,这样可使定义结语句为结构体类型起别名,这样可使定义结构体类型的变量显得更为简洁,同时也增加程序的易读性。构体类型的变量显得更为简洁,同时也增加程序的易读性。构体类型的变量显得更为简洁,同时也增加程序的易读性。构体类型的变量显得更为简洁,同时也增加程序的易读性。 typedeftypedef语句的格式为:语句的格式为:语句的格式为:语句的格

54、式为:typedeftypedef 类型名类型名类型名类型名 类型名的别名;类型名的别名;类型名的别名;类型名的别名;必须是已经定义的数必须是已经定义的数必须是已经定义的数必须是已经定义的数据类型名或据类型名或据类型名或据类型名或C C C C语言提语言提语言提语言提供的基本类型名供的基本类型名供的基本类型名供的基本类型名 必须是合法的标识必须是合法的标识必须是合法的标识必须是合法的标识符,通常用符,通常用符,通常用符,通常用大写字大写字大写字大写字母母母母来表示来表示来表示来表示 必须必须必须必须以以以以分号分号分号分号结尾结尾结尾结尾 typedeftypedef intint INTEG

55、ER; INTEGER; /INTEGER/INTEGER是别名是别名是别名是别名typedeftypedef char * STRING char * STRING /STRING/STRING是别名是别名是别名是别名structstruct teacher_infoteacher_info char name20, char sex, unit30; char name20, char sex, unit30; unsigned unsigned intint age, age, workyearsworkyears; ; float salary; float salary; ;type

56、deftypedef structstruct teacher_infoteacher_info TEACHER; TEACHER; /TEACHER/TEACHER是别名是别名是别名是别名INTEGER a; INTEGER a; / /相当于相当于相当于相当于intint a; a;STRING STRING strstr; ; / /相当于相当于相当于相当于char *char *strstr; ;TEACHER t; TEACHER t; / /相当于相当于相当于相当于structstruct teacher_infoteacher_info t; t;typedeftypedef c

57、har ARRAY81; char ARRAY81; /ARRAY/ARRAY是别名是别名是别名是别名ARRAY ARRAY strstr; ; / /相当于相当于相当于相当于char str81;char str81;5 5 5 5、结构体数组、结构体数组、结构体数组、结构体数组 结构体数组的每一个元素都是具有相同结构体类型的下标结构体数组的每一个元素都是具有相同结构体类型的下标结构体数组的每一个元素都是具有相同结构体类型的下标结构体数组的每一个元素都是具有相同结构体类型的下标结构变量。结构变量。结构变量。结构变量。 结构体数组的定义结构体数组的定义结构体数组的定义结构体数组的定义三种形式:

58、三种形式:三种形式:三种形式:ageagenononamenamesexsexclassnoclassnogradegradeageagenononamenamesexsexclassnoclassnogradegradestu0stu0stu9stu9形式一:形式一:形式一:形式一:structstruct Student_InfoStudent_Info char no9, name20, sex; char no9, name20, sex; unsigned unsigned intint age, age, classnoclassno; ; float grade; float g

59、rade; ; ;structstruct Student_InfoStudent_Info stu10; stu10;形式二:形式二:形式二:形式二:structstruct Student_InfoStudent_Info char no9, name20, sex; char no9, name20, sex; unsigned unsigned intint age, age, classnoclassno; ; float grade; float grade; stu10;stu10;形式三:形式三:形式三:形式三:structstruct char no9, name20, se

60、x; char no9, name20, sex; unsigned unsigned intint age, age, classnoclassno; ; float grade; float grade; stu10;stu10; 结构体数组与二维表的对应关系结构体数组与二维表的对应关系结构体数组与二维表的对应关系结构体数组与二维表的对应关系 结构体数组就相当于一张二维表,一个表的框架对应的就结构体数组就相当于一张二维表,一个表的框架对应的就结构体数组就相当于一张二维表,一个表的框架对应的就结构体数组就相当于一张二维表,一个表的框架对应的就是某种结构体类型,表中的每一列对应该结构体的成员,

61、表中是某种结构体类型,表中的每一列对应该结构体的成员,表中是某种结构体类型,表中的每一列对应该结构体的成员,表中是某种结构体类型,表中的每一列对应该结构体的成员,表中每一行信息对应该结构体数组元素各成员的具体值,表中的行每一行信息对应该结构体数组元素各成员的具体值,表中的行每一行信息对应该结构体数组元素各成员的具体值,表中的行每一行信息对应该结构体数组元素各成员的具体值,表中的行数对应结构体数组的大小。数对应结构体数组的大小。数对应结构体数组的大小。数对应结构体数组的大小。 nononamenamesexsexageageclassnoclassnogradegrade结构体类型结构体类型结构

62、体类型结构体类型Student_InfoStudent_Infostu0stu0 stu1stu1 stu9stu9 structstruct Student_InfoStudent_Info char no9; char no9; char name20; char name20; char sex; char sex; unsigned unsigned intint age; age; unsigned unsigned intint classnoclassno; ; float grade; float grade; stu10;stu10; 结构体数组的初始化结构体数组的初始化结构

63、体数组的初始化结构体数组的初始化初始化的格式为初始化的格式为初始化的格式为初始化的格式为: : : : structstruct 结构体类型名结构体类型名结构体类型名结构体类型名 ;structstruct 结构体类型名结构体类型名结构体类型名结构体类型名 结构体数组结构体数组结构体数组结构体数组size = size = 初值表初值表初值表初值表11, , 初值表初值表初值表初值表nn;structstruct 结构体类型名结构体类型名结构体类型名结构体类型名 结构体数组结构体数组结构体数组结构体数组size = size = 初值表初值表初值表初值表11, 初值表初值表初值表初值表22,

64、, 初值表初值表初值表初值表nn;或或或或structstruct Student_InfoStudent_Info stu3 = 20020306, stu3 = 20020306, ZhangMingZhangMing, M, 18, 1, 90, , M, 18, 1, 90, 20020307, 20020307, WangHaiWangHai, M, 17, 1, 85, M, 17, 1, 85, 20020308, 20020308, LiHongLiHong, F, 18, 2, 95;, F, 18, 2, 95;例:例:例:例:分行初始化分行初始化分行初始化分行初始化str

65、uctstruct Student_InfoStudent_Info stustu = 20020306, = 20020306, ZhangMingZhangMing, M, 18, 1, 90, , M, 18, 1, 90, 20020307, 20020307, WangHaiWangHai, M, 17, 1, 85, M, 17, 1, 85, 20020308, 20020308, LiHongLiHong, F, 18, 2, 95;, F, 18, 2, 95;例:例:例:例:分行初始化分行初始化分行初始化分行初始化全部初始化时维数可省全部初始化时维数可省全部初始化时维数可省

66、全部初始化时维数可省structstruct Student_InfoStudent_Info stu3 = 20020306, stu3 = 20020306, ZhangMingZhangMing, M, 18, 1, 90, , M, 18, 1, 90, 20020307, 20020307, WangHaiWangHai, M, 17, 1, 85, M, 17, 1, 85, 20020308, 20020308, LiHongLiHong, F, 18, 2, 95 ;, F, 18, 2, 95 ;例:例:例:例:顺序初始化顺序初始化顺序初始化顺序初始化例:例:例:例:stru

67、ctstruct Man_InfoMan_Info / /Man_InfoMan_Info也可省略也可省略也可省略也可省略 char name20; char name20; structstruct Date Date intint year, year, intint month, month, intint day day birthday; birthday; man = man = ZhangXiangZhangXiang, 1986, 10, 29, , 1986, 10, 29, WangFeiWangFei, 1987, 12, 10 , 1987, 12, 10 ; ; 结构

68、体数组的引用结构体数组的引用结构体数组的引用结构体数组的引用引用格式为引用格式为引用格式为引用格式为: : : : 结构体数组名结构体数组名结构体数组名结构体数组名 下标下标下标下标. .成员名;成员名;成员名;成员名;structstruct Student_InfoStudent_Info char no9; char no9; char name20; char name20; char sex; char sex; unsigned unsigned intint age; age; unsigned unsigned intint classnoclassno; ; float gr

69、ade; float grade; stu10;stu10;strcpystrcpy (stu0.name, (stu0.name, WangFeiWangFei);); stu1.grade+; stu1.grade+; printfprintf (%s, stu0.name); (%s, stu0.name);【例例例例】统计侯选人选票。统计侯选人选票。统计侯选人选票。统计侯选人选票。#include #include #include #include structstruct person person char name20; char name20; / /候选人姓名候选人姓名候选

70、人姓名候选人姓名 intint count; count; / /得票数得票数得票数得票数 leader3 = Li, 0, leader3 = Li, 0, Zhang, 0, Zhang, 0, Wang, 0 ; Wang, 0 ;void main ( )void main ( ) intint i, j; i, j; char leader_name20; char leader_name20; while (1) while (1) / /统计候选人得票数统计候选人得票数统计候选人得票数统计候选人得票数 scanfscanf (%s, (%s, leader_nameleader_

71、name); ); / /输入候选人姓名输入候选人姓名输入候选人姓名输入候选人姓名 if (if (strcmp(leader_namestrcmp(leader_name, 0) = 0) , 0) = 0) / /输入为输入为输入为输入为00结束结束结束结束 break;break; for (j = 0; j 3; j+) for (j = 0; j 3; j+) / /比较是否为合法候选人比较是否为合法候选人比较是否为合法候选人比较是否为合法候选人 if (if (strcmp(leader_name,leaderj.namestrcmp(leader_name,leaderj.nam

72、e) = 0) ) = 0) / /合法合法合法合法 leaderj.countleaderj.count+; +; / /得票数加得票数加得票数加得票数加1 1 for (i = 0; i 3; i+) for (i = 0; i next = NULL; head-next = NULL; / /头节点的指针域置头节点的指针域置头节点的指针域置头节点的指针域置NULLNULL tail = head; tail = head; / /开始时尾指针指向头节点开始时尾指针指向头节点开始时尾指针指向头节点开始时尾指针指向头节点 pnewpnew-score = -score = scoresco

73、re; ; pnewpnew-next = NULL;-next = NULL; tail-next = tail-next = pnewpnew; ; tail = tail = pnewpnew; ; return (head); return (head); 【例例例例】 链表创建操作函数链表创建操作函数链表创建操作函数链表创建操作函数Create_LinkListCreate_LinkList。headheadtailtailinput the score of students:input the score of students:7070 pnewpnew7070tailtail

74、6565 pnewpnew6565tailtail7878 pnewpnew7878tailtail9090 pnewpnewtailtail90909595 pnewpnewtailtail9595-1-1 printfprintf (input the score of students:n); (input the score of students:n); while (1) while (1) / /创建学生成绩线性链表创建学生成绩线性链表创建学生成绩线性链表创建学生成绩线性链表 scanfscanf (%d, &score); (%d, &score); / /输入成绩输入成绩输入

75、成绩输入成绩 if (score 0) if (score 0) / /成绩为负成绩为负成绩为负成绩为负, ,循环退出循环退出循环退出循环退出 break;break; / /创建一新节点创建一新节点创建一新节点创建一新节点 pnewpnew = (NODE *) = (NODE *)mallocmalloc ( (sizeof(NODEsizeof(NODE);); if ( if (pnewpnew = NULL) = NULL) / /创建新节点失败创建新节点失败创建新节点失败创建新节点失败, ,则返则返则返则返回回回回 printfprintf (no enough memory!n)

76、; (no enough memory!n); return (NULL); return (NULL); 2 2 2 2、线性链表的基本操作、线性链表的基本操作、线性链表的基本操作、线性链表的基本操作 链表的插入操作链表的插入操作链表的插入操作链表的插入操作 含义:含义:含义:含义:在第在第在第在第i i个结点个结点个结点个结点N Ni i与第与第与第与第i+1i+1节点节点节点节点N Ni+1i+1之间插入一个新的之间插入一个新的之间插入一个新的之间插入一个新的结点结点结点结点N N,使线性表的长度增,使线性表的长度增,使线性表的长度增,使线性表的长度增1 1,且,且,且,且N Ni i与

77、与与与N Ni+1i+1的逻辑关系发生如的逻辑关系发生如的逻辑关系发生如的逻辑关系发生如下变化:插入前,下变化:插入前,下变化:插入前,下变化:插入前,N Ni i是是是是N Ni+1i+1的前驱,的前驱,的前驱,的前驱,N Ni+1i+1是是是是N Ni i的后继;插入后,的后继;插入后,的后继;插入后,的后继;插入后,新插入的结点新插入的结点新插入的结点新插入的结点N N成为成为成为成为N Ni i的后继、的后继、的后继、的后继、N Ni+1i+1的前驱的前驱的前驱的前驱 基本思想:基本思想:基本思想:基本思想:通过单链表的头指针通过单链表的头指针通过单链表的头指针通过单链表的头指针hea

78、dhead,首先找到链表的,首先找到链表的,首先找到链表的,首先找到链表的第一个结点;然后顺着结点的指针域找到第第一个结点;然后顺着结点的指针域找到第第一个结点;然后顺着结点的指针域找到第第一个结点;然后顺着结点的指针域找到第i i个结点,最后将个结点,最后将个结点,最后将个结点,最后将pnewpnew指向的新结点插入到第指向的新结点插入到第指向的新结点插入到第指向的新结点插入到第i i个结点之后。插入时首先将新节个结点之后。插入时首先将新节个结点之后。插入时首先将新节个结点之后。插入时首先将新节点的指针域指向第点的指针域指向第点的指针域指向第点的指针域指向第i i个结点的后继节点,然后再将第

79、个结点的后继节点,然后再将第个结点的后继节点,然后再将第个结点的后继节点,然后再将第i i个结点的个结点的个结点的个结点的指针域指向新节点。注意顺序不可颠倒。当指针域指向新节点。注意顺序不可颠倒。当指针域指向新节点。注意顺序不可颠倒。当指针域指向新节点。注意顺序不可颠倒。当i=0i=0时,表示头节时,表示头节时,表示头节时,表示头节点。点。点。点。 【例例例例】 链表插入操作函数链表插入操作函数链表插入操作函数链表插入操作函数Insert_LinkListInsert_LinkList 。void void Insert_LinkList(NODEInsert_LinkList(NODE *h

80、ead, NODE * *head, NODE *pnewpnew, , intint i) i) NODE *p; NODE *p; intint j; j; p = head; p = head; for (j = 0; j i & p != NULL; j+) for (j = 0; j next;p = p-next; if (p = NULL) / if (p = NULL) /表明链表中第表明链表中第表明链表中第表明链表中第i i个节点不存在个节点不存在个节点不存在个节点不存在 printfprintf (the %d node not (the %d node not found

81、t!nfoundt!n, i);, i); return; return; pnewpnew-next = p-next ;-next = p-next ; / /将插入节点的指针域指向第将插入节点的指针域指向第将插入节点的指针域指向第将插入节点的指针域指向第i i个节点的后继节点个节点的后继节点个节点的后继节点个节点的后继节点 p-next = p-next = pnewpnew; ; / /将第将第将第将第i i个节点的指针域指向插入节点个节点的指针域指向插入节点个节点的指针域指向插入节点个节点的指针域指向插入节点 headhead70706565787890900 01 12 23 34

82、 46565pnewpnew假设假设假设假设i = 2i = 2p pp pp p2 2 2 2、线性链表的基本操作、线性链表的基本操作、线性链表的基本操作、线性链表的基本操作 链表的删除操作链表的删除操作链表的删除操作链表的删除操作 含义:含义:含义:含义:删除链表中的第删除链表中的第删除链表中的第删除链表中的第i i个结点个结点个结点个结点N Ni i,使线性表的长度减,使线性表的长度减,使线性表的长度减,使线性表的长度减1 1。删除前,节点删除前,节点删除前,节点删除前,节点N Ni-1i-1是是是是N Ni i的前驱,的前驱,的前驱,的前驱,N Ni+1i+1是是是是N Ni i的后继

83、;删除后,结的后继;删除后,结的后继;删除后,结的后继;删除后,结点点点点N Ni+1i+1成为成为成为成为N Ni-1i-1的后继。的后继。的后继。的后继。 基本思想:基本思想:基本思想:基本思想:通过单链表的头指针通过单链表的头指针通过单链表的头指针通过单链表的头指针headhead,首先找到链表中,首先找到链表中,首先找到链表中,首先找到链表中指向第指向第指向第指向第i i个结点的前驱节点的指针个结点的前驱节点的指针个结点的前驱节点的指针个结点的前驱节点的指针p p和指向第和指向第和指向第和指向第i i个节点的指针个节点的指针个节点的指针个节点的指针q q;然后删除第然后删除第然后删除第

84、然后删除第i i个结点。删除时只需执行个结点。删除时只需执行个结点。删除时只需执行个结点。删除时只需执行p-next = q-nextp-next = q-next即可,即可,即可,即可,当然不要忘了释放节点当然不要忘了释放节点当然不要忘了释放节点当然不要忘了释放节点i i的内存单元。注意当的内存单元。注意当的内存单元。注意当的内存单元。注意当i=0i=0时,表示头节时,表示头节时,表示头节时,表示头节点,是不可删除的。点,是不可删除的。点,是不可删除的。点,是不可删除的。 【例例例例】链表删除操作函数链表删除操作函数链表删除操作函数链表删除操作函数Delete_LinkListDelete_

85、LinkList 。void void Delete_LinkList(NODEDelete_LinkList(NODE *head, *head, intint i) i) NODE *p,*q; NODE *p,*q; intint j; j; if (i = 0) return; if (i = 0) return; / /删除的是头指针,则返回删除的是头指针,则返回删除的是头指针,则返回删除的是头指针,则返回 p = head;p = head; / /将将将将p p指向要删除的第指向要删除的第指向要删除的第指向要删除的第i i个节点的前驱节点个节点的前驱节点个节点的前驱节点个节点的前

86、驱节点 for (j = 1; j next != NULL; j+) for (j = 1; j next != NULL; j+) p = p-next; p = p-next; if (p-next = NULL) if (p-next = NULL) / /表明链表中第表明链表中第表明链表中第表明链表中第i i个节点不存个节点不存个节点不存个节点不存在在在在 printfprintf (the %d node not (the %d node not foundt!nfoundt!n, i);, i); return; return; headhead70706565787890900

87、 01 12 23 34 4假设假设假设假设i = 2i = 2p p q = p-next;q = p-next; /q/q指向待删除的节点指向待删除的节点指向待删除的节点指向待删除的节点i i p-next = q-next ; p-next = q-next ; / /删除节点删除节点删除节点删除节点i i free(qfree(q); ); / /释放节点释放节点释放节点释放节点i i的内存单元的内存单元的内存单元的内存单元 p pq q2 2 2 2、线性链表的基本操作、线性链表的基本操作、线性链表的基本操作、线性链表的基本操作 链表的输出操作链表的输出操作链表的输出操作链表的输出操

88、作 含义:含义:含义:含义:将链表中节点的数据域的值显示出来。如果在输将链表中节点的数据域的值显示出来。如果在输将链表中节点的数据域的值显示出来。如果在输将链表中节点的数据域的值显示出来。如果在输出过程中,对数据进行相应的比较,则可实现对链表的检索出过程中,对数据进行相应的比较,则可实现对链表的检索出过程中,对数据进行相应的比较,则可实现对链表的检索出过程中,对数据进行相应的比较,则可实现对链表的检索操作。操作。操作。操作。 基本思想:基本思想:基本思想:基本思想:通过单链表的头指针通过单链表的头指针通过单链表的头指针通过单链表的头指针headhead,使指针,使指针,使指针,使指针p p指向

89、实际指向实际指向实际指向实际数据链表的第一个节点,输出其数据值,接着数据链表的第一个节点,输出其数据值,接着数据链表的第一个节点,输出其数据值,接着数据链表的第一个节点,输出其数据值,接着p p又指向下一个又指向下一个又指向下一个又指向下一个节点,输出其数据值,如此进行下去,直到尾节点的数据项节点,输出其数据值,如此进行下去,直到尾节点的数据项节点,输出其数据值,如此进行下去,直到尾节点的数据项节点,输出其数据值,如此进行下去,直到尾节点的数据项输出完为止,即输出完为止,即输出完为止,即输出完为止,即p p为为为为NULLNULL为止。为止。为止。为止。 void void Display_L

90、inkList(NODEDisplay_LinkList(NODE *head) *head) NODE *p; NODE *p; for (p = head-next; p != NULL; p = p-next) for (p = head-next; p != NULL; p = p-next) printfprintf (%d , p-score); (%d , p-score); printfprintf (n); (n); 【例例例例】链表输出操作函数链表输出操作函数链表输出操作函数链表输出操作函数Display_LinkListDisplay_LinkList 。2 2 2 2、

91、线性链表的基本操作、线性链表的基本操作、线性链表的基本操作、线性链表的基本操作 链表的销毁操作链表的销毁操作链表的销毁操作链表的销毁操作 含义:含义:含义:含义:将创建的链表从内存中释放掉,达到销毁的目的将创建的链表从内存中释放掉,达到销毁的目的将创建的链表从内存中释放掉,达到销毁的目的将创建的链表从内存中释放掉,达到销毁的目的 基本思想:基本思想:基本思想:基本思想:每次删除头节点的后继节点,最后删除头节每次删除头节点的后继节点,最后删除头节每次删除头节点的后继节点,最后删除头节每次删除头节点的后继节点,最后删除头节点。注意,不要以为只要删除了头节点就可以删除整个链表点。注意,不要以为只要删

92、除了头节点就可以删除整个链表点。注意,不要以为只要删除了头节点就可以删除整个链表点。注意,不要以为只要删除了头节点就可以删除整个链表, , , ,要知道链表是一个节点一个节点建立起来的,所以销毁它也要知道链表是一个节点一个节点建立起来的,所以销毁它也要知道链表是一个节点一个节点建立起来的,所以销毁它也要知道链表是一个节点一个节点建立起来的,所以销毁它也必须一个一个节点的删除才行。必须一个一个节点的删除才行。必须一个一个节点的删除才行。必须一个一个节点的删除才行。 void void Free_LinkList(NODEFree_LinkList(NODE *head) *head) NODE

93、*p, *q; NODE *p, *q; p = head; p = head; while (p-next != NULL) while (p-next != NULL) q = p-next; q = p-next; p-next = q-next; p-next = q-next; free (q); free (q); free (head); free (head); 【例例例例】链表销毁操作函数链表销毁操作函数链表销毁操作函数链表销毁操作函数Free_LinkListFree_LinkList 。headhead70706565787890900 01 12 23 34 4p pq

94、 qq qq qq q3 3 3 3、线性链表应用举例、线性链表应用举例、线性链表应用举例、线性链表应用举例【例例例例】 建立一个学生成绩的线性链表,然后对其进行插入、建立一个学生成绩的线性链表,然后对其进行插入、建立一个学生成绩的线性链表,然后对其进行插入、建立一个学生成绩的线性链表,然后对其进行插入、删除、显示,最后销毁该链表。删除、显示,最后销毁该链表。删除、显示,最后销毁该链表。删除、显示,最后销毁该链表。#include #include #include #include structstruct Grade_InfoGrade_Info intint score; score;

95、structstruct Grade_InfoGrade_Info *next; *next; typedeftypedef structstruct Grade_InfoGrade_Info NODE; NODE; NODE *NODE *Create_LinkListCreate_LinkList ( ); ( );void void Insert_LinkListInsert_LinkList (NODE *head, (NODE *head, NODE * NODE *pnewpnew, , intint i); i);void void Delete_LinkListDelete_L

96、inkList (NODE *head, (NODE *head, intint i); i); void void Display_LinkListDisplay_LinkList (NODE *head); (NODE *head);void void Free_LinkListFree_LinkList (NODE *head); (NODE *head); void main ( )void main ( ) NODE *head, * NODE *head, *pnewpnew; ; head = head = Create_LinkListCreate_LinkList ( );

97、( ); / /创建链表创建链表创建链表创建链表 if (head = NULL) if (head = NULL) / /创建失败创建失败创建失败创建失败 return;return; printfprintf (after create: ); (after create: ); Display_LinkListDisplay_LinkList (head); (head); / /输出链表中的值输出链表中的值输出链表中的值输出链表中的值 / /新建一插入的节点新建一插入的节点新建一插入的节点新建一插入的节点 pnewpnew = (NODE *) = (NODE *)mallocmall

98、oc ( (sizeof(NODEsizeof(NODE); ); if ( if (pnewpnew = NULL) = NULL) / /创建失败创建失败创建失败创建失败, ,则返回则返回则返回则返回 printfprintf (no enough memory!n); (no enough memory!n); return; return; pnewpnew-score = 88; -score = 88; / /将新节点插入节点将新节点插入节点将新节点插入节点将新节点插入节点3 3的后面的后面的后面的后面 Insert_LinkListInsert_LinkList (head, (

99、head, pnewpnew, 3); , 3); printfprintf (after insert: ); (after insert: ); Display_LinkListDisplay_LinkList (head); (head); / /输出链表中的值输出链表中的值输出链表中的值输出链表中的值 Delete_LinkListDelete_LinkList (head, 3); (head, 3); / /删除链表中节点删除链表中节点删除链表中节点删除链表中节点3 3 printfprintf (after delete: ); (after delete: ); Display

100、_LinkListDisplay_LinkList (head); (head); / /输出链表中的值输出链表中的值输出链表中的值输出链表中的值 Free_LinkListFree_LinkList (head); (head); / /销毁链表销毁链表销毁链表销毁链表 运行结果运行结果运行结果运行结果( (假设输入为:假设输入为:假设输入为:假设输入为:70 65 78 90 95 85 -1 )70 65 78 90 95 85 -1 ):after createafter create:70 65 78 90 95 8570 65 78 90 95 85after insertafte

101、r insert:70 65 78 88 90 95 8570 65 78 88 90 95 85after deleteafter delete:70 65 88 90 95 8570 65 88 90 95 859.49.4 联合体联合体l l 构造数据类型,也叫构造数据类型,也叫构造数据类型,也叫构造数据类型,也叫共用体共用体共用体共用体l l 用途:用途:用途:用途:使几个不同类型的变量共占一段内存使几个不同类型的变量共占一段内存使几个不同类型的变量共占一段内存使几个不同类型的变量共占一段内存( ( ( (相互覆盖相互覆盖相互覆盖相互覆盖) ) ) )1 1 1 1、联合体类型的定义、

102、联合体类型的定义、联合体类型的定义、联合体类型的定义 union union 联合体类型名联合体类型名联合体类型名联合体类型名 数据类型名数据类型名数据类型名数据类型名1 1 成员名成员名成员名成员名1 1; 数据类型名数据类型名数据类型名数据类型名2 2 成员名成员名成员名成员名2 2; 数据类型名数据类型名数据类型名数据类型名n n 成员名成员名成员名成员名n n; ;类型定义类型定义类型定义类型定义不分配内存不分配内存不分配内存不分配内存chchi if f20002000200120012002200220032003共占共占共占共占4 4字节字节字节字节sizeof(unionsiz

103、eof(union UDataUData) = ) = sizeof(fsizeof(f) ) 联合体的大小是联合体的大小是联合体的大小是联合体的大小是成员中占内存最成员中占内存最成员中占内存最成员中占内存最大的成员的大小大的成员的大小大的成员的大小大的成员的大小 union union UDataUData short i; short i; char char chch; ; float f; float f; ;chchi if f2000200020012001200220022003200320042004200520052006200620072007共占共占共占共占7 7字节字节

104、字节字节structstruct SDataSData short i; short i; char char chch; ; float f; float f; ;2 2 2 2、联合体变量的定义和引用、联合体变量的定义和引用、联合体变量的定义和引用、联合体变量的定义和引用 联合体变量的定义联合体变量的定义联合体变量的定义联合体变量的定义形式一形式一形式一形式一: : : :union data union data short i; short i; char char chch; ; float f; float f; a, b; a, b;形式二形式二形式二形式二: : : :unio

105、n data union data short i; short i; char char chch; ; float f; float f; ; ; union data a, b, *p, d3; union data a, b, *p, d3;形式三形式三形式三形式三: : : :union union short i; short i; char char chch; ; float f; float f; a,b,ca,b,c; ;f fchchi if fchchi ia ab b共用体共用体共用体共用体变量任何时刻变量任何时刻变量任何时刻变量任何时刻只有只有只有只有一个成员一个成

106、员一个成员一个成员存在存在存在存在共用体共用体共用体共用体变量定义变量定义变量定义变量定义分配内存分配内存分配内存分配内存, , , ,长度长度长度长度= = = =最长成员最长成员最长成员最长成员所占字节数所占字节数所占字节数所占字节数 联合体变量的引用联合体变量的引用联合体变量的引用联合体变量的引用联合体变量名联合体变量名联合体变量名联合体变量名. . . .成员名成员名成员名成员名联合体指针名联合体指针名联合体指针名联合体指针名-成员名成员名成员名成员名 或或或或 (*(*(*(*联合体指针名联合体指针名联合体指针名联合体指针名).).).).成员名成员名成员名成员名 union dat

107、a union data intint i; i; char char chch; ; float f; float f; ;union data a, b, c, *p, d3;union data a, b, c, *p, d3;a.i a.i a.cha.ch a.f a.fp-i p-p-i p-chch p-f p-f(*p).i (*(*p).i (*p).chp).ch (*p).f (*p).fd0.i d0.ch d0.fd0.i d0.ch d0.f3 3 3 3、联合体变量的赋值、联合体变量的赋值、联合体变量的赋值、联合体变量的赋值 联合体变量的初始化赋值联合体变量的初始

108、化赋值联合体变量的初始化赋值联合体变量的初始化赋值 定义联合体变量时可以对变量赋初值,但定义联合体变量时可以对变量赋初值,但定义联合体变量时可以对变量赋初值,但定义联合体变量时可以对变量赋初值,但只能对变量的只能对变量的只能对变量的只能对变量的第一个成员赋初值第一个成员赋初值第一个成员赋初值第一个成员赋初值,不可象结构体变量那样对所有的成员赋,不可象结构体变量那样对所有的成员赋,不可象结构体变量那样对所有的成员赋,不可象结构体变量那样对所有的成员赋初值。初值。初值。初值。 union union UDataUData short i; short i; char char chch; ; fl

109、oat f; float f; ;union union UDataUData data = 10; data = 10; /10/10赋给成员赋给成员赋给成员赋给成员i iunion union UDataUData data = A; data = A; /A/A赋给成员赋给成员赋给成员赋给成员i i,即,即,即,即i i的值为的值为的值为的值为6565(AA的的的的ASCIIASCII码)码)码)码)union union UDataUData data = 10, A, 12.5; data = 10, A, 12.5; / /错误错误错误错误, 中只能有一个值中只能有一个值中只能有一

110、个值中只能有一个值union union UDataUData data = 10; data = 10; / /错误错误错误错误,初值必须用,初值必须用,初值必须用,初值必须用 括起来括起来括起来括起来3 3 3 3、联合体变量的赋值、联合体变量的赋值、联合体变量的赋值、联合体变量的赋值 联合体变量在程序中赋值联合体变量在程序中赋值联合体变量在程序中赋值联合体变量在程序中赋值 定义了联合体变量以后,如果要对其赋值,则只能通过定义了联合体变量以后,如果要对其赋值,则只能通过定义了联合体变量以后,如果要对其赋值,则只能通过定义了联合体变量以后,如果要对其赋值,则只能通过对其成员赋值,不可对其整体

111、赋值对其成员赋值,不可对其整体赋值对其成员赋值,不可对其整体赋值对其成员赋值,不可对其整体赋值。 具有相同联合体类型具有相同联合体类型具有相同联合体类型具有相同联合体类型的变量之间也可以相的变量之间也可以相的变量之间也可以相的变量之间也可以相互赋值。互赋值。互赋值。互赋值。 union union UDataUData short i; short i; char char chch; ; float f; float f; ;union union UDataUData data, *p, d10; data, *p, d10;data = 10; data = 10; / /错误错误错误错

112、误data = 10; data = 10; / /错误错误错误错误data.idata.i = 10; = 10; / /正确,将正确,将正确,将正确,将1010赋给赋给赋给赋给datadata的成员的成员的成员的成员i ip = &data; p = &data; /p/p指向指向指向指向datadatap-f = 12.5; p-f = 12.5; / /正确,将正确,将正确,将正确,将12.512.5赋给赋给赋给赋给datadata的成员的成员的成员的成员f fd0.ch = A d0.ch = A / /正确,将正确,将正确,将正确,将A A 赋给赋给赋给赋给d0d0的成员的成员的成

113、员的成员chchunion union UDataUData data1 = 10, data2; data1 = 10, data2;data2 = data1; data2 = data1; / /正确正确正确正确几点说明:几点说明:几点说明:几点说明: 由于联合体变量的各成员共享同一地址的内存单元,所以由于联合体变量的各成员共享同一地址的内存单元,所以由于联合体变量的各成员共享同一地址的内存单元,所以由于联合体变量的各成员共享同一地址的内存单元,所以在对其成员赋值的某一时刻,在对其成员赋值的某一时刻,在对其成员赋值的某一时刻,在对其成员赋值的某一时刻,存放的和起作用的将是最后一存放的和起

114、作用的将是最后一存放的和起作用的将是最后一存放的和起作用的将是最后一次存入的成员值次存入的成员值次存入的成员值次存入的成员值 对联合体变量的某个成员赋值时,也改变了其它成员的值,对联合体变量的某个成员赋值时,也改变了其它成员的值,对联合体变量的某个成员赋值时,也改变了其它成员的值,对联合体变量的某个成员赋值时,也改变了其它成员的值,因为它们共享一个内存地址。因为它们共享一个内存地址。因为它们共享一个内存地址。因为它们共享一个内存地址。 由于联合体变量所有成员共享同一内存空间,因此联合体由于联合体变量所有成员共享同一内存空间,因此联合体由于联合体变量所有成员共享同一内存空间,因此联合体由于联合体

115、变量所有成员共享同一内存空间,因此联合体变量与其各成员的地址相同。变量与其各成员的地址相同。变量与其各成员的地址相同。变量与其各成员的地址相同。 union union UDataUData data; data;data.idata.i = 10; = 10; data.chdata.ch = A; = A; data.fdata.f = 12.5; = 12.5;则则则则data.fdata.f的值才是有效的成员的值。的值才是有效的成员的值。的值才是有效的成员的值。的值才是有效的成员的值。union union UDataUData data; data;data.idata.i = 10

116、; = 10; data.chdata.ch = A; = A;则则则则datadata的成员的成员的成员的成员i i的值将变为的值将变为的值将变为的值将变为6565( AA的的的的ASCIIASCII码值)。码值)。码值)。码值)。union union UDataUData data; data;则则则则&data&data与与与与&data.idata.i、&data.chdata.ch、&data.fdata.f均相同均相同均相同均相同【例例例例1 1 1 1】 共用体成员间的相互影响。共用体成员间的相互影响。共用体成员间的相互影响。共用体成员间的相互影响。#include #incl

117、ude void main ( )void main ( ) unionunion long L; long L; short a; short a; char char chch; ; d = 0xFFF11241;d = 0xFFF11241; printfprintf ( (d.chd.ch = %c = %c d.ad.a = %X = %X d.Ld.L = = %Xn, %Xn, d.chd.ch, , d.ad.a, , d.Ld.L); ); d.ad.a+;+; printfprintf ( (d.chd.ch = %c = %c d.ad.a = %X = %X d.Ld.

118、L = = %Xn, %Xn, d.chd.ch, , d.ad.a, , d.Ld.L); ); chcha aL L200020002001200120022002200320030XFF0XFF0XF10XF10X120X120X410X41运行结果:运行结果:运行结果:运行结果:d.chd.ch = A = A d.ad.a = 1241 = 1241 d.Ld.L = FFF11241 = FFF11241d.chd.ch = B = B d.ad.a = 1242 = 1242 d.Ld.L = FFF11242 = FFF112420X420X42【例例例例2 2 2 2】设有一

119、个教师与学生通用的表格,教师数据有姓名、年设有一个教师与学生通用的表格,教师数据有姓名、年设有一个教师与学生通用的表格,教师数据有姓名、年设有一个教师与学生通用的表格,教师数据有姓名、年龄、职业,教研室四项。学生有姓名、年龄、职业、班级四项。龄、职业,教研室四项。学生有姓名、年龄、职业、班级四项。龄、职业,教研室四项。学生有姓名、年龄、职业、班级四项。龄、职业,教研室四项。学生有姓名、年龄、职业、班级四项。编程输入人员数据,编程输入人员数据,编程输入人员数据,编程输入人员数据, 再以表格输出。再以表格输出。再以表格输出。再以表格输出。 #include #include structstruc

120、t Stu_TeaStu_Tea char name10; char name10; / /姓名姓名姓名姓名 intint age; age; / /年龄年龄年龄年龄 char job; char job; / /工作工作工作工作s-s-表示学生表示学生表示学生表示学生,t-,t-表示教表示教表示教表示教师师师师 unionunion intint classnoclassno; ; / /学生班级号学生班级号学生班级号学生班级号 char office10; char office10; / /教师教研室名教师教研室名教师教研室名教师教研室名 depart; depart; ;void ma

121、in ( )void main ( ) structstruct Stu_TeaStu_Tea body2; body2; intint i; i; for (i = 0; i 2; i+) for (i = 0; i 2; i+) / /输入学生或教师信息输入学生或教师信息输入学生或教师信息输入学生或教师信息 printfprintf (input (input name,age,jobname,age,job and departmentn); and departmentn); scanfscanf (%s %d %c, (%s %d %c, bodyi.namebodyi.name,

122、, & &bodyi.agebodyi.age, &, &bodyi.jobbodyi.job); ); if ( if (bodyi.jobbodyi.job = s) = s) / /是学生是学生是学生是学生, ,输入班级号输入班级号输入班级号输入班级号 scanfscanf (%d, & (%d, &bodyi.depart.classnobodyi.depart.classno); ); else else / /是教师,输入教研室名是教师,输入教研室名是教师,输入教研室名是教师,输入教研室名 scanfscanf (%s, (%s, bodyi.depart.officebodyi.

123、depart.office); ); / /显示输入的学生、教师信息显示输入的学生、教师信息显示输入的学生、教师信息显示输入的学生、教师信息 printfprintf (name (nametagetage job class/officen); job class/officen); for (i = 0; i 2; i+) for (i = 0; i ”-”来引用这些成员。来引用这些成员。来引用这些成员。来引用这些成员。 注意:注意:注意:注意:不能对位域成员取地址。不能对位域成员取地址。不能对位域成员取地址。不能对位域成员取地址。 例如:例如:例如:例如:&word.aword.a是错误

124、的。是错误的。是错误的。是错误的。【例例例例】位域的应用。位域的应用。位域的应用。位域的应用。 #include #include structstruct MyStructMyStruct unsigned char a : 1; unsigned char a : 1; unsigned char b : 5; unsigned char b : 5; unsigned short c : 10; unsigned short c : 10; ;union union MyUnionMyUnion unsigned short x; unsigned short x; structstru

125、ct MyStructMyStruct y; y; ;void main ( )void main ( ) union union MyUnionMyUnion m = m = (unsigned short)0XFFF1; (unsigned short)0XFFF1; printfprintf ( (m.y.am.y.a = % = %unun, , m.y.am.y.a); ); printfprintf ( (m.y.bm.y.b = % = %unun, , m.y.bm.y.b); ); printfprintf ( (m.y.cm.y.c = % = %unun, , m.y.c

126、m.y.c); ); m.y.bm.y.b = 0; = 0; printfprintf (%Xn, (%Xn, m.xm.x); ); 运行结果运行结果运行结果运行结果( (BCBC或或或或TCTC下下下下) ):m.y.am.y.a = 1 = 1m.y.bm.y.b = 24 = 24m.y.cm.y.c = 1023 = 1023m.xm.x = FFC1 = FFC11515141413131212111110109 98 87 76 65 54 43 32 21 10 01 11 11 11 11 11 11 11 11 11 11 11 10 00 00 01 1c c ( (

127、( (VCVCVCVC下不可取下不可取下不可取下不可取) ) ) )b ba a运行结果运行结果运行结果运行结果( (VCVC下下下下) ):m.y.am.y.a = 1 = 1m.y.bm.y.b = 24 = 24m.y.cm.y.c = 0 = 0m.xm.x = FFC1 = FFC10 00 00 00 00 0注意:注意:注意:注意: 在在在在VCVC下,利用下,利用下,利用下,利用y.cy.c不可读取不可读取不可读取不可读取x x的高的高的高的高1010位数据,如果对位数据,如果对位数据,如果对位数据,如果对y.cy.c的的的的作了改变,也不会影响作了改变,也不会影响作了改变,也

128、不会影响作了改变,也不会影响x x的值,就好象的值,就好象的值,就好象的值,就好象y.cy.c与与与与x x无关一样。无关一样。无关一样。无关一样。 为了避免在不同编译环境下程序运行结果的不一致性,一为了避免在不同编译环境下程序运行结果的不一致性,一为了避免在不同编译环境下程序运行结果的不一致性,一为了避免在不同编译环境下程序运行结果的不一致性,一般将位域成员的数据类型定义为同一数据类型。例如,将程般将位域成员的数据类型定义为同一数据类型。例如,将程般将位域成员的数据类型定义为同一数据类型。例如,将程般将位域成员的数据类型定义为同一数据类型。例如,将程序中的序中的序中的序中的a a和和和和b

129、b的数据类型如果改为的数据类型如果改为的数据类型如果改为的数据类型如果改为unsigned shortunsigned short,则程序在,则程序在,则程序在,则程序在VCVC下运行的结果与下运行的结果与下运行的结果与下运行的结果与BCBC或或或或TCTC下都是相同的。下都是相同的。下都是相同的。下都是相同的。9.69.6 枚举类型变量的定义和引用枚举类型变量的定义和引用 如果一个变量只有几种可能的值,可以把它定义成枚举如果一个变量只有几种可能的值,可以把它定义成枚举如果一个变量只有几种可能的值,可以把它定义成枚举如果一个变量只有几种可能的值,可以把它定义成枚举类型。所谓类型。所谓类型。所谓

130、类型。所谓“ “枚举枚举枚举枚举” ”,顾名思义,就是把这种类型数据可取,顾名思义,就是把这种类型数据可取,顾名思义,就是把这种类型数据可取,顾名思义,就是把这种类型数据可取的值一一列举出来。的值一一列举出来。的值一一列举出来。的值一一列举出来。一个枚举型变量取值仅限于列出值的范一个枚举型变量取值仅限于列出值的范一个枚举型变量取值仅限于列出值的范一个枚举型变量取值仅限于列出值的范围围围围。枚举数据类型通常的定义形式为:。枚举数据类型通常的定义形式为:。枚举数据类型通常的定义形式为:。枚举数据类型通常的定义形式为:enumenum 枚举类型名枚举类型名枚举类型名枚举类型名 枚举元素表枚举元素表枚

131、举元素表枚举元素表 ;由多个标识符组成,标由多个标识符组成,标由多个标识符组成,标由多个标识符组成,标识符之间用识符之间用识符之间用识符之间用逗号逗号逗号逗号分开分开分开分开 定义枚举类型:定义枚举类型:定义枚举类型:定义枚举类型:enumenum weekday weekday sun, sun, monmon, , tuetue, wed, , wed, thuthu, , frifri, sat;, sat;定义枚举类型变量:定义枚举类型变量:定义枚举类型变量:定义枚举类型变量:enumenum weekday weekday today, today, nextdaynextday;

132、;enumenum weekday weekday sun, sun, monmon, , tuetue, wed, , wed, thuthu, , frifri, sat , sat today, today, nextdaynextday; ;取值取值取值取值enumenum weekday weekday sun, sun, monmon, , tuetue, wed, , wed, thuthu, , frifri, sat , sat today, today, nextdaynextday; ;today = sun;today = sun;nextdaynextday = =

133、monmon; ;if (today = sat)if (today = sat) nextdaynextday = sun; = sun;today = 100;today = 100; C C C C编译对枚举元素实际上按编译对枚举元素实际上按编译对枚举元素实际上按编译对枚举元素实际上按整型常量整型常量整型常量整型常量处理,当遇到枚举元处理,当遇到枚举元处理,当遇到枚举元处理,当遇到枚举元素列表时,编译程序就把其中素列表时,编译程序就把其中素列表时,编译程序就把其中素列表时,编译程序就把其中第一个标识符赋第一个标识符赋第一个标识符赋第一个标识符赋0 0 0 0值,第二、三、值,第二、三、值

134、,第二、三、值,第二、三、个标识符依此赋个标识符依此赋个标识符依此赋个标识符依此赋1,2,1,2,1,2,1,2,。 enumenum weekday weekday sun, sun, monmon, , tuetue, wed, , wed, thuthu, , frifri, sat , sat today, today, nextdaynextday; ;0 01 12 23 34 45 56 6today = sun;today = sun;printf(todayprintf(today = %d, today); = %d, today);运行结果:运行结果:运行结果:运行结果:

135、today = 0today = 0 if (today = 6)if (today = 6) nextdaynextday = 0; = 0;if (today = sat)if (today = sat) nextdaynextday = sun; = sun;可以在枚举类型定义时指定枚举元素的值可以在枚举类型定义时指定枚举元素的值可以在枚举类型定义时指定枚举元素的值可以在枚举类型定义时指定枚举元素的值 enumenum weekday weekday sun = 7sun = 7, , monmon = 1 = 1, , tuetue, wed, , wed, thuthu, , fri

136、fri, sat;, sat;7 71 12 23 34 45 56 6注意:注意:注意:注意: 枚举元素是常量,在程序中不可对它赋值。枚举元素是常量,在程序中不可对它赋值。枚举元素是常量,在程序中不可对它赋值。枚举元素是常量,在程序中不可对它赋值。 例如:例如:例如:例如:sun = 0; sun = 0; monmon = 1; = 1;将产生错误。将产生错误。将产生错误。将产生错误。定义枚举类型的好处:定义枚举类型的好处:定义枚举类型的好处:定义枚举类型的好处: 用标识符表示数值增加了程序的可读性用标识符表示数值增加了程序的可读性用标识符表示数值增加了程序的可读性用标识符表示数值增加了程

137、序的可读性 清晰清晰清晰清晰不清晰不清晰不清晰不清晰 可限制了变量的取值范围可限制了变量的取值范围可限制了变量的取值范围可限制了变量的取值范围 如如如如todaytoday只能取只能取只能取只能取sunsunsatsat中的值中的值中的值中的值 【例例例例1 1 1 1】 荷兰国旗问题。这是荷兰人荷兰国旗问题。这是荷兰人荷兰国旗问题。这是荷兰人荷兰国旗问题。这是荷兰人dijkstradijkstra提出的问题,荷兰国旗由提出的问题,荷兰国旗由提出的问题,荷兰国旗由提出的问题,荷兰国旗由红白蓝三色组成,现有红白蓝三色组成,现有红白蓝三色组成,现有红白蓝三色组成,现有N N个桶,每个桶中放一个小球

138、,小球是红的或白的个桶,每个桶中放一个小球,小球是红的或白的个桶,每个桶中放一个小球,小球是红的或白的个桶,每个桶中放一个小球,小球是红的或白的或蓝的,要求把这些小球重新排列,使红的排在前面,然后是白的,最后或蓝的,要求把这些小球重新排列,使红的排在前面,然后是白的,最后或蓝的,要求把这些小球重新排列,使红的排在前面,然后是白的,最后或蓝的,要求把这些小球重新排列,使红的排在前面,然后是白的,最后是蓝的,并且规定每个桶只能看一次,当然要允许两个球交换。是蓝的,并且规定每个桶只能看一次,当然要允许两个球交换。是蓝的,并且规定每个桶只能看一次,当然要允许两个球交换。是蓝的,并且规定每个桶只能看一次

139、,当然要允许两个球交换。 设计思想:设计思想:设计思想:设计思想: 用一个具有用一个具有用一个具有用一个具有N N N N个元素的数组来表示个元素的数组来表示个元素的数组来表示个元素的数组来表示N N N N个桶,数组中每个元素的值表示小个桶,数组中每个元素的值表示小个桶,数组中每个元素的值表示小个桶,数组中每个元素的值表示小球的颜色,则其取值只能是红、白、蓝三种。下面通过图来分析这个问题球的颜色,则其取值只能是红、白、蓝三种。下面通过图来分析这个问题球的颜色,则其取值只能是红、白、蓝三种。下面通过图来分析这个问题球的颜色,则其取值只能是红、白、蓝三种。下面通过图来分析这个问题的解法。的解法。

140、的解法。的解法。 r rr rw ww w? ? ?b bb brrrrnxnxlblb 这时数组元素已分成为四部分:这时数组元素已分成为四部分:这时数组元素已分成为四部分:这时数组元素已分成为四部分:已知红色(已知红色(已知红色(已知红色(r r),),),),已知白色(已知白色(已知白色(已知白色(w w),),),),已已已已知蓝色(知蓝色(知蓝色(知蓝色(b b)和和和和未检查(未检查(未检查(未检查(? ?)四类。三个指针表示最右边的红色(四类。三个指针表示最右边的红色(四类。三个指针表示最右边的红色(四类。三个指针表示最右边的红色(rrrr),最左),最左),最左),最左边的蓝色(

141、边的蓝色(边的蓝色(边的蓝色(lblb)和要检查的下一个元素()和要检查的下一个元素()和要检查的下一个元素()和要检查的下一个元素(nxnx)。)。)。)。 程序执行时,每次检查程序执行时,每次检查程序执行时,每次检查程序执行时,每次检查nxnx所指的值,如是白色(所指的值,如是白色(所指的值,如是白色(所指的值,如是白色(w w)只需将)只需将)只需将)只需将nxnx加加加加1 1,如,如,如,如是红色(是红色(是红色(是红色(r r),可把它与),可把它与),可把它与),可把它与rrrr的下一个元素互换,可先使的下一个元素互换,可先使的下一个元素互换,可先使的下一个元素互换,可先使rrr

142、r加加加加1 1,然后互换,然后互换,然后互换,然后互换rrrr和和和和nxnx所指的元素,最后把所指的元素,最后把所指的元素,最后把所指的元素,最后把nxnx加加加加1 1,因为换过来的是白色。如果,因为换过来的是白色。如果,因为换过来的是白色。如果,因为换过来的是白色。如果nxnx指的是蓝色,指的是蓝色,指的是蓝色,指的是蓝色,可以先把可以先把可以先把可以先把lblb减减减减1 1,然后互换,然后互换,然后互换,然后互换nxnx与与与与lblb位置的元素,这个蓝色值放到新的位置的元素,这个蓝色值放到新的位置的元素,这个蓝色值放到新的位置的元素,这个蓝色值放到新的lblb处。处。处。处。 由

143、于是用数组来处理这个问题,所以由于是用数组来处理这个问题,所以由于是用数组来处理这个问题,所以由于是用数组来处理这个问题,所以rrrr,lblb,nxnx都表示为下标。很明都表示为下标。很明都表示为下标。很明都表示为下标。很明显,在没有排序之前,显,在没有排序之前,显,在没有排序之前,显,在没有排序之前,rrrr应在数组元素之前,应在数组元素之前,应在数组元素之前,应在数组元素之前,lblb应在数组元素之后,可以表应在数组元素之后,可以表应在数组元素之后,可以表应在数组元素之后,可以表示为示为示为示为-1-1和和和和n n。 r rw wr rb br rw wb bb bw wr rw wb

144、 brrrrlblb算法演示:算法演示:算法演示:算法演示:nxnxrrrrnxnxr rw wnxnxrrrrnxnxlblblblbw wb bnxnxrrrrr rw wnxnxnxnxlblbr rb brrrrr rw wnxnxlblbw wb bnxnxEnd!End!#include#include enumenum color color red, white, blue; red, white, blue;void main ( )void main ( ) static static enumenum color flag20 = color flag20 = white

145、, red, red, blue, white, red, white, red, red, blue, white, red, blue, blue, white, blue, red, red, blue, blue, white, blue, red, red, white, red, blue, white, blue, red, white, red, blue, white, blue, red, blue, white ; blue, white ; enumenum color temp; color temp; intint rrrr, lb, , lb, nxnx, i;,

146、 i; rrrr = -1; = -1; lb = 20; lb = 20; nxnx = 0; = 0; 具体程序:具体程序:具体程序:具体程序: while (while (nxnx != lb) != lb) switch ( switch (flagnxflagnx) ) case red:case red: rrrr+;+; temp = temp = flagnxflagnx; ; flagnxflagnx = = flagrrflagrr; ; flagrrflagrr = temp; = temp; nxnx+;+; break; break; case white: case

147、 white: nxnx+;+; break; break; case blue:case blue: lb-; lb-; temp = temp = flagnxflagnx; ; flagnxflagnx = = flaglbflaglb; ; flaglbflaglb = temp; = temp; break; break; /switch/switch for (i = 0; i 20; i+) for (i = 0; i 20; i+) / /显示结果显示结果显示结果显示结果 switch (switch (flagiflagi) ) case red: case red: put

148、charputchar (r); (r); break; break; case white: case white: putcharputchar (w); (w); break; break; case blue: case blue: putcharputchar (b); (b); break; break; 9.79.7 复杂数据类型应用综合举例复杂数据类型应用综合举例 复杂数据类型的应用是广泛的,特别是结构体类型的应复杂数据类型的应用是广泛的,特别是结构体类型的应复杂数据类型的应用是广泛的,特别是结构体类型的应复杂数据类型的应用是广泛的,特别是结构体类型的应用更是如此。因为现实世界

149、中很多信息都是一些基本信息的用更是如此。因为现实世界中很多信息都是一些基本信息的用更是如此。因为现实世界中很多信息都是一些基本信息的用更是如此。因为现实世界中很多信息都是一些基本信息的综合体,要表示这类信息,必须要用到结构体类型,否则对综合体,要表示这类信息,必须要用到结构体类型,否则对综合体,要表示这类信息,必须要用到结构体类型,否则对综合体,要表示这类信息,必须要用到结构体类型,否则对这类信息的处理将变得非常复杂,甚至无法进行处理。下面这类信息的处理将变得非常复杂,甚至无法进行处理。下面这类信息的处理将变得非常复杂,甚至无法进行处理。下面这类信息的处理将变得非常复杂,甚至无法进行处理。下面

150、的实例是一个非常有代表性的程序,它所包含的知识从某种的实例是一个非常有代表性的程序,它所包含的知识从某种的实例是一个非常有代表性的程序,它所包含的知识从某种的实例是一个非常有代表性的程序,它所包含的知识从某种意义上来说是对我们前面所学的核心内容的集中体现,主要意义上来说是对我们前面所学的核心内容的集中体现,主要意义上来说是对我们前面所学的核心内容的集中体现,主要意义上来说是对我们前面所学的核心内容的集中体现,主要知识包括:知识包括:知识包括:知识包括: 结构体类型的定义及应用;结构体类型的定义及应用;结构体类型的定义及应用;结构体类型的定义及应用; 枚举类型的定义及应用;枚举类型的定义及应用;

151、枚举类型的定义及应用;枚举类型的定义及应用; 结构体指针(或结构体数组)的应用;结构体指针(或结构体数组)的应用;结构体指针(或结构体数组)的应用;结构体指针(或结构体数组)的应用; 二级指针的应用;二级指针的应用;二级指针的应用;二级指针的应用; 结构体指针作为函数参数;结构体指针作为函数参数;结构体指针作为函数参数;结构体指针作为函数参数; 返回结构体指针的函数;返回结构体指针的函数;返回结构体指针的函数;返回结构体指针的函数; 二级指针与动态内存分配;二级指针与动态内存分配;二级指针与动态内存分配;二级指针与动态内存分配; 动态内存的释放;动态内存的释放;动态内存的释放;动态内存的释放;

152、 结构体数组的排序方法等。结构体数组的排序方法等。结构体数组的排序方法等。结构体数组的排序方法等。【例例例例】 输入输入输入输入n n n n个学生的基本信息,然后对学生信息按成绩从个学生的基本信息,然后对学生信息按成绩从个学生的基本信息,然后对学生信息按成绩从个学生的基本信息,然后对学生信息按成绩从高到低进行排序,并将排序后的结果输出。高到低进行排序,并将排序后的结果输出。高到低进行排序,并将排序后的结果输出。高到低进行排序,并将排序后的结果输出。 #include #include #include #include enumenum SEX SEX man,femaleman,femal

153、e; ;structstruct Student_InfoStudent_Info char no9; char no9; / /学号学号学号学号 char name20; char name20; / /姓名姓名姓名姓名 enumenum SEX SEX sexsex; ; / /性别性别性别性别 unsigned unsigned intint age; age; / /年龄年龄年龄年龄 unsigned unsigned intint classnoclassno; ; / /班级班级班级班级 float grade; float grade; / /成绩成绩成绩成绩; ;typedef

154、typedef structstruct Student_InfoStudent_Info STUDENT; STUDENT;STUDENT *STUDENT *GetStuInfo(intGetStuInfo(int i); i);void void SortStuInfoSortStuInfo (STUDENT * (STUDENT *pstupstu, , intint num); num);void void FreeMemoryFreeMemory (STUDENT * (STUDENT *pstupstu, , intint num); num); void main ( )voi

155、d main ( ) STUDENT * STUDENT *pstupstu; ; intint i, num; i, num; printfprintf (input the number of the students: ); (input the number of the students: ); / /输入学生人输入学生人输入学生人输入学生人数数数数 scanfscanf (%d, &num); (%d, &num); if (num = 0) if (num = 0) / /人数小于或等于零,返回人数小于或等于零,返回人数小于或等于零,返回人数小于或等于零,返回 return;re

156、turn; / /动态建立结构体指针数组动态建立结构体指针数组动态建立结构体指针数组动态建立结构体指针数组 pstupstu = (STUDENT *) = (STUDENT *)mallocmalloc (num * (num * sizeof(STUDENTsizeof(STUDENT *); *); if ( if (pstupstu = NULL) = NULL) / /分配失败,返回分配失败,返回分配失败,返回分配失败,返回 printfprintf (not enough memory!n); (not enough memory!n); return; return; for (

157、i = 0; i num; i+) for (i = 0; i num; i+) / /建立每个学生信息的记录建立每个学生信息的记录建立每个学生信息的记录建立每个学生信息的记录 pstuipstui = = GetStuInfoGetStuInfo (i); (i); if ( if (pstuipstui = NULL) = NULL) / /分配内存失败分配内存失败分配内存失败分配内存失败 printf(notprintf(not enough memory!n); enough memory!n); FreeMemoryFreeMemory ( (pstupstu, i); , i);

158、/ /释放前面分配的内存释放前面分配的内存释放前面分配的内存释放前面分配的内存 return;return; SortStuInfoSortStuInfo ( (pstupstu, num);, num); / /对学生信息按分数从高到低排对学生信息按分数从高到低排对学生信息按分数从高到低排对学生信息按分数从高到低排序序序序 printfprintf (n=sort (n=sort result=n); result=n); for (i = 0; i num; i+) for (i = 0; i no, -no, pstuipstui-name,-name, ( (pstuipstui-se

159、x = man) ? man : female,-sex = man) ? man : female, pstuipstui-age, -age, pstuipstui-classnoclassno, , pstuipstui-grade);-grade); FreeMemoryFreeMemory ( (pstupstu, num);, num); / /释放动态分配的内存释放动态分配的内存释放动态分配的内存释放动态分配的内存 / /输入学生信息输入学生信息输入学生信息输入学生信息STUDENT *STUDENT *GetStuInfoGetStuInfo ( (intint i) i) S

160、TUDENT *p; STUDENT *p; char sex; char sex; p = (STUDENT *) p = (STUDENT *)mallocmalloc ( (sizeof(STUDENTsizeof(STUDENT);); if (p = NULL) if (p = NULL) return NULL; return NULL; printfprintf (n=input % (n=input %dthdth students information= n, i+1); students information= n, i+1); printfprintf (no: );

161、 (no: ); scanfscanf (%s, p-no); (%s, p-no); printfprintf (name: ); (name: ); scanfscanf (%s, p-name); (%s, p-name); fflushfflush ( (stdinstdin); ); / /清除键盘缓冲区清除键盘缓冲区清除键盘缓冲区清除键盘缓冲区 while ( 1 )while ( 1 ) printfprintf ( (sex(M,Fsex(M,F): );): ); scanfscanf (%c, &sex); (%c, &sex); if (sex = M | sex = F

162、) if (sex = M | sex = F) break; break; fflushfflush ( (stdinstdin); ); p-sex = (sex = M) ? man : female; p-sex = (sex = M) ? man : female; printfprintf (age: ); (age: ); scanfscanf (%d, &p-age); (%d, &p-age); printfprintf ( (classnoclassno: );: ); scanfscanf (%d, &p- (%d, &p-classnoclassno); ); prin

163、tfprintf (grade: ); (grade: ); scanfscanf (%f, &p-grade); (%f, &p-grade); return (p); return (p); / /对学生信息按分数从高到低排序对学生信息按分数从高到低排序对学生信息按分数从高到低排序对学生信息按分数从高到低排序void void SortStuInfoSortStuInfo (STUDENT * (STUDENT *pstupstu, , intint num) num) STUDENT *p; STUDENT *p; intint i, j, k; i, j, k; for (i = 0;

164、 i num-1; i+) for (i = 0; i num-1; i+) k = i; k = i; for (j = i+1; j num; j+) for (j = i+1; j grade -grade pstukpstuk-grade)-grade) k = j; k = j; if ( k != i) if ( k != i) p = p = pstuipstui; ; pstuipstui = = pstukpstuk; ; pstukpstuk = p; = p; / /释放动态分配的内存释放动态分配的内存释放动态分配的内存释放动态分配的内存void void FreeMem

165、oryFreeMemory (STUDENT * (STUDENT *pstupstu, , intint num) num) intint i; i; / /先释放每个数组元素所指向的内存块先释放每个数组元素所指向的内存块先释放每个数组元素所指向的内存块先释放每个数组元素所指向的内存块 for (i = 0; i num; i+)for (i = 0; i ”-”-”-”运算符来运算符来运算符来运算符来表示。表示。表示。表示。 结构体变量可以作为函数参数,函数也可返回指向结构体的指针变量。结构体变量可以作为函数参数,函数也可返回指向结构体的指针变量。结构体变量可以作为函数参数,函数也可返回指

166、向结构体的指针变量。结构体变量可以作为函数参数,函数也可返回指向结构体的指针变量。而联合体变量不能作为函数参数,函数也不能返回指向联合体的指针变而联合体变量不能作为函数参数,函数也不能返回指向联合体的指针变而联合体变量不能作为函数参数,函数也不能返回指向联合体的指针变而联合体变量不能作为函数参数,函数也不能返回指向联合体的指针变量。但可以使用指向联合体变量的指针,也可使用联合体数组。量。但可以使用指向联合体变量的指针,也可使用联合体数组。量。但可以使用指向联合体变量的指针,也可使用联合体数组。量。但可以使用指向联合体变量的指针,也可使用联合体数组。 结构定义允许嵌套,结构体中也可用联合体作为成

167、员,形成结构体和结构定义允许嵌套,结构体中也可用联合体作为成员,形成结构体和结构定义允许嵌套,结构体中也可用联合体作为成员,形成结构体和结构定义允许嵌套,结构体中也可用联合体作为成员,形成结构体和联合体的嵌套。联合体的嵌套。联合体的嵌套。联合体的嵌套。 链表是一种重要的数据结构,它便于实现动态的存储分配。本章介绍链表是一种重要的数据结构,它便于实现动态的存储分配。本章介绍链表是一种重要的数据结构,它便于实现动态的存储分配。本章介绍链表是一种重要的数据结构,它便于实现动态的存储分配。本章介绍是单向链表,还可组成双向链表,循环链表等。是单向链表,还可组成双向链表,循环链表等。是单向链表,还可组成双向链表,循环链表等。是单向链表,还可组成双向链表,循环链表等。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号