c语言程序设计第10章课件-

上传人:大米 文档编号:569104296 上传时间:2024-07-27 格式:PPT 页数:86 大小:610.01KB
返回 下载 相关 举报
c语言程序设计第10章课件-_第1页
第1页 / 共86页
c语言程序设计第10章课件-_第2页
第2页 / 共86页
c语言程序设计第10章课件-_第3页
第3页 / 共86页
c语言程序设计第10章课件-_第4页
第4页 / 共86页
c语言程序设计第10章课件-_第5页
第5页 / 共86页
点击查看更多>>
资源描述

《c语言程序设计第10章课件-》由会员分享,可在线阅读,更多相关《c语言程序设计第10章课件-(86页珍藏版)》请在金锄头文库上搜索。

1、第第9 9章章 结构体与共用体结构体与共用体池州师专池州师专 计算机中心计算机中心C C 语言程序设计语言程序设计1第第9章章 结构体与共用体结构体与共用体9.1 9.1 9.1 9.1 结构体结构体结构体结构体9.2 9.2 9.2 9.2 共用体共用体共用体共用体9.3 9.3 9.3 9.3 枚举类型与类型命名枚举类型与类型命名枚举类型与类型命名枚举类型与类型命名2024/7/272 一一个个学学生生的的信信息息有有学学号号、姓姓名名、性性别别、年年龄龄、住住址址、成绩成绩等。等。 一一本本图图书书的的信信息息有有分分类类编编号号、书书名名、作作者者、出出版版社社、出版日期出版日期、价格

2、价格、库存量库存量等。等。 如何描述这些类型不同的相关数据?如何描述这些类型不同的相关数据?9.1 结构体结构体9.1.1 9.1.1 结构体与结构体类型的定义结构体与结构体类型的定义结构体与结构体类型的定义结构体与结构体类型的定义信息管理信息管理信息管理信息管理结构体结构体结构体结构体一种构造类型数据一种构造类型数据 结构体结构体由若干不同类型的数据项组成,由若干不同类型的数据项组成, 构成结构体的各个数据项称为构成结构体的各个数据项称为结构体成员结构体成员。 2024/7/273 struct struct 结结构体名构体名构体名构体名 数据数据类型型1 成成员名名1; 数据数据类型型2

3、成成员名名2; 数据数据类型型n 成成员名名n; ;9.1 结构体结构体9.1.1 9.1.1 结构体与结构体类型的定义结构体与结构体类型的定义结构体与结构体类型的定义结构体与结构体类型的定义结构体类型定义的一般形式:结构体类型定义的一般形式:结构体类型定义的一般形式:结构体类型定义的一般形式: lstructstruct为关键字;为关键字;l结结构构体体名名是是用用户户定定义义的的类型标识类型标识。l 中中是是组组成成该该结结构构体体的的成成员员。成成员员的的数数据据类类型型可可以以是是C语语言言所所允允许的任何数据类型许的任何数据类型。2024/7/274例如图书类型的定义:例如图书类型的

4、定义: struct bookcard char num10; /*图书图书分类编号是字符数组类型分类编号是字符数组类型*/ char name30; /*书名是字符数组类型书名是字符数组类型*/ char author30; /*作者是字符数组类型作者是字符数组类型*/ char publisher60; /*出版社是字符数组类型出版社是字符数组类型*/ float price; /*价格是单精度实型价格是单精度实型*/ int n; /*库存量是整型库存量是整型*/ ;例如学生类型的定义:例如学生类型的定义:struct student char num8; /* 学号是学号是字符数组字符

5、数组类型类型 */ char name30; /* 姓名是姓名是字符数组字符数组类型类型 */ char sex; /* 性别是性别是字符型字符型 */ int age; /* 年龄是年龄是整型整型 */ char addr60; /* 住址是住址是字符数组字符数组类型类型 */ int score6; /* 成绩是成绩是整型数组整型数组类型类型 */ ;9.1 结构体结构体9.1.1 9.1.1 结构体与结构体类型的定义结构体与结构体类型的定义结构体与结构体类型的定义结构体与结构体类型的定义2024/7/2759.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定

6、义与初始化结构体变量的定义与初始化结构体变量的定义与初始化1. 1. 结构体类型变量的定义结构体类型变量的定义结构体类型变量的定义结构体类型变量的定义 l l利用已利用已利用已利用已定义的结构体类型名定义变量定义的结构体类型名定义变量定义的结构体类型名定义变量定义的结构体类型名定义变量 struct struct 结构体名结构体名结构体名结构体名 变量名表;变量名表;变量名表;变量名表;例如:例如:例如:例如: struct bookcard struct bookcard book1100; book1100; structstruct student student s30, t1, t2

7、; s30, t1, t2; 按按照照结结构构体体类类型型的的组组成成,系系统统为为定定义义的的结结构构体体变变量量分分配配内内存存单单元元。结结构构体体变变量量的的各各个个成成员员在在内内存存中中占占用用连连续续存存储储区区域域,结结构构体体变变量量所所占占内内存存大大大大小小小小为为为为结构体中结构体中每个成员每个成员所占用内存的所占用内存的长度之和长度之和。structstruct student studentnumnum8 8个字节个字节个字节个字节namename3030个字节个字节个字节个字节sexsex1 1个字节个字节个字节个字节ageage2 2个字节个字节个字节个字节ad

8、draddr6060个字节个字节个字节个字节scorescore1212个字节个字节个字节个字节2024/7/2769.1 结构体结构体结构体类型与变量的说明结构体类型与变量的说明结构体类型与变量的说明结构体类型与变量的说明l l类型类型类型类型与与与与变量变量变量变量是不同的概念。是不同的概念。是不同的概念。是不同的概念。应先定义一个应先定义一个结构体类型结构体类型结构体类型结构体类型,而后再定义,而后再定义结构体变量结构体变量结构体变量结构体变量。系统对系统对类型类型类型类型不分配空间,仅对不分配空间,仅对变量变量变量变量分配空间。分配空间。只能对只能对变量变量变量变量赋值、存取或运算,而

9、不能对一个赋值、存取或运算,而不能对一个类型类型类型类型赋值、存取或运算。赋值、存取或运算。l l成员成员成员成员也可以是也可以是也可以是也可以是结构变量结构变量结构变量结构变量。l l对结构中的对结构中的对结构中的对结构中的成员成员成员成员,可以单独使用,它的作用与,可以单独使用,它的作用与,可以单独使用,它的作用与,可以单独使用,它的作用与地位相当于地位相当于地位相当于地位相当于普通变量普通变量普通变量普通变量。l l成员名成员名成员名成员名可与程序中的变量名相同时,也可与可与程序中的变量名相同时,也可与可与程序中的变量名相同时,也可与可与程序中的变量名相同时,也可与不不同结构体类型的成员

10、名相同,同结构体类型的成员名相同,二者代表不同的二者代表不同的二者代表不同的二者代表不同的对象。对象。对象。对象。 struct date int year,month,day; struct student char num8; char name30; char sex; structstruct date date birthday; /* 成员为结构体类型成员为结构体类型 */ char addr60; int score6; ;numnum8 8个字节个字节个字节个字节namename3030个字节个字节个字节个字节sexsex1 1个字节个字节个字节个字节birthdaybirth

11、dayyearyear2 2个字节个字节个字节个字节monthmonth 2 2个字节个字节个字节个字节dayday2 2个字节个字节个字节个字节addraddr6060个字节个字节个字节个字节scorescore1212个字节个字节个字节个字节2024/7/2779.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化1. 1. 结构体类型变量的定义结构体类型变量的定义结构体类型变量的定义结构体类型变量的定义 l l在定义结构体类型的同时定义变量在定义结构体类型的同时定义变量在定义结构体类型的同时定义变量在定

12、义结构体类型的同时定义变量例如:例如: struct struct student student char num8,name20,sex; char num8,name20,sex; intint age; age; float score; float score; st st30;30; struct struct 结构体名结构体名结构体名结构体名 成员定义表;成员定义表;成员定义表;成员定义表; 变量名表;变量名表;变量名表;变量名表;2024/7/2789.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定

13、义与初始化1. 1. 结构体类型变量的定义结构体类型变量的定义结构体类型变量的定义结构体类型变量的定义 l l直接定义结构体类型变量直接定义结构体类型变量直接定义结构体类型变量直接定义结构体类型变量 例如:例如: struct struct char num8,name20,sex; char num8,name20,sex; intint age; age; float score; float score; st st3030, a, b, c, a, b, c; ; structstruct 成员定义表;成员定义表;成员定义表;成员定义表; 变量名表;变量名表;变量名表;变量名表;202

14、4/7/2799.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化2. 2. 结构体变量的初始化结构体变量的初始化结构体变量的初始化结构体变量的初始化 【例例例例9.49.4】结构体变量的初始化。】结构体变量的初始化。】结构体变量的初始化。】结构体变量的初始化。 struct struct date date intint year, month, day; year, month, day; structstruct student student char num8, name20, sex; char

15、 num8, name20, sex; structstruct date birthday; date birthday; float score; float score; a=9606011,Li a=9606011,Li mingming,M,1977,12,9,83,M,1977,12,9,83, b=9608025,Zhang liming,F,1978,5,10,87,c; b=9608025,Zhang liming,F,1978,5,10,87,c; 如果初值个数少于结构体成员个数,如果初值个数少于结构体成员个数,则将无初值对应的成员赋以则将无初值对应的成员赋以0值。值。 如

16、果初值个数多于结构体成员个数,如果初值个数多于结构体成员个数,则编译出错。则编译出错。2024/7/27109.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化2. 2. 结构体变量的初始化结构体变量的初始化结构体变量的初始化结构体变量的初始化 【例【例【例【例9.59.5】结结构体数构体数构体数构体数组组的初始化。的初始化。的初始化。的初始化。 struct struct s s char num8,name20,sex; char num8,name20,sex; float score; float

17、score; stustu3=9606011,Li 3=9606011,Li mingming,M,87.5,M,87.5, 9606012,Zhang 9606012,Zhang jiangguojiangguo,M,79,M,79, 9606013,Wang ping,F,90; 9606013,Wang ping,F,90; 元素的个数可以省略,根据赋初值时元素的个数可以省略,根据赋初值时结构体常量的个数确定数组元素的个数结构体常量的个数确定数组元素的个数 2024/7/27119.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与

18、初始化结构体变量的定义与初始化3. 3. 结构体变量的运算结构体变量的运算结构体变量的运算结构体变量的运算 l l用用用用sizeofsizeof运算符计算结构体变量所占内存空间运算符计算结构体变量所占内存空间运算符计算结构体变量所占内存空间运算符计算结构体变量所占内存空间 structstruct date date intint year, month, day; year, month, day;structstruct student student char num8, name20, sex; char num8, name20, sex; structstruct date bi

19、rthday; date birthday; float score; float score; a a; sizeofsizeof( (a a) ) 的结果为的结果为的结果为的结果为8+20+1+6+4=398+20+1+6+4=39 sizeofsizeof( (structstruct student student) ) 的结果为的结果为的结果为的结果为3939 2024/7/27129.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化3. 3. 结构体变量的运算结构体变量的运算结构体变量的运算结构

20、体变量的运算 l l同类型结构体变量之间的同类型结构体变量之间的同类型结构体变量之间的同类型结构体变量之间的赋值运算赋值运算赋值运算赋值运算结构体变量之间进行赋值时,系统将按成员一一对应赋值。结构体变量之间进行赋值时,系统将按成员一一对应赋值。结构体变量之间进行赋值时,系统将按成员一一对应赋值。结构体变量之间进行赋值时,系统将按成员一一对应赋值。structstruct date date intint year, month, day; year, month, day;structstruct student student char num8, name20, sex; char num

21、8, name20, sex; structstruct date birthday; date birthday; float score; float score; a=9606011,Li a=9606011,Li mingming,M,1977,12,9,83,b,c;,M,1977,12,9,83,b,c;c c = = a;a;2024/7/27139.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化3. 3. 结构体变量的运算结构体变量的运算结构体变量的运算结构体变量的运算 l l对结构体变量

22、进行对结构体变量进行对结构体变量进行对结构体变量进行取址运算取址运算取址运算取址运算 structstruct date date intint year, month, day; year, month, day;structstruct student student char num8, name20, sex; char num8, name20, sex; structstruct date birthday; date birthday; float score; float score; a; a; 对对对对结结结结构构构构体体体体变变变变量量量量a a进进进进行行行行 &a a

23、 运运运运算算算算,可可可可以以以以得得得得到到到到a a a a的的的的首首首首地址,它是结构体类型指针。地址,它是结构体类型指针。地址,它是结构体类型指针。地址,它是结构体类型指针。 2024/7/27149.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化4. 4. 结构体变量成员的引用结构体变量成员的引用结构体变量成员的引用结构体变量成员的引用 结构体变量成员引用的一般形式:结构体变量成员引用的一般形式:结构体变量成员引用的一般形式:结构体变量成员引用的一般形式: 结构体变量名结构体变量名结构体变量

24、名结构体变量名. . . .成员名成员名成员名成员名 结结构构体体变变量量a的的各各成成员员可可分分别别表表示示为为a.num、a.name、a.sex、a.birthday、a.score structstruct date date intint year, month, day; year, month, day; structstruct student student char num8, name20, sex; char num8, name20, sex; structstruct date birthday; date birthday; float score; float

25、 score; a; a;“. . . .”是分量是分量是分量是分量运算符,运算运算符,运算运算符,运算运算符,运算级别最高。级别最高。级别最高。级别最高。a.birthday.yeara.birthday.montha.birthday.day 结构体变量的各个成员可结构体变量的各个成员可结构体变量的各个成员可结构体变量的各个成员可进行何种运算,由该成员进行何种运算,由该成员进行何种运算,由该成员进行何种运算,由该成员的数据类型决定的数据类型决定的数据类型决定的数据类型决定 2024/7/27159.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构

26、体变量的定义与初始化结构体变量的定义与初始化【例例9.6】编写一个统计选票的程序。】编写一个统计选票的程序。 struct candidate char name20; /* name为候选人姓名为候选人姓名 */ int count; /* count为候选人得票数为候选人得票数 */ list =invalid,0,Zhao,0,Qian,0, Sun,0,Li,0,Zhou,0;2024/7/27169.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化main( ) int i,n; printf(E

27、nter voten); scanf(%d,&n); /* 输入所投候选人编号,编号从输入所投候选人编号,编号从1 1开始开始 */ while (n!=-1) /* 当输入编号为当输入编号为-1-1时,表示投票结束时,表示投票结束 */ if (n=1 & n=5) listn.count+; /* 有效票,则相应候选人计票成员加有效票,则相应候选人计票成员加1 1 */ else printf(invalidn); list0.count+; /* 无效票无效票,list0的计票成员加的计票成员加1 */ scanf(%d,&n); /* 输入所投候选人编号输入所投候选人编号 */ 202

28、4/7/27179.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化for (i=1; i-year pyear p-month pmonth p-dayday“-”是指向结构体成员是指向结构体成员运算符,优先级为一级运算符,优先级为一级 p=&d.year2024/7/27209.1 结构体结构体9.1.3 9.1.3 结构体的指针结构体的指针结构体的指针结构体的指针 【例【例【例【例9_9_a a】输入今天的日期,然后输出该日期。输入今天的日期,然后输出该日期。 main( ) struct date

29、/* /* 在函数中定义结构体类型在函数中定义结构体类型 */ */ int year, month, day; today,*p=&today; /* /* 定义结构体变量及其指针定义结构体变量及其指针 */ */ printf (Enter today date(YYYY/MM/DD):); scanf(%d/%d/%d,&today.year,&today.month, &today.day); printf(Today:%d/%d/%dn,p-year,p-month, p-day); 2024/7/27219.1 结构体结构体9.1.3 9.1.3 结构体的指针结构体的指针结构体的指

30、针结构体的指针3. 3. 指向结构体数组的指针指向结构体数组的指针指向结构体数组的指针指向结构体数组的指针 【例【例【例【例9.79.7】利用结构体指针输出一组化学】利用结构体指针输出一组化学】利用结构体指针输出一组化学】利用结构体指针输出一组化学 元素名称及其原子量。元素名称及其原子量。元素名称及其原子量。元素名称及其原子量。 struct struct listlist int int i; i; char name4; char name4; float w; float w; tab4=1,H,1.008,2,He,4.0026, tab4=1,H,1.008,2,He,4.0026,

31、 3,Li,6.941,4,Be,9.01218;3,Li,6.941,4,Be,9.01218;tabtab数组数组数组数组1 1H Htab0tab01.0081.0082 2HeHetab1tab14.00264.00263 3LiLitab2tab26.9416.9414 4BeBetab3tab39.012189.012182024/7/27229.1 结构体结构体9.1.3 9.1.3 结构体的指针结构体的指针结构体的指针结构体的指针3. 3. 指向结构体数组的指针指向结构体数组的指针指向结构体数组的指针指向结构体数组的指针 main( )main( ) structstruct

32、list *p; list *p; printfprintf(No(NotNametName tAtomictAtomic Weightn); Weightn); for (p=tab; ptab+4; p+) for (p=tab; p-i, pi, p-name, pname, p-w);w); tabtab数组数组数组数组1 1H Htab0tab01.0081.0082 2HeHetab1tab14.00264.00263 3LiLitab2tab26.9416.9414 4BeBetab3tab39.012189.01218pppppNo Name Atomic WeightNo N

33、ame Atomic Weight1 H 1.0082 He 4.00263 Li 6.9414 Be 9.012182024/7/27239.1 结构体结构体9.1.3 9.1.3 结构体的指针结构体的指针结构体的指针结构体的指针【例例例例9.89.8】分析自增自减运算】分析自增自减运算】分析自增自减运算】分析自增自减运算对对程序程序程序程序结结果的影响。果的影响。果的影响。果的影响。 struct struct code code intint i; i; char c; char c; a =100,A,200,B, a =100,A,200,B, 300,C,400,D; 300,C,

34、400,D;a a a a数组数组数组数组100100a0a0 AA200200a1a1 BB300300a2a2 CC400400a3a3 DD2024/7/27249.1 结构体结构体9.1.3 9.1.3 结构体的指针结构体的指针结构体的指针结构体的指针main( )main( ) structstruct code *p=a; code *p=a; printfprintf(%dt,+p-i);(%dt,+p-i); printfprintf(%ct,(+p)-c);(%ct,(+p)-c); printfprintf(%dt,(p+)-i);(%dt,(p+)-i); printfp

35、rintf(%ct,+p-c);(%ct,+p-c); printfprintf(%dt,p-i+);(%dt,p-i+); printfprintf(%dn,p-i);(%dn,p-i); a a a a数组数组数组数组100100a0a0 AA200200a1a1 BB300300a2a2 CC400400a3a3 DDp101 DD301101B200D3003012024/7/27259.1 结构体结构体9.1.4 9.1.4 函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递l l方法一:在函数之方法一:在函数之方法一:在函数之方法一:在函数之间

36、间直接直接直接直接传递结传递结构体数据。构体数据。构体数据。构体数据。 函函函函数数数数的的的的形形形形参参参参定定定定义义为为结结构构构构体体体体变变量量量量。函函函函数数数数调调用用用用时时,可可可可将将将将主主主主调调函函函函数数数数的的的的结结结结构构构构体体体体类类类类型型型型实实参参参参传传递递给给被被被被调调函函函函数数数数的的的的形参形参形参形参。 如如如如果果果果将将将将函函函函数数数数定定定定义义为为结结构构构构体体体体类类型型型型函函函函数数数数,可可可可利利利利用用用用returnreturn语语句句句句将将将将一一一一个个个个结结构构构构体体体体数数数数据据据据结结果

37、果果果返返返返回回回回到到到到主主主主调调函函函函数数数数中中中中。2024/7/27269.1 结构体结构体9.1.4 9.1.4 函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递l l方法二:在函数之方法二:在函数之方法二:在函数之方法二:在函数之间传递结间传递结构体指构体指构体指构体指针针。 形形形形参参参参定定定定义义义义为为为为指指指指向向向向结结构构构构体体体体类类型型型型的的的的指指指指针针变变变变量量量量,可可可可将将将将主主主主调调函函函函数数数数的的的的结结构构构构体体体体指指指指针针传传递递给给被被被被调调函函函函数数数数的的的的形

38、形形形参参参参变变变变量量量量,通通通通过过指指指指针针形形形形参参参参的的的的指指指指向向向向域域域域的的的的扩扩展展展展,操操操操作作作作主主主主调调函函函函数中数中数中数中结结构体构体构体构体变变量及其成量及其成量及其成量及其成员员。 如如如如果果果果将将将将函函函函数数数数定定定定义义为为结结构构构构体体体体指指指指针针型型型型函函函函数数数数,可可可可利利利利用用用用returnreturn语语句句句句将将将将被被被被调调函函函函数数数数中中中中结结构构构构体体体体变变量量量量的的的的指指指指针针返返返返回回回回给给主主主主调调函数的函数的函数的函数的结结构体指构体指构体指构体指针变

39、针变量量量量。l l方法三:利用方法三:利用方法三:利用方法三:利用全局全局全局全局结结构体构体构体构体变变量量量量传递结传递结构体数据。构体数据。构体数据。构体数据。2024/7/27279.1 结构体结构体9.1.4 9.1.4 函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递 【例例例例9.99.9】编编编编制制制制一一一一个个个个复复复复数数数数乘乘乘乘法法法法函函函函数数数数,采采采采用用用用值值值值传传传传递递递递的的的的方方方方 法传送数据。法传送数据。法传送数据。法传送数据。 struct struct complex /* comple

40、x /* 定义存放复数的结构体类型定义存放复数的结构体类型定义存放复数的结构体类型定义存放复数的结构体类型 */ */ float re; /* refloat re; /* re成员用于存放复数的实部成员用于存放复数的实部成员用于存放复数的实部成员用于存放复数的实部 */ */ float float imim; /* ; /* imim成员用于存放复数的虚部成员用于存放复数的虚部成员用于存放复数的虚部成员用于存放复数的虚部 */ */ ; ;2024/7/27289.1 结构体结构体9.1.4 9.1.4 函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的

41、传递structstruct complex multiplier( complex multiplier(structstruct complex complex cxcx, , structstruct complex cy) complex cy) structstruct complex complex czcz; ; czcz.re=.re=cxcx.re*cy.re-.re*cy.re-cxcx. .imim*cy.*cy.imim; ; czcz. .imim= =cxcx.re*cy.re*cy.imim+ +cxcx. .imim*cy.re;*cy.re; return(

42、return(czcz); ); 形参是结构体变量。调用此函数时,形参是结构体变量。调用此函数时,系统将分别为形参系统将分别为形参cx和和cy各分配一个各分配一个sizeof(struct complex) 大小的内存空间,大小的内存空间,每个成员都要一一传递。每个成员都要一一传递。 2024/7/27299.1 结构体结构体9.1.4 9.1.4 函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递main( )main( ) structstruct complex x, y, z; complex x, y, z; x.re=3.2; x.re=3.2

43、; x. x.imim=1.5;=1.5; y.re=2.7; y.re=2.7; y. y.imim=4.6;=4.6; z=multiplier(x, y); z=multiplier(x, y); printfprintf(%f+%(%f+%fi fin,z.re,z.n,z.re,z.imim); /*); /*以复数形式输出以复数形式输出以复数形式输出以复数形式输出*/*/ 2024/7/27309.1 结构体结构体9.1.4 9.1.4 函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递 【例例例例9.109.10】编编编编制制制制一一一一个个

44、个个复复复复数数数数乘乘乘乘法法法法函函函函数数数数,采采采采用用用用传传传传递递递递指指指指针针针针 的方法达到传送数据的目的。的方法达到传送数据的目的。的方法达到传送数据的目的。的方法达到传送数据的目的。 struct struct complex complex float re, float re,imim; void multiplier( void multiplier(structstruct complex * complex *pxpx, , structstruct complex * complex *pypy, , structstruct complex * comp

45、lex *pzpz) ) pzpz-re=-re=pxpx-re*-re*pypy-re-re-pxpx-imim* *pypy-imim; ; pzpz-imim= =pxpx-re*-re*pypy-imim+ +pxpx-imim* *pypy-re;-re; 形参定义为指针型参数。函数调用时,实参传递的形参定义为指针型参数。函数调用时,实参传递的是结构体指针(地址),因此形参是结构体指针(地址),因此形参px、py可读取主调函可读取主调函数中变量的内容,乘积结果也可通过形参数中变量的内容,乘积结果也可通过形参pz指针存到主指针存到主调函数中的目标变量。调函数中的目标变量。这样实参与形参

46、之间的数据传递由多值(每个成员的值)这样实参与形参之间的数据传递由多值(每个成员的值)变成了单值(结构体变量的首地址)。变成了单值(结构体变量的首地址)。 2024/7/27319.1 结构体结构体9.1.4 9.1.4 函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递main( )main( ) structstruct complex x, y, z; complex x, y, z; x.re=3.2; x.re=3.2; x. x.imim=1.5;=1.5; y.re=2.7; y.re=2.7; y. y.imim=4.6;=4.6; mul

47、tiplier(&x,&y,&z); multiplier(&x,&y,&z); printfprintf(%f+%(%f+%fi fi)*(%f+%)*(%f+%fi fi)=%f+%)=%f+%fi fin,x.re,x.n,x.re,x.imim, , y.re, y. y.re, y.imim, z.re, z., z.re, z.imim); ); 2024/7/2732 链表是一种动态数据结构,可根据需要链表是一种动态数据结构,可根据需要动态地分配存储单元。在数组中,插入或删动态地分配存储单元。在数组中,插入或删除一个元素都比较繁琐,而用链表则相对容除一个元素都比较繁琐,而用链表则

48、相对容易。但是数组元素的引用比较简单,对于链易。但是数组元素的引用比较简单,对于链表中结点数据的存取操作则相对复杂。表中结点数据的存取操作则相对复杂。 9.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表 链表中每个元素称为一个结点。链表中每个元素称为一个结点。链表中每个元素称为一个结点。链表中每个元素称为一个结点。 构成链表的结点必须是结构体类型数据。构成链表的结点必须是结构体类型数据。构成链表的结点必须是结构体类型数据。构成链表的结点必须是结构体类型数据。1. 1. 链表的基本结构链表的基本结构链表的基本结构链表的基本结构 head

49、1000 1032 3284 1296 1382 2008图图9.2 动态单向链表示意图动态单向链表示意图C3284H1296A1382I2008NNULLNULL10001032 相相相相邻邻邻邻结结结结点点点点的的的的地地地地址址址址不不不不一一一一定定定定是是是是连连连连续续续续的的的的,依依依依靠靠靠靠指指指指针针针针将将将将 它们连接起来。它们连接起来。它们连接起来。它们连接起来。struct nodechar c; struct node *next; ;2024/7/2733 C语言提供了相关的存言提供了相关的存储管理管理库函数。函数。这里里仅介介绍其中三个,它其中三个,它们的原

50、型的原型说明在明在“stdlib.h”头文件和文件和“alloc.h”头文件中,使用文件中,使用这三个函数三个函数时,应选择其中一个其中一个头文件包含到源程序中。文件包含到源程序中。 动态动态分配存分配存分配存分配存储储区函数区函数区函数区函数mallocmalloc( )( ) 函数原型:函数原型:函数原型:函数原型:voidvoid * *mallocmalloc(unsigned size);(unsigned size); 调调用格式:用格式:用格式:用格式:mallocmalloc(size)(size) 功能:在内存分配一个功能:在内存分配一个功能:在内存分配一个功能:在内存分配一

51、个sizesize字字字字节节的存的存的存的存储储区。区。区。区。调调用用用用 结结果果果果为为新分配的存新分配的存新分配的存新分配的存储储区的首地址,是一个区的首地址,是一个区的首地址,是一个区的首地址,是一个voidvoid 类类型指型指型指型指针针。若分配。若分配。若分配。若分配失败失败失败失败,则则返回返回返回返回NULLNULL(即即即即0 0)。9.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表2. 2. 动态分配和释放存储单元动态分配和释放存储单元动态分配和释放存储单元动态分配和释放存储单元 在在在在ANSI CANSI

52、CANSI CANSI C标准中,关键字标准中,关键字标准中,关键字标准中,关键字voidvoidvoidvoid有两种用法。有两种用法。有两种用法。有两种用法。第一种用法,可将无返回值的函数定义为第一种用法,可将无返回值的函数定义为第一种用法,可将无返回值的函数定义为第一种用法,可将无返回值的函数定义为voidvoidvoidvoid类型类型类型类型第二种用法,用第二种用法,用第二种用法,用第二种用法,用voidvoidvoidvoid * * * * 定义指针,这是一个指向定义指针,这是一个指向定义指针,这是一个指向定义指针,这是一个指向非具体数据类型的指针,称为无类型指针。非具体数据类型

53、的指针,称为无类型指针。非具体数据类型的指针,称为无类型指针。非具体数据类型的指针,称为无类型指针。 2024/7/2734【例例例例9.119.11】调调用用用用mallocmalloc函数分配所需存函数分配所需存函数分配所需存函数分配所需存储单储单元。元。元。元。 # #include include .h main( ) main( ) struct ststruct st intint n; n; struct ststruct st * *next;next; * *p;p; p= p=( (struct ststruct st * *) )mallocmalloc( (sizeof

54、sizeof( (struct ststruct st) ); ); p p-n=5; pn=5; p-next=NULL;next=NULL; printfprintf(p(p-n=%dn=%dtptp-next=%xn,pnext=%xn,p-n,pn,p- - - - next); next); 9.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表2. 2. 动态分配和释放存储单元动态分配和释放存储单元动态分配和释放存储单元动态分配和释放存储单元 将函数返回值转换将函数返回值转换成结构体指针成结构体指针 2024/7/2735 动态

55、动态分配存分配存分配存分配存储储区函数区函数区函数区函数calloccalloc( )( ) 函数原型:函数原型:函数原型:函数原型: voidvoid * *calloccalloc(unsigned (unsigned intint n,unsigned n,unsigned intint size); size); 调调用格式:用格式:用格式:用格式:calloccalloc(n,size)(n,size) 功能:在内存分配一个功能:在内存分配一个功能:在内存分配一个功能:在内存分配一个n n倍倍倍倍sizesize字字字字节节的存的存的存的存储储区。区。区。区。调调用用用用结结果果果果

56、为为新分配的存新分配的存新分配的存新分配的存储储区的首地址,是一个区的首地址,是一个区的首地址,是一个区的首地址,是一个voidvoid类类型指型指型指型指针针。若分配。若分配。若分配。若分配失败失败失败失败,则则返回返回返回返回NULLNULL(即即即即0 0)。9.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表2. 2. 动态分配和释放存储单元动态分配和释放存储单元动态分配和释放存储单元动态分配和释放存储单元 2024/7/2736【例例例例9.129.12】调调用用用用calloccalloc函数分配所需存函数分配所需存函数分配所

57、需存函数分配所需存储单储单元。元。元。元。 # #include include .h main( ) main( ) intint i,* i,*ipip; ; ipip=(=(intint *) *)calloccalloc(10,2); (10,2); for (i=0; i10; i+) for (i=0; i10; i+) scanfscanf(%d,(%d,ipip+i);+i); for (i=0; i10; i+) for (i=0; iname,name) gets(p-tel) p-next=NULL h=NULL T F h指向第一个指向第一个 连接新结点连接新结点 结点

58、结点 h=p q-next=p q指向新的尾结点指向新的尾结点 q=p 读入一个学生姓名读入一个学生姓名图图9.3 建立单向链表建立单向链表NULLhpChangChangChangChang62783410627834106278341062783410NULLNULLNULLNULLWangWangWangWang63212986632129866321298663212986NULLNULLNULLNULLpq 2024/7/2739 strcpystrcpy(p-name,name); /* (p-name,name); /* 为新结点中的成员赋值为新结点中的成员赋值为新结点中的成员赋

59、值为新结点中的成员赋值 */ */ printfprintf(teltel: );: ); gets(p- gets(p-teltel); ); p-next=NULL; p-next=NULL; if (h=NULL) /* h if (h=NULL) /* h为空,表示新结点为第一个结点为空,表示新结点为第一个结点为空,表示新结点为第一个结点为空,表示新结点为第一个结点 */ */ h=p; /* h=p; /* 头指针指向第一个结点头指针指向第一个结点头指针指向第一个结点头指针指向第一个结点 */ */ else /* helse /* h不为空不为空不为空不为空 */ */ q-nex

60、t=p; /* q-next=p; /* 新结点与尾结点相连接新结点与尾结点相连接新结点与尾结点相连接新结点与尾结点相连接 */ */ q=p; /* q=p; /* 使使使使q q指向新的尾结点指向新的尾结点指向新的尾结点指向新的尾结点 */ */ printfprintf(name: );(name: ); gets(name); gets(name); return h; return h; structstruct node *create( ) node *create( ) static static structstruct node *h; node *h; structstr

61、uct node *p,*q; node *p,*q; char name20; char name20; h=NULL; h=NULL; printfprintf(name: );(name: ); gets(name); gets(name); while ( while (strlenstrlen(name)!=0) /* (name)!=0) /* 当输入的姓名不是空串循环当输入的姓名不是空串循环当输入的姓名不是空串循环当输入的姓名不是空串循环 */ */ p=NEW; /* p=NEW; /* 开辟新结点开辟新结点开辟新结点开辟新结点 */ */ if (p=NULL) /* pif

62、 (p=NULL) /* p为为为为NULLNULL,新结点分配失败新结点分配失败新结点分配失败新结点分配失败 */ */ printfprintf(Allocation failuren);(Allocation failuren); exit(0); /* exit(0); /* 结束程序运行结束程序运行结束程序运行结束程序运行 */ */ # #include include .h#include #include #define NEW (#define NEW (structstruct node *) node *)mallocmalloc( (sizeofsizeof( (str

63、uctstruct node) node)structstruct node node char name20, char name20,teltel9;9; structstruct node *next; node *next; ; ;9.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表main( )main( ) structstruct node *head; node *head; head=create( ); head=create( ); 2024/7/2740【例例例例9.149.14】输输输输出出出出学学学学生生生生电

64、电电电话话话话簿簿簿簿链链链链表表表表函数。函数。函数。函数。9.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表4. 4. 输出单向链表中各结点信息输出单向链表中各结点信息输出单向链表中各结点信息输出单向链表中各结点信息 hpChangChangChangChang62783410627834106278341062783410LiLiLiLi68752341687523416875234168752341NULLNULLNULLNULLWangWangWangWang63212986632129866321298663212986 p

65、指向第一个结点指向第一个结点 p=head 当当p不为不为NULL 输出结点数据输出结点数据 p指向下一个结点指向下一个结点 p=p- -next图图9.5 输出链表的输出链表的N-S图图pppNULLNULL2024/7/2741void void prlistprlist( (structstruct node *head) node *head) structstruct node *p; node *p; p=head; p=head; while (p!=NULL) while (p!=NULL) printfprintf(%st%sn,p-name,p-(%st%sn,p-name

66、,p-teltel); ); p=p-next; p=p-next; # #include include .h#include #include #define NEW (#define NEW (structstruct node *) node *)mallocmalloc( (sizeofsizeof( (structstruct node) node)structstruct node node char name20, char name20,teltel9;9; structstruct node *next; node *next; ; ;9.1 结构体结构体9.1.5 9.1

67、.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表main( )main( ) structstruct node *head; node *head; head=create( ); head=create( ); prlistprlist(head);(head); 2024/7/2742 在链表中,如果要删除第在链表中,如果要删除第在链表中,如果要删除第在链表中,如果要删除第i i个结点,一般是将第(个结点,一般是将第(个结点,一般是将第(个结点,一般是将第(i- i-1 1)个结点直接与第(个结点直接与第(个结点直接与第(个结点直接与第(i+1i+1)个结点相连接,

68、然后再释放第个结点相连接,然后再释放第个结点相连接,然后再释放第个结点相连接,然后再释放第i i个个个个结点的存储单元结点的存储单元结点的存储单元结点的存储单元 。9.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表5. 5. 删除单向链表中指定的结点删除单向链表中指定的结点删除单向链表中指定的结点删除单向链表中指定的结点 hNULLNULL第第i-1个结点个结点 第第i个结点个结点 第第i+1个结点个结点 2024/7/2743【例【例【例【例9.159.15】删删除学生除学生除学生除学生电话电话簿簿簿簿链链 表中指定学生的信息。表中指

69、定学生的信息。表中指定学生的信息。表中指定学生的信息。9.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表 p=head while(strcmp(x,p-name)!=0 & p-next!=NULLNULL) q指针跟随指针跟随p指针后移查找指针后移查找 (q=p;p=p-next;) strcmp(x,p-name)=0 T F p=head T F head=p-next q-next=p-next 没找到没找到 free(p)图图9.9 删除链表中指定结点的删除链表中指定结点的N-S图图删除删除第一个第一个结点结点 删除中间删除

70、中间结点或尾结点或尾结点结点 删除结点工删除结点工作分两步:作分两步:查找结点查找结点删除结点删除结点学生姓名学生姓名当姓名不同并且当姓名不同并且不是尾结点循环不是尾结点循环2024/7/2744【例【例【例【例9.159.15】删删除学生除学生除学生除学生电话电话簿簿簿簿链链表中指定学生的信息。表中指定学生的信息。表中指定学生的信息。表中指定学生的信息。9.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表hpChangChangChangChang62783410627834106278341062783410LiLiLiLi68752

71、341687523416875234168752341NULLNULLNULLNULLWangWangWangWang63212986632129866321298663212986( (a) a) 删删除除除除第一个结点第一个结点第一个结点第一个结点 ( (head=phead=p-next)next)2024/7/2745【例【例【例【例9.159.15】删删除学生除学生除学生除学生电话电话簿簿簿簿链链表中指定学生的信息。表中指定学生的信息。表中指定学生的信息。表中指定学生的信息。9.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表h

72、pChangChangChangChang62783410627834106278341062783410LiLiLiLi68752341687523416875234168752341NULLNULLNULLNULLWangWangWangWang63212986632129866321298663212986( (b) b) 删删除除除除中间结点或尾结点中间结点或尾结点中间结点或尾结点中间结点或尾结点 ( (q q-next=pnext=p-next)next)p q2024/7/2746【例【例【例【例9.159.15】删删除学生除学生除学生除学生电话电话簿簿簿簿链链表中指定学生的信息。

73、表中指定学生的信息。表中指定学生的信息。表中指定学生的信息。9.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表hpChangChangChangChang62783410627834106278341062783410LiLiLiLi68752341687523416875234168752341NULLNULLNULLNULLWangWangWangWang63212986632129866321298663212986pp( (c) c) 未找到指定的结点未找到指定的结点未找到指定的结点未找到指定的结点 ( (strcmpstrcm

74、p(x,p(x,p-name)!=0)name)!=0) qq 2024/7/2747 if (if (strcmpstrcmp(x,p-name)=0)(x,p-name)=0) if (p=head) if (p=head) head=p-next; /* head=p-next; /* 删除头结点删除头结点删除头结点删除头结点 */ */ elseelse q-next=p-next; /* q-next=p-next; /* 删除中间或尾结点删除中间或尾结点删除中间或尾结点删除中间或尾结点 */ */ free(p); /* free(p); /* 释放被删除的结点释放被删除的结点释放

75、被删除的结点释放被删除的结点 */ */ elseelse printfprintf(Not found.); /* (Not found.); /* 未找到指定的结点未找到指定的结点未找到指定的结点未找到指定的结点 */ */ h=head;h=head; return h; return h; # #include include .h#include #include #define NEW (#define NEW (structstruct node *) node *)mallocmalloc( (sizeofsizeof( (structstruct node) node)str

76、uctstruct node node char name20, char name20,teltel9;9; structstruct node *next; node *next; ; ;9.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表structstruct node * node *delnodedelnode( (structstruct node *head, char *x) node *head, char *x) structstruct node *p,*q; node *p,*q; static static s

77、tructstruct node *h; node *h; if (head=NULL) if (head=NULL) printfprintf(This is a empty list.); /* (This is a empty list.); /* 空链表情况空链表情况空链表情况空链表情况 */ */ return head;return head; p=head; p=head; while ( while (strcmpstrcmp(x,p-name)!=0 & p-next!=NULL) (x,p-name)!=0 & p-next!=NULL) q=p;p=p-next; /*

78、qq=p;p=p-next; /* q指针尾随指针尾随指针尾随指针尾随p p指针向表尾移动指针向表尾移动指针向表尾移动指针向表尾移动 */ */查找结点查找结点 2024/7/2748 将一个新结点插入到链表中,首先要寻找插入的位置。将一个新结点插入到链表中,首先要寻找插入的位置。将一个新结点插入到链表中,首先要寻找插入的位置。将一个新结点插入到链表中,首先要寻找插入的位置。如果要求在第如果要求在第如果要求在第如果要求在第i i个结点前插入,可设置三个工作指针个结点前插入,可设置三个工作指针个结点前插入,可设置三个工作指针个结点前插入,可设置三个工作指针p0p0、p p和和和和q q,p0p0

79、是指向待插入结点的指针。利用是指向待插入结点的指针。利用是指向待插入结点的指针。利用是指向待插入结点的指针。利用p p和和和和q q指针查指针查指针查指针查找第找第找第找第i i个结点,找到后再将新结点链接到链表上。个结点,找到后再将新结点链接到链表上。个结点,找到后再将新结点链接到链表上。个结点,找到后再将新结点链接到链表上。 9.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表6. 6. 在在在在单向链表中单向链表中单向链表中单向链表中插入插入插入插入结点结点结点结点 hNULLNULL第第i个结点个结点ppqqp0p新的第新的第i个

80、结点个结点2024/7/2749 head=NULL T F p=head head=p0 while(strcmp(x,p-name)!=0 & p-next!=NULLNULL) p0-next q指针跟随指针跟随p指针后移查找指针后移查找 (q=p;p=p-next;) =NULL NULL strcmp(x,p-name)=0 T F p=head T F p-next=p0 head=p0 q-next=p0 p0-next=NULLNULL p0-next=p图图9.11 在链表指定位置前插入结点的在链表指定位置前插入结点的N-S图图【例【例【例【例9.169.16】在学生电话簿链

81、表中插入一个学生的】在学生电话簿链表中插入一个学生的】在学生电话簿链表中插入一个学生的】在学生电话簿链表中插入一个学生的信息。要求将新的信息插入在指定学生信息之信息。要求将新的信息插入在指定学生信息之信息。要求将新的信息插入在指定学生信息之信息。要求将新的信息插入在指定学生信息之前,如果未找到指定学生,则追加在链表尾部。前,如果未找到指定学生,则追加在链表尾部。前,如果未找到指定学生,则追加在链表尾部。前,如果未找到指定学生,则追加在链表尾部。 9.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表当姓名不同并且当姓名不同并且不是尾结点循环

82、不是尾结点循环空表时空表时插入插入结点结点在表尾在表尾追加结点追加结点 插入结点工插入结点工作分两步:作分两步:查找插查找插入位置入位置连接连接新结点新结点在表头在表头插入结点插入结点 在表中间在表中间插入结点插入结点 2024/7/2750【例例例例9.169.16】在在在在学学学学生生生生电电电电话话话话簿簿簿簿链链链链表表表表中中中中插插插插入入入入一一一一个个个个学学学学生生生生的的的的信信信信息息息息。要要要要求求求求将将将将新新新新的的的的信信信信息息息息插插插插入入入入在在在在指指指指定定定定学学学学生生生生信信信信息息息息之之之之前前前前,如如如如果果果果未未未未找找找找到到到

83、到指指指指定定定定学学学学生,则追加在链表尾部。生,则追加在链表尾部。生,则追加在链表尾部。生,则追加在链表尾部。9.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表hpChangChangChangChang62783410627834106278341062783410LiLiLiLi68752341687523416875234168752341NULLNULLNULLNULLWangWangWangWang63212986632129866321298663212986( (a) a) 在在在在表头表头表头表头插入结点插入结点插入

84、结点插入结点 ( (head=p0; p0head=p0; p0-next=p)next=p)ZhaoZhaoZhaoZhao62758421627584216275842162758421p02024/7/2751【例例例例9.169.16】在在在在学学学学生生生生电电电电话话话话簿簿簿簿链链链链表表表表中中中中插插插插入入入入一一一一个个个个学学学学生生生生的的的的信信信信息息息息。要要要要求求求求将将将将新新新新的的的的信信信信息息息息插插插插入入入入在在在在指指指指定定定定学学学学生生生生信信信信息息息息之之之之前前前前,如如如如果果果果未未未未找找找找到到到到指指指指定学生,则追加在

85、链表尾部。定学生,则追加在链表尾部。定学生,则追加在链表尾部。定学生,则追加在链表尾部。9.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表hChangChangChangChang62783410627834106278341062783410LiLiLiLi68752341687523416875234168752341NULLNULLNULLNULLWangWangWangWang63212986632129866321298663212986( (b) b) 在表中间插入结点在表中间插入结点在表中间插入结点在表中间插入结点 ( (

86、q q-next=p0; p0next=p0; p0-next=p)next=p)pqZhaoZhaoZhaoZhao62758421627584216275842162758421p02024/7/2752【例例例例9.169.16】在在在在学学学学生生生生电电电电话话话话簿簿簿簿链链链链表表表表中中中中插插插插入入入入一一一一个个个个学学学学生生生生的的的的信信信信息息息息。要要要要求求求求将将将将新新新新的的的的信信信信息息息息插插插插入入入入在在在在指指指指定定定定学学学学生生生生信信信信息息息息之之之之前前前前,如如如如果果果果未未未未找找找找到到到到指指指指定定定定学学学学生,则追

87、加在链表尾部。生,则追加在链表尾部。生,则追加在链表尾部。生,则追加在链表尾部。9.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表hpChangChangChangChang62783410627834106278341062783410LiLiLiLi68752341687523416875234168752341NULLNULLNULLNULLWangWangWangWang63212986632129866321298663212986pp( (c) c) 在表尾追加结点在表尾追加结点在表尾追加结点在表尾追加结点 ( (p p-n

88、ext=p0; p0next=p0; p0-next=next=NULLNULLNULLNULL) ) qq ZhaoZhaoZhaoZhao62758421627584216275842162758421p0ZhaoZhaoZhaoZhao62758421627584216275842162758421NULLNULLNULLNULL2024/7/2753 if ( if (strcmpstrcmp(x,p-name)=0)(x,p-name)=0) if (p=head) if (p=head) head=p0; /* head=p0; /* 在表头插入结点在表头插入结点在表头插入结点在表

89、头插入结点 */ */ elseelse q-next=p0; /* q-next=p0; /* 在表中间插入结点在表中间插入结点在表中间插入结点在表中间插入结点 */ */ p0-next=p;p0-next=p; else else p-next=p0; /* p-next=p0; /* 在表尾插入结点在表尾插入结点在表尾插入结点在表尾插入结点 */ */ p0-next=NULL;p0-next=NULL; h=head; h=head; return h; return h; structstruct node *insert( node *insert(structstruct no

90、de *head, node *head, structstruct node *p0, node *p0, char *x) char *x) structstruct node *p,*q; node *p,*q; static static structstruct node *h; node *h; if (head=NULL) if (head=NULL) head=p0; /* head=p0; /* 空表时,插入结点空表时,插入结点空表时,插入结点空表时,插入结点 */ */ p0-next=NULL;p0-next=NULL; else else p=head; p=head;

91、 while ( while (strcmpstrcmp(x,p-name)!=0 & p-next!=NULL)(x,p-name)!=0 & p-next!=NULL) q=p;p=q-next; q=p;p=q-next; 查找插入点查找插入点 9.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表# #include include .h#include #include #define NEW (#define NEW (structstruct node *) node *)mallocmalloc( (sizeofsizeof

92、( (structstruct node) node)structstruct node node char name20, char name20,teltel9;9; structstruct node *next; node *next; ; ;2024/7/27549.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表【例例例例9.179.17】学生电话簿链表管理程序。】学生电话簿链表管理程序。】学生电话簿链表管理程序。】学生电话簿链表管理程序。 编编编编制制制制此此此此程程程程序序序序可可可可利利利利用用用用例例例例9.139.1

93、3至至至至例例例例9.169.16的的的的4 4个个个个函函函函数数数数完完完完成成成成链链链链表表表表的的的的建建建建立立立立、输输输输出出出出、删删删删除除除除和和和和插插插插入入入入等等等等功功功功能能能能,这这这这里里里里只只只只需需需需编编编编制制制制一一一一个个个个mainmain函数完成对这函数完成对这函数完成对这函数完成对这4 4个函数的调用。个函数的调用。个函数的调用。个函数的调用。 # #include include .h #define NEW ( #define NEW (structstruct node *) node *)mallocmalloc( (sizeo

94、fsizeof( (structstruct node) node) struct struct node node char name20, char name20,teltel9;9; structstruct node *next; node *next; ; ;2024/7/27559.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表main( )main( ) struct struct node * node *createcreate( ),*( ),*delnodedelnode( (structstruct node *

95、, char *); node *, char *); struct struct node * node *insertinsert( (structstruct node *, node *, struct struct node *, char *); node *, char *); void void prlistprlist( (structstruct node *); node *); struct struct node * node *headhead=NULL,*=NULL,*stustu; ; char s80, char s80,namename20;20; int

96、int c; c;2024/7/27569.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表dodo do do printf printf(n * * * * MENU * * * * n);(n * * * * MENU * * * * n); printf printf( 1. Create a list n);( 1. Create a list n); printf printf( 2. Print a list n);( 2. Print a list n); printf printf( 3. Delete a node n

97、);( 3. Delete a node n); printf printf( 4. Insert a node n);( 4. Insert a node n); printf printf( 0. Quit n);( 0. Quit n); printf printf( Enter your choice(0-4): );( Enter your choice(0-4): ); gets(s); gets(s); c= c=atoiatoi(s);(s); while(c4);while(c4); 可以先选择可以先选择1 1建立建立一个链表,然后一个链表,然后根据需要选择功根据需要选择功能

98、能2 2、功能、功能3 3、功、功能能4 4、直到选择、直到选择0 0退出程序的运行退出程序的运行 2024/7/27579.1 结构体结构体9.1.5 9.1.5 结构体的应用结构体的应用结构体的应用结构体的应用链表链表链表链表 switch(c) switch(c) case 1: head= case 1: head=createcreate( ); break;( ); break; case 2: case 2: prlistprlist( (headhead); break;); break; case 3: case 3: printf printf(nInputnInput a

99、 name deleted:n); a name deleted:n); gets( gets(namename); ); headhead= =delnodedelnode(head,(head,namename); break;); break; case 4: case 4: stustu=NEW; =NEW; printfprintf(nInputnInput a new noden); a new noden); printf printf(name: ); gets(name: ); gets(stustu- - - -name);name); printfprintf(telte

100、l: ); gets(: ); gets(stustu- - - - teltel); ); stustu- - - -next=NULL;next=NULL; printf printf(nInsertnInsert positionn); positionn); printf printf(name: ); gets(name);(name: ); gets(name); headhead= =insertinsert(head,(head,stustu,name);,name); while (c);while (c); 2024/7/2758 结结构构体体类类型型解解决决了了如如何何描

101、描述述一一个个逻逻辑辑上上相相关关,但但数据类型不同的一组分量的集合。数据类型不同的一组分量的集合。 在在需需要要节节省省内内存存储储空空间间时时,c c语语言言还还提提供供了了一一种种由由若若干干个个不不同同类类型型的的数数据据项项组组成成,但但共共享享同同一一存存储储空空间间的构造类型。的构造类型。9.2 共用体共用体9.2.1 9.2.1 共用体与共用体类型的定义共用体与共用体类型的定义共用体与共用体类型的定义共用体与共用体类型的定义共用体共用体共用体共用体一种构造类型数据一种构造类型数据 共用体共用体由若干不同类型的数据项组成,由若干不同类型的数据项组成, 构成共用体的各个数据项称为构

102、成共用体的各个数据项称为共用体成员共用体成员。由于共享的特性,由于共享的特性,由于共享的特性,由于共享的特性,只有最新只有最新只有最新只有最新存储的存储的存储的存储的数据是有效的。数据是有效的。数据是有效的。数据是有效的。2024/7/2759 union union 共用共用共用共用体名体名体名体名 数据数据类型型1 成成员名名1; 数据数据类型型2 成成员名名2; 数据数据类型型n 成成员名名n; ;9.2 共用体共用体9.2.1 9.2.1 共用体与共用体类型的定义共用体与共用体类型的定义共用体与共用体类型的定义共用体与共用体类型的定义共用体类型定义的一般形式:共用体类型定义的一般形式:

103、共用体类型定义的一般形式:共用体类型定义的一般形式: lunionunion为关键字;为关键字;l共共用用体体名名是是用用户户定定义义的的类型标识类型标识。l 中中是是组组成成该该共共用用体体的的成成员员。成成员员的的数数据据类类型型可可以以是是C语语言言所所允允许的任何数据类型许的任何数据类型。2024/7/2760例如:例如: union utype int i; char ch; long l; char c4; ;9.2 共用体共用体9.2.1 9.2.1 共用体与共用体类型的定义共用体与共用体类型的定义共用体与共用体类型的定义共用体与共用体类型的定义 定义了一个定义了一个union

104、union utypeutype共用体共用体类型,共用体类型定义不分配内存类型,共用体类型定义不分配内存空间,只是说明此类型数据的组成空间,只是说明此类型数据的组成情况。情况。 2024/7/2761u1u1变量变量变量变量chchu1u1变量变量变量变量i iu1u1变量变量变量变量l l9.2 共用体共用体9.2.2 9.2.2 共用体变量的定义与初始化共用体变量的定义与初始化共用体变量的定义与初始化共用体变量的定义与初始化1. 1. 共用体变量的定义共用体变量的定义共用体变量的定义共用体变量的定义 l l利用已利用已利用已利用已定义的共用体类型名定义变量定义的共用体类型名定义变量定义的共

105、用体类型名定义变量定义的共用体类型名定义变量 union union 共用体名共用体名共用体名共用体名 变量名表;变量名表;变量名表;变量名表;例如:例如:例如:例如: union union utypeutype u1,u2;u1,u2; 按按照照共共用用体体类类型型的的组组成成,系系统统为为定定义义的的共共用用体体变变量量分分配配内内存存单单元元。共共用用体体变变量量所所占占内内存存大大大大小小小小等等等等于于于于共用体中占用内存的共用体中占用内存的长度最长的成员长度最长的成员。u1u1变量变量变量变量c cc0c0c1c1c2c2c3c32024/7/27629.2 共用体共用体9.2.

106、2 9.2.2 共用体变量的定义与初始化共用体变量的定义与初始化共用体变量的定义与初始化共用体变量的定义与初始化1. 1. 共用体变量的定义共用体变量的定义共用体变量的定义共用体变量的定义 l l在定义共用体类型的同时定义变量在定义共用体类型的同时定义变量在定义共用体类型的同时定义变量在定义共用体类型的同时定义变量例如:例如: union utype int i; char ch; long l; char c4; a, b, c; union union 共用体名共用体名共用体名共用体名 成员定义表;成员定义表;成员定义表;成员定义表; 变量名表;变量名表;变量名表;变量名表;2024/7/

107、27639.2 共用体共用体9.2.2 9.2.2 共用体变量的定义与初始化共用体变量的定义与初始化共用体变量的定义与初始化共用体变量的定义与初始化1. 1. 共用体变量的定义共用体变量的定义共用体变量的定义共用体变量的定义 l l直接定义共用体类型变量直接定义共用体类型变量直接定义共用体类型变量直接定义共用体类型变量 例如:例如: union int i; char ch; long l; char c4; a, b, c a, b, c; ; union union 成员定义表;成员定义表;成员定义表;成员定义表; 变量名表;变量名表;变量名表;变量名表;2024/7/27649.2 共用

108、体共用体9.2.2 9.2.2 共用体变量的定义与初始化共用体变量的定义与初始化共用体变量的定义与初始化共用体变量的定义与初始化2. 2. 共用体变量的运算共用体变量的运算共用体变量的运算共用体变量的运算 l l用用用用sizeofsizeof运算符计算共用体变量所占内存空间运算符计算共用体变量所占内存空间运算符计算共用体变量所占内存空间运算符计算共用体变量所占内存空间 union utype int i; char ch; long l; char c4; a, b, c; sizeofsizeof( (a a) ) 的结果为的结果为的结果为的结果为4 4 sizeofsizeof( (un

109、ion union utypeutype) ) 的结果为的结果为的结果为的结果为4 4 2024/7/27659.2 共用体共用体9.2.2 9.2.2 共用体变量的定义与初始化共用体变量的定义与初始化共用体变量的定义与初始化共用体变量的定义与初始化2. 2. 共用体变量的运算共用体变量的运算共用体变量的运算共用体变量的运算 l l同类型共用体变量之间的同类型共用体变量之间的同类型共用体变量之间的同类型共用体变量之间的赋值运算赋值运算赋值运算赋值运算 共用体变量之间进行赋值时,系统仅赋当前有效共用体变量之间进行赋值时,系统仅赋当前有效共用体变量之间进行赋值时,系统仅赋当前有效共用体变量之间进行

110、赋值时,系统仅赋当前有效成员的值成员的值成员的值成员的值( ( ( (即最新存储的数据)即最新存储的数据)即最新存储的数据)即最新存储的数据)。 union utype int i; char ch; long l; char c4; a, *p=&a;l l对共用体变量进行对共用体变量进行对共用体变量进行对共用体变量进行取址运算取址运算取址运算取址运算2024/7/27669.2 共用体共用体9.2.2 9.2.2 共用体变量的定义与初始化共用体变量的定义与初始化共用体变量的定义与初始化共用体变量的定义与初始化3. 3. 共用体变量成员的引用共用体变量成员的引用共用体变量成员的引用共用体变量

111、成员的引用 共用体变量成员的引用有三种形式。共用体变量成员的引用有三种形式。共用体变量成员的引用有三种形式。共用体变量成员的引用有三种形式。例如:例如: union uunion u char u1; char u1; intint u2; u2; x,*p=&x; x,*p=&x; 用共用体变量名的引用形式:用共用体变量名的引用形式:用共用体变量名的引用形式:用共用体变量名的引用形式: x x. .u1u1 x x. .u2u2 用共用体指针变量的引用形式用共用体指针变量的引用形式用共用体指针变量的引用形式用共用体指针变量的引用形式: ( (* *p)p). .u1 (u1 (* *p)p)

112、. .u2u2 p p-u1 pu1 p-u2u22024/7/27679.2 共用体共用体9.2.2 9.2.2 共用体变量的定义与初始化共用体变量的定义与初始化共用体变量的定义与初始化共用体变量的定义与初始化4. 4. 共用体变量赋初值共用体变量赋初值共用体变量赋初值共用体变量赋初值 【例【例【例【例9.189.18】共用体】共用体】共用体】共用体变变量量量量赋赋初初初初值值。 union u union u char u1; char u1; intint u2; u2; ; ; main( ) main( ) union u a=0x9741; union u a=0x9741; pr

113、intfprintf(1. %c %xn,a.u1,a.u2);(1. %c %xn,a.u1,a.u2); a.u1=a; a.u1=a; printfprintf(2. %c %xn,a.u1,a.u2);(2. %c %xn,a.u1,a.u2); 共用体类型变量在定义时只能对第一共用体类型变量在定义时只能对第一个成员进行赋初值。个成员进行赋初值。 由于第一个成员是字符型,用一个字由于第一个成员是字符型,用一个字节,所以对于初值节,所以对于初值0 0x9741x9741仅能接受仅能接受0 0x41x41,初值的高字节被截去。初值的高字节被截去。 1. A 41A 412. a 61a 6

114、1对对u2u2成员的引成员的引用是无意义的用是无意义的2024/7/27689.2 共用体共用体9.2.2 9.2.2 共用体变量的定义与初始化共用体变量的定义与初始化共用体变量的定义与初始化共用体变量的定义与初始化main( )main( ) union union long n; long n; int int k;k; char c; char c; un; un; un.n= un.n=0x0x12345678;12345678; printfprintf( ( %lxlxnn , ,un.nun.n); ); printfprintf( ( %x xnn , ,un.kun.k);

115、); printfprintf( ( %x xnn , ,un.cun.c); ); un.c= un.c= A A ; ; printfprintf( ( %ldldnn ,un.n);,un.n); printfprintf( ( %d dnn ,un.k);,un.k); printfprintf( ( %c cnn ,un.c);,un.c); 1234567856787830541984122081A0 0x78x780 0x56x560 0x34x340 0x12x12低地址低地址高地址高地址0 0x12x120 0x34x340 0x56x560 0x41x41000100010

116、0100010001100110100010001010101011001100100010000010001高地址高地址低地址低地址2024/7/2769l lenumenum是关是关是关是关键键字字字字;l l枚枚枚枚举举名名名名和和和和枚枚枚枚举举常常常常量量量量是是是是标识标识符符符符;l l枚枚枚枚举举常常常常量量量量之之之之间间用用用用逗逗逗逗号号号号分隔分隔分隔分隔。例如:例如:例如:例如: enum enum weekdayweekday Sun, Mon, Tue, Wed, Thu, Fri, Sat ; Sun, Mon, Tue, Wed, Thu, Fri, Sat

117、; enum enum color1color1 blue, green, red ; blue, green, red ; enum enum flagflag false, true ; false, true ;9.3 枚举类型与类型命名枚举类型与类型命名9.3.1 9.3.1 枚举类型枚举类型枚举类型枚举类型1. 1. 枚举类型的定义枚举类型的定义枚举类型的定义枚举类型的定义 枚举类型定义的一般形式:枚举类型定义的一般形式:枚举类型定义的一般形式:枚举类型定义的一般形式: enumenum 枚枚枚枚举举名名名名 枚枚枚枚举举常量取常量取常量取常量取值值表表表表 ; ; 枚举枚举是一个具

118、有有限个是一个具有有限个整型符号常量的整型符号常量的集合集合,这些整型符号常量称为枚举常量。,这些整型符号常量称为枚举常量。 每个枚举类型都必须进行类型的定义,每个枚举类型都必须进行类型的定义,定义时必须将其所有的枚举常量一一列举,定义时必须将其所有的枚举常量一一列举,以便限定此枚举类型变量的取值范围。以便限定此枚举类型变量的取值范围。 2024/7/2770 在枚举类型中,每个在枚举类型中,每个枚举常量枚举常量都代表一都代表一个整型值。在定义枚举类型的同时可隐式或个整型值。在定义枚举类型的同时可隐式或显式地显式地定义枚举常量所代表的值定义枚举常量所代表的值。 例如:例如:例如:例如: enu

119、m enum weekdayweekday Sun, Mon, Tue, Wed, Thu, Fri, Sat ; Sun, Mon, Tue, Wed, Thu, Fri, Sat ;9.3 枚举类型与类型命名枚举类型与类型命名9.3.1 9.3.1 枚举类型枚举类型枚举类型枚举类型2. 2. 枚举常量的整型值枚举常量的整型值枚举常量的整型值枚举常量的整型值 隐式定义:隐式定义: 按照类型定义时枚举常量列举的顺序分别按照类型定义时枚举常量列举的顺序分别按照类型定义时枚举常量列举的顺序分别按照类型定义时枚举常量列举的顺序分别代表代表代表代表0 0 0 0、1 1 1 1、2 2 2 2、等整型

120、值。等整型值。等整型值。等整型值。 01234562024/7/2771例如:例如:例如:例如: enumenum op op plus=43,minus=45,multiply=42,divide=47 ; plus=43,minus=45,multiply=42,divide=47 ; enumenum workday workday Mon=1,Tue,Wed,Thu,Fri ; Mon=1,Tue,Wed,Thu,Fri ;9.3 枚举类型与类型命名枚举类型与类型命名9.3.1 9.3.1 枚举类型枚举类型枚举类型枚举类型2. 2. 枚举常量的整型值枚举常量的整型值枚举常量的整型值枚举

121、常量的整型值 显式定义:显式定义: 在定义类型的同时指定枚举常量的值,其中如在定义类型的同时指定枚举常量的值,其中如在定义类型的同时指定枚举常量的值,其中如在定义类型的同时指定枚举常量的值,其中如有未指定值的枚举常量,则根据前面的枚举常量的有未指定值的枚举常量,则根据前面的枚举常量的有未指定值的枚举常量,则根据前面的枚举常量的有未指定值的枚举常量,则根据前面的枚举常量的值依次递增值依次递增值依次递增值依次递增1 1 1 1。 23452024/7/2772例如:例如:例如:例如: enumenum flag flag fgfg; ; enumenum color1 color1 c1c1; ;

122、 enumenum color2 blank,brown,yellow,white color2 blank,brown,yellow,white c2c2; ; enumenum lightbluelightblue, ,lightgreenlightgreen, ,lightredlightred c3c3; ;9.3 枚举类型与类型命名枚举类型与类型命名9.3.1 9.3.1 枚举类型枚举类型枚举类型枚举类型3. 3. 枚举变量的定义枚举变量的定义枚举变量的定义枚举变量的定义 枚举类型变量定义的三种形式:枚举类型变量定义的三种形式: enumenum 枚举名枚举名 枚举变量名表枚举变量名

123、表; ; enumenum 枚举名枚举名 枚举常量取值表枚举常量取值表 枚举变量表枚举变量表; ; enumenum 枚举常量取值表枚举常量取值表 枚举变量表枚举变量表; ;2024/7/2773 赋值运算运算 fgfg=true;c1c1=red;c2c2=yellow;c3c3=lightblue; c3c3=white;9.3 枚举类型与类型命名枚举类型与类型命名9.3.1 9.3.1 枚举类型枚举类型枚举类型枚举类型4. 4. 枚举数据的运算枚举数据的运算枚举数据的运算枚举数据的运算 用用sizeofsizeof运算符计算枚举变量所占内存空间运算符计算枚举变量所占内存空间枚举变量中存放

124、的是枚举变量中存放的是枚举变量中存放的是枚举变量中存放的是整型值整型值整型值整型值,每个枚举变量占用,每个枚举变量占用,每个枚举变量占用,每个枚举变量占用2 2个字节个字节个字节个字节 是是enum color2类型的枚举值类型的枚举值2024/7/2774 取址运算取址运算 enum enum color2 blank,brown,yellow,white color2 blank,brown,yellow,white c2c2; ; enumenum flag flag fgfg; ; &c2 c2 、 &fgfg9.3 枚举类型与类型命名枚举类型与类型命名9.3.1 9.3.1 枚举类型

125、枚举类型枚举类型枚举类型4. 4. 枚举数据的运算枚举数据的运算枚举数据的运算枚举数据的运算 关系运算关系运算truefalse SunSat 真真真真(1) 假假假假(0) 按枚举类型数据所代表的按枚举类型数据所代表的按枚举类型数据所代表的按枚举类型数据所代表的整型值整型值整型值整型值进行比较进行比较进行比较进行比较 2024/7/2775 在在在在C C系统中,系统中,系统中,系统中,不能直接不能直接不能直接不能直接对枚举数据进行对枚举数据进行对枚举数据进行对枚举数据进行输入和输出输入和输出输入和输出输入和输出。由于枚举变量可以作为整型变量处理,所以可以通过由于枚举变量可以作为整型变量处理

126、,所以可以通过由于枚举变量可以作为整型变量处理,所以可以通过由于枚举变量可以作为整型变量处理,所以可以通过间接方法输入输出枚举变量的值。间接方法输入输出枚举变量的值。间接方法输入输出枚举变量的值。间接方法输入输出枚举变量的值。 枚举变量的输出枚举变量的输出 方法一:直接输出枚举变量中存放的整型值。方法一:直接输出枚举变量中存放的整型值。方法一:直接输出枚举变量中存放的整型值。方法一:直接输出枚举变量中存放的整型值。9.3 枚举类型与类型命名枚举类型与类型命名9.3.1 9.3.1 枚举类型枚举类型枚举类型枚举类型5. 5. 枚举数据的输入输出枚举数据的输入输出枚举数据的输入输出枚举数据的输入输

127、出 枚举变量的输入枚举变量的输入 枚枚举变量作量作为整型整型变量量进行行输入。例如:入。例如: scanf(%d,&fg);1含义不直观含义不直观 fgfg=true;=true; printfprintf(%d,(%d,fgfg); );2024/7/2776switch(fg) case false: printf(false); break; case true: printf(true); 9.3 枚举类型与类型命名枚举类型与类型命名9.3.1 9.3.1 枚举类型枚举类型枚举类型枚举类型5. 5. 枚举数据的输入输出枚举数据的输入输出枚举数据的输入输出枚举数据的输入输出 枚举变量的输

128、出枚举变量的输出方法二:利用多分支选择语句输出枚举常量对应方法二:利用多分支选择语句输出枚举常量对应的字符串。的字符串。 2024/7/2777enum flag false,true fg;char *name =false,true; fg=true;printf(%s,namefg);9.3 枚举类型与类型命名枚举类型与类型命名9.3.1 9.3.1 枚举类型枚举类型枚举类型枚举类型5. 5. 枚举数据的输入输出枚举数据的输入输出枚举数据的输入输出枚举数据的输入输出 枚举变量的输出枚举变量的输出方法三:依据枚举值,运用指针方法输出对应的方法三:依据枚举值,运用指针方法输出对应的字符串。字

129、符串。2024/7/2778fg=true;printf(%s,fg);9.3 枚举类型与类型命名枚举类型与类型命名9.3.1 9.3.1 枚举类型枚举类型枚举类型枚举类型5. 5. 枚举数据的输入输出枚举数据的输入输出枚举数据的输入输出枚举数据的输入输出 枚举变量的输出枚举变量的输出 枚举常量是标识符,不是字符串,以输出字符枚举常量是标识符,不是字符串,以输出字符串方式输出枚举常量是错误的。串方式输出枚举常量是错误的。 2024/7/27799.3 枚举类型与类型命名枚举类型与类型命名9.3.1 9.3.1 枚举类型枚举类型枚举类型枚举类型【例例9.20】编制制一一个个程程序序。当当输入入今

130、今天天的的星星期期序序号号后后,输出明天是星期几。出明天是星期几。 enum weekday Mon=1,Tue,Wed,Thu,Fri,Sat,Sun ; char *name8=error,Mon,Tue,Wed, Thu,Fri,Sat,Sun;2024/7/27809.3 枚举类型与类型命名枚举类型与类型命名9.3.1 9.3.1 枚举类型枚举类型枚举类型枚举类型main( ) enum weekday d; printf(Input todays numeral(1-7):); scanf(%d,&d); if (d0&d7) d+; /* 今天是星期一到星期六的时候今天是星期一到星

131、期六的时候 */ else if (d=7) d=1; /* 今天是星期日今天是星期日 */ else d=0; if (d) printf(Tomorrow is %s.n,named); else printf(%sn,named); 2024/7/27819.3 枚举类型与类型命名枚举类型与类型命名9.3.2 9.3.2 类型的重新命名类型的重新命名类型的重新命名类型的重新命名1. 1. 为类型名定义别名为类型名定义别名为类型名定义别名为类型名定义别名 为类型名定型名定义别名的一般形式名的一般形式: typedeftypedef 类型名型名 新新新新类类型名型名型名型名或或 typede

132、f typedef 类型定型定义 新新新新类类型名型名型名型名 用用用用typedeftypedeftypedeftypedef为已存在的类型名再命名为已存在的类型名再命名为已存在的类型名再命名为已存在的类型名再命名一个新的类型名(即别名)。一个新的类型名(即别名)。一个新的类型名(即别名)。一个新的类型名(即别名)。l ltypedeftypedef是关键字是关键字;l l类类类类型型型型名名名名可可以以是是基基本本类类型型、构构造造类类型型、指指针针类类型或自定义类型名;型或自定义类型名; l l新类型名新类型名新类型名新类型名是自定义的类型名是自定义的类型名。2024/7/27829.3

133、 枚举类型与类型命名枚举类型与类型命名9.3.2 9.3.2 类型的重新命名类型的重新命名类型的重新命名类型的重新命名typedef int COUNTER; /* 定定义COUNTER为整型整型类型名型名 */typedef struct date int year; int month; int day; DATE; /* 定定义DATE为struct date结构体构体类型名型名 */新类型名与旧类型名作用相同,并且可同时使用。新类型名与旧类型名作用相同,并且可同时使用。int i; 与与 COUNTER i; 等价。等价。struct date birthday; 与与 DATE bi

134、rthday; 等价。等价。2024/7/27839.3 枚举类型与类型命名枚举类型与类型命名9.3.2 9.3.2 类型的重新命名类型的重新命名类型的重新命名类型的重新命名2. 2. 为类型命名的方法为类型命名的方法为类型命名的方法为类型命名的方法 为基本基本类型命名型命名例如:例如: typedef float REAL; REAL x, y; /* 相当于相当于float x,y; */ 以以以以typedeftypedeftypedeftypedef开头,加上变量定义的形式,开头,加上变量定义的形式,开头,加上变量定义的形式,开头,加上变量定义的形式,并用新类型名替代变量名。并用新类型

135、名替代变量名。并用新类型名替代变量名。并用新类型名替代变量名。 为数数组类型命名型命名例如:例如: typedef char CHARR80; CHARR c, d4; /* 相当于相当于char c80,d480; */2024/7/27849.3 枚举类型与类型命名枚举类型与类型命名9.3.2 9.3.2 类型的重新命名类型的重新命名类型的重新命名类型的重新命名2. 2. 为类型命名的方法为类型命名的方法为类型命名的方法为类型命名的方法 为指指针类型命名型命名例如:例如: typedef int *IPOINT; IPOINT ip; /* 相当于相当于int *ip; */ IPOINT

136、 *pp; /* 相当于相当于int *pp; */typedef int (*FUNpoint)( );FUNpoint funp; /* 相当于相当于int (*funp)( ); */2024/7/27859.3 枚举类型与类型命名枚举类型与类型命名9.3.2 9.3.2 类型的重新命名类型的重新命名类型的重新命名类型的重新命名2. 2. 为类型命名的方法为类型命名的方法为类型命名的方法为类型命名的方法 为结构体、共用体构体、共用体类型命名型命名例如:例如: struct node char c; struct node *next; ; typedef struct node CHNODE; CHNODE *p; /* 相当于相当于struct node *p; */struct CHNODE *p; 2024/7/2786

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

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

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