第九章结构体、共用体和枚举类型的应用.ppt

上传人:本田雅阁 文档编号:3441844 上传时间:2019-08-26 格式:PPT 页数:67 大小:512.04KB
返回 下载 相关 举报
第九章结构体、共用体和枚举类型的应用.ppt_第1页
第1页 / 共67页
第九章结构体、共用体和枚举类型的应用.ppt_第2页
第2页 / 共67页
第九章结构体、共用体和枚举类型的应用.ppt_第3页
第3页 / 共67页
第九章结构体、共用体和枚举类型的应用.ppt_第4页
第4页 / 共67页
第九章结构体、共用体和枚举类型的应用.ppt_第5页
第5页 / 共67页
点击查看更多>>
资源描述

《第九章结构体、共用体和枚举类型的应用.ppt》由会员分享,可在线阅读,更多相关《第九章结构体、共用体和枚举类型的应用.ppt(67页珍藏版)》请在三一文库上搜索。

1、编程输出十个学生的姓名、性别、年龄和成绩。,分析: (1)定义四个数组分别装入十个学生 的姓名、性别、年龄和成绩; (2)分别输出每个学生的四项信息。,char name10;char sex2; int age10;float score10; ,问题的出现:,(1)所有学生信息分散在内存中。必须到相应 的数组元素中找到正确信息。由于内存不 集中,降低程序执行效率。,(2)对数组进行初始化时,容易出现错位错误。,(3)结构显得比较零散,不容易管理。,结构体的含义,结构体又称为结构,它是由类型不同, 数目固定的若干个变量的集合。,结构体与数组的区别: 仅在于数组中变量的类型必须是相同的, 而结

2、构体中的变量可以是不同类型的,也可 以是相同类型的。,第九章 C语言中结构体、共同体 和枚举类型的应用,第一节 结构体,一、结构体类型的定义,struct student char name10; char sex; int age; float score; ;,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; ;,struct是关键字,不能省略,合法标识符 且可省略,成员类型可以是 基本型或构造型,例: struct student int num; char name20; char sex; int age; float score; char addr30;,一、结

3、构体类型的声明,结构体类型定义描述结构的组织形式,不分配内存,1、先定义结构体类型,再定义结构体变量,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; ; struct 结构体名 变量名表列;,例 struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu1,stu2;,1、先定义结构体类型,再定义结构体变量,例 #define STUDENT struct student STUDENT int num; char name20;

4、 char sex; int age; float score; char addr30; ; STUDENT stu1,stu2;,2、定义结构体类型的同时定义结构体变量,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; 变量名表列;,例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2;,3、直接定义结构体变量,struct 类型标识符 成员名; 类型标识符 成员名; 变量名表列;,例 struct int num; char name20

5、; char sex; int age; float score; char addr30; stu1,stu2;,关于结构体类型的几点说明,1、结构体类型与结构体变量概念不同,不分配内存;不能赋值、存取、运算;,分配内存,可以赋值、存取、运算;,2、结构体可嵌套,3、结构体成员名与程序中变量名可相同,不会混淆,练习:定义一个职工结构体,包含职工的编号、 姓名、性别、出生日期、工资、住址。,struct clerk int num; char name20; char sex; float salary; char addr20; struct date char month10; int d

6、ate; int year;birthday; clerk1;,三、结构体变量的引用,引用原则:,之一:结构体变量不能整体引用,只能引用变量成员。,引用方式:结构体变量名.成员名,成员(分量)运算符 优先级: 1 结合性:从左向右,例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2;,stu1.num=10;,stu1.name20=“李四”;,stu2.score+=stu1.score; stu1.age+;,举例:,例 struct student in

7、t num; char name20; char sex; int age; float score; char addr30; stu1,stu2;,printf(“%d,%s,%c,%d,%f,%sn”,stu1); (),if (stu1=stu2) (),举例:,之二:可将一个结构体变量赋值给另一结构体变量。,例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2;,stu2=stu1; ( ),之三:结构体嵌套时逐级引用。,例 struct studen

8、t int num; char name20; struct date int month; int day; int year; birthday; stu1,stu2;,stu1.birthday.year=1985;,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; ; struct 结构体名 结构体变量=初始数据;,四、结构体变量的初始化,形式之一:,例 struct student int num; char name20; char sex; int age; char addr30; ; struct student stu1=112,“Wang Lin”,M,

9、19, “200 Beijing Road”;,形式之二:,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; 结构体变量=初始数据;,例 struct student int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,形式之三:,struct 类型标识符 成员名; 类型标识符 成员名; 结构体变量=初始数据;,例 struct int num; char name20; char sex; int age; char addr3

10、0; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,练习:输出某学生的基本信息。,struct student int num; char name20; char sex; int age; char addr30; stu1=101,“Wang Lin”,M,19,“550 hebei Road”; main( ) printf(“%d,%s,”,stu1.num,stu1.name); printf(“%c,%d,”,stu1.sex,stu1.age); printf(“%s”,stu1.addr);,结构体变量的存储是线性连续 存储,按照

11、成员的声明顺序连续存 储。在内存中变量占用空间为各个 成员所用空间的和。,五、结构体类型变量的存储,#include #include main() struct mydata char name20; int age; char sex; s=“zhang“,18,M; printf(“name:%s,age:%d,sex:%c“,s.name,s.age,s.sex); printf(“ sizeof(s)=%d“,sizeof(s); ,【例9.1】定义一个结构体变量,赋值并输出结构 体成员值和结构体所占用的内存空间。,程序执行结果为: name:zhang,age:18,sex:M s

12、izeof(s)=23,编程输出10个学生的姓名、性别、年龄和成绩。,数组?,结构体数组:每个数组元素 都是一个结构 体类型的数据。,第二节 结构体数组,一、结构体数组的定义,形式一: struct student int num; char name20; char sex; int age; ; struct student stu2;,形式二: struct student int num; char name20; char sex; int age; stu2;,形式三: struct int num; char name20; char sex; int age; stu2;,二、

13、结构体数组的初始化,分行初始化: struct student int num; char name20; char sex; int age; ; struct student stu =100,“Wang Lin”,M,20, 101,“Li Gang”,M,19, 110,“Liu Yan”,F,19;,全部初始化时维数可省,顺序初始化: struct student int num; char name20; char sex; int age; ; struct student stu =100,“Wang Lin”,M,20, 101,“Li Gang”,M,19, 110,“Li

14、u Yan”,F,19;,例 struct student int num; char name20; char sex; int age; stu =,;,例 struct int num; char name20; char sex; int age; stu =,;,二、结构体数组的初始化,运行程序,三、结构体数组的引用,引用方式:结构体数组名下标.成员名,struct student int num; char name20; char sex; int age; str3;,stu1.age+;,strcpy(stu0.name,”ZhaoDa”);,四、结构体类型数组的存储,结构体

15、类型数组的存储在整体上和一般数组一样,线性连续存储,数组名为首地址。在每一个元素中的存储和结构体变量一样,线性排列、连续存储,即按照结构体成员声明的顺序存储。结构体类型数组存储空间为各个元素所占空间的和。,例:统计后选人选票,struct person char name20; int count; leader3=“Li”,0,“Zhang”,0,”Wang“,0; main( ) int i,j; char leader_name20; for(i=1;i=10;i+) scanf(“%s“,leader_name); for(j=0;j3;j+) if(strcmp(leader_nam

16、e,leaderj.name)=0) leaderj.count+; for(i=0;i3;i+) printf(“%5s:%dn“,leaderi.name,leaderi.count);,运行程序,【实例2】按照表9-1的情况,定义一个结构体数组,输入一个班级的学生信息,要求: (1)分别统计出男生和女生人数; (2)把平均成绩在85分以上的学生找出来,并输出这部分学生的如下信息:姓名、性别、年龄、家庭地址。,#include #define N 20 struct student char num10; char name20; char sex; int age; float c,vb

17、,os; char add30; ; main( ) struct student bN; float flg; int i,m=0,f=0;,for(i=0;i85) printf(“%s,%c,%d,%s“,bi.name,bi.sex,bi.age,bi.add); printf(“nnboy=%d,girl=%d“,m,f); ,第三节 结构体与指针,一、结构体指针变量的定义与应用,struct 结构体标识名 *结构体指针变量名;,1、结构体指针变量定义的一般形式:,例如:struct student *pt,*stud;,说明: 指针变量既可以指向单一的结构体变量, 也可以指向结构体

18、数组。,结构体指针变量名&结构体变量;,2、结构体指针变量的赋值,结构体指针变量名结构体数组名;,例如: struct student *p1,*p2,a,b4; p1=, 结构体指针下标 或 *(结构体指针下标) 结构体指针下标.成员 或(结构体指针下标)-成员,3、结构体指针变量的引用, 结构体指针名-成员 (*结构体指针名).成员,(1)对指向结构体变量的结构体指针的引用,(2)对指向结构体数组的结构体指针的引用,运行程序,#include #include main() struct student char *num,name20; float c,vb; stu,*p; p= ,【

19、例9-3】指向结构体变量的结构体指针用法。,第四节 结构体与函数,一、“值传递”方式,向函数传递结构体变量成员(成员不是数组名或指针) 定义函数f1(float x) f1(stu.c);,向函数传递结构体变量 f2(stu); 定义函数f2(struct student y),二、“地址传递”方式,向函数传递结构体变量的地址 f3(p) 或f3(&stu) 定义函数f3(struct student *z),向函数传递结构体成员的地址或指针 f4(stu.num) 或f5(&stu.c) 定义函数f4(char *p)或 f5(float *q),三、函数返回值为结构体类型数据,定义函数:

20、struct student f6(struct student x) /*定义一个返回值为struct student类型的函数,函数的行参为struct student类型*/ 注意: 调用函数过程中,接收函数值的变量定义为相同struct student类型的变量。,四、函数的返回值为结构体指针类型,定义函数: struct student *f7(struct student x) /*定义一个返回值为指向结构体struct student类型变量的指针*/ 注意: 在调用函数中,接收函数值的变量定义为相同基类型的结构体指针变量。,运行程序,【实例5】综合示例 #include #in

21、clude struct student char *num,name20; float c,vb; void f1(float x,float y) printf(“nstu.c+stu.vb=%f“,x+y); void f2(struct student a) printf(“nstu.num:%s,stu.name:%s,stu.c:%5.1f“,a.num,a.name,a.c); void f3(struct student *q) printf(“nstu.num:%s,stu.name:%s,stu.c:%5.1f“,q-num, q-name,q-c); void f4(ch

22、ar *q) printf(“nq:%s“,q); struct student f6(struct student x) x.num=“aaaaa“;x.c=100; return x; struct student *f7(struct student *x) strcpy(x-name,“hhhhhh“);x-vb=0; return x; main() struct student stu=“04201“,“Anshili“,78.5,83; struct student *p,b,*q; p= ,第五节 结构体应用链表,一、 动态链表基本概念,链表是结构体最重要的应用,是一种非固定长

23、度的数据结构,是一种动态存储技术,它能够根据数据的结构特点和数量使用内存,编译时不分配内存,而到运行时才根据实际需要执行分配,使用完毕后立即释放内存。,每次动态分配的存储单元,其地址一般不是连续的,利用链表可以反映出数据间的联系。链表中每个结点定义都采取“引用自身的结构体”。链表中的每个存储单元都由动态存储分配获得,故称为“动态链表”。,head:链表的头结点。链表的“头指针”变量用来指向链表的开始,在head中存放链表的第一个结点的地址。链表中的每一个结点都有数据项和地址项两部分组成,地址项指向下一个结点的地址。链表最后一个结点(地址项为NULL)称为尾结点。 a和b:链表中的结点。一般结点

24、的前一个结点称为前驱,后一个结点称为后继,如:a是b的前驱,b是a的后继。须说明的是,前驱、后继是指结点之间的顺序关系,而不代表结点物理地址的先后。,单向链表:,1、void *malloc(unsigned size) 功能:向系统申请一个size字节的连续内存空间。 返回值:分配成功返回该内存空间的首地址,不成功返回NULL。 2、void *calloc(unsigned num,unsigned size) 功能:申请分配一个size*num个字节的连续内存空间。 返回值:分配成功返回该内存空间的首地址,不成功返回NULL。 3、void free(void *ptr) 功能:释放pt

25、r为首地址的一段内存空间,该空间大小由前面内 存分配函数指定。因此,free()函数必须与malloc() 或calloc()函数搭配使用。,主要的内存动态分配函数,二、建立链表,建立单向链表的主要操作步骤如下: 1、读取数据; 2、生成新结点; 3、将数据存入节点数据域的成员变量中; 4、将新结点插入到链表中。 5、重复上述操作直到输入结束。,所谓建立动态链表是指在程序执行过程中从无 到有地建立起一个链表,即一个一个地开辟结点和 输入格结点数据,并建立起前后相连的关系。,例题:写一个函数建立一个有3名学生数据 的单向动态链表。,# define NULL 0 # define LEN siz

26、eof(struct student) struct student long num; float score; struct student *next; ; struct student *creat(void) struct student *head,*p1,*p2; int n=0; p1=p2=(struct student *)malloc(LEN); scanf(“%ld,%f”,运行程序,【实例6】用尾插法建立一个正整数动态数据链表 struct int_node int value; struct int_node *next; struct int_node *crea

27、te_list( ) struct int_node *h,*tail,*p; int v; printf(“input data.(less 1:finish)n”); h=tail=NULL; scanf(“%d”,三、结点查找,结点的查找过程是从第一个结点出发,顺序查找。用函数find()来完成这一功能,该函数有两个参数:链表头指针和指定数据项值。 struct int_node *find(struct int_node h ,int key) struct int_node *v=h; while(v!=NULL) ,四、 结点插入,五、结点删除,对于链表操作,除了建立链表、查找结点

28、、插入结点外,删除结点也是常用操作之一。它的操作步骤如下: 1、查找到欲删除的结点; 2、分别保存要删除结点的前驱和后继地址; 3、把后继地址赋给前驱的指针项; 4、释放当前删除结点的内存。,五、结点删除,如在正整数链表中,要删除指针w所指向结点的 后继结点p,如图9-5所示,可用下列语句实现: p=w-next; w-next=p-next; p-next=NULL;,第六节 共同体,共同体是另一种构造型数据类型,它可以用于表示几个不同类型的变量共用一段同一起始地址的存储单元。直观地讲,共同体可以把相同的数据部分当作不同的数据类型来处理,或用不同的变量名引用相同的数据部分,如可以使整型变量i

29、、字符型变量ch、单精度变量f共同使用从某一地址开始的一段内存,如图9-6所示,i、ch和f三个变量都使用起始地址是1000的一段内存:i使用1000、1001两个内存单元;ch使用1000一个内存单元;f使用10001003四个内存单元。,在于两者的存储方式不同:结构体的成员变量存储是按声明顺序连续存储,各占不同起始地址的存储单元,存储总空间为各个成员存储空间的和;而共同体的成员变量存储时共用同一起始地址的存储单元,共同体变量所占字节数与长度最长的成员变量所占用的字节数相同。,共同体变量与结构体变量的本质区别,一、共同体类型定义,union 共同体标识名 ,类型名1 共同体成员名1; 类型名

30、2 共同体成员名2;,类型名n 共同体成员名n; ; 例如: union data char ch; int b; ;,二、共同体类型变量,1、紧跟在结构体类型说明之后进行定义。,2、在说明一个无名结构体类型的同时, 直接进行定义。,3、先说明结构体类型,再单独进行变量 定义。,三、共同体类型成员引用,共同体是对多个变量共享同一段内存的定义,因此单独使用共同体变量时没有什么意义,只能通过引用共同体成员的方式来使用共同体变量。引用方式与结构体变量引用方式相同。 可用“.”或“-”运算符引用共同体变量的成员变量。,四、共同体类型特点,1、共同体变量中起作用的成员是最后一次存放 的成员,在存放一个新

31、的成员后原有的成员 就失去作用。 2、与结构体变量不同,共同体变量不能初始化。 3、共同体变量的地址和它的各成员的地址都是 同一个起始地址值。 4、共同体各个成员都是从低地址方向开始使用 内存单元。,【实例9】有一个unsigned long型整数,现要分别将其前两个字节和后两个字节作为两个unsigned int型整数输出。 void part(unsigned long num) union data unsigned int part2; unsigned long w; n,*p; p= ,运行程序,第七节 枚举类型,一、枚举类型及枚举变量,1、枚举类型定义形式: enum 枚举类型标

32、识名 枚举表列; 例如:enum weekdaysun,mon,tue,wed,thu,fri,sat; 上面定义了名字为weekday,关键词为enum的枚举类型, 中为枚举值,即变量可以取的值。,枚举类型变量也有三种说明形式: (1)先说明枚举类型名,再说明枚举变量。 如:enum weekday s; (2)在说明枚举类型名时,同时说明枚举变量。 如:enum weekday sun,mon,tue,wed,thu,fri,sat s; (3)直接按枚举类型的结构模式说明枚举变量。 如:enum sun,mon,tue,wed,thu,fri,sat s;,2、枚举类型变量,1、枚举元素

33、是常量,默认情况下元素的值是其在枚举值 表中的顺序号。 2、枚举变量可用作循环控制变量,但此时要求枚举变量 所对应的整数值是增量值为1,枚举变量及枚举元素之 间可以进行比较运算。如:monwed为真。 3、枚举变量或枚举元素可以作为数组元素的下标,但此 时注意越界问题。 4、枚举变量不能进行键盘输入操作;枚举变量或枚举元 素不能直接输入枚举元素标识符,但可以直接输入它 们对应的整数值。 5、整型与枚举类型是不同的数据类型,但仍然可以使用 一个整数直接为枚举类型变量赋值。,注 意:,第八节 用typedef定义类型,一、定义“替代类型名”,这种方法不是定义新的数据类型,而仅仅是对于 已经存在的数据类型名再定义一个新名字,用它替代 已存在的数据类型名来进行变量的说明,以便使程序 更容易理解和识别,也可以提高移植性。 typedef的使用格式如下: typedef 数据类型 替代类型名; typedef int clock; /*定义clock为整型类型的替代名*/,二、定义“构造类型名”,这种方法是用typedef来定义用于直接说明 构造类型变量的“构造类型名”。 利用typedef定义构造类型名的形式如下: typedef 类型 构造类型名 typedef struct aa char num10; char name20; int age; STU;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1