第9章结构体、共用体与枚举类型.ppt
《第9章结构体、共用体与枚举类型.ppt》由会员分享,可在线阅读,更多相关《第9章结构体、共用体与枚举类型.ppt(87页珍藏版)》请在三一办公上搜索。
1、第9章 结构体、共用体与枚举类型,本章要求为什么要引入结构体,结构体与数组有什么本质不同?如何定义结构体,有几种定义形式?结构体变量与结构体指针变量有何区别,它们如何各自引用结构体成员?结构体数据如何作为函数的参数?为什么要引入链表,如何利用链表对内存进行动态管理?本章重点结构体变量的定义和使用链表的概念本章难点动态链表的常见操作,第9章 结构体、共用体与枚举类型,9.1 问题的提出与示例9.2 结构体类型的说明与变量定义9.3 结构体指针变量9.4 结构体数组9.5结构体与函数9.6 链表与动态内存管理 9.7 结构体综合应用举例,9.1 问题的提出与示例,9.1.1 结构体概述,例如,描述
2、一个学生的数据实体包含学号、姓名、性别、出生年月、课程成绩、家庭住址、联系电话等数据项。各个数据项的类型是不同的,学号可为整型或字符串形式;性别为字符型;出生年月又分为年,月,日,它们可以分别为整型表示;课程成绩可以是整型或实型;家庭住址应为字符串;电话号码可以是整型或字符串形式。对于这样一个实体,不能统一用数组来描述,因为数组中各元素的类型、长度必须一致。如果用独立的简单数据项或数组分别表示它们,就不能体现一个实体数据的整体性和相互关联性,也难以操作。对于这种由多种不同类型的数据组成的数据实体,C语言专门用结构体数据类型来描述,结构体中所包含的数据项称为结构体的成员,结构体由用户根据实际来定
3、义。,9.1 问题的提出与示例,下表是一张100个学生成绩管理表,要求计算并打印出每个学生的平均成绩。,9.1 问题的提出与示例,如果按照以前学过的数组方法,可以定义如下的多个数组并赋初值如下:int stu_id100=84773801,84773802,84773803,84773804,84773805,84773806;/*定义一维数组存放每个学生的学号*/char stu_name1008=“陈云”,“沈栋栋”,“易婷婷”,“谢浩杰”,“郑强”;/*定义字符串数组存放每个学生的姓名*/char stu_sex100=m,m,f m,m;/*定义字符数组存放每个学生的性别*/int s
4、tu_year100=1989,1989,1990,1988,1988;/*定义一维数组存放每个学生的出生年份*/.,这些数组的数据在内存中的存储顺序是:先存储所有学生的学号、再接着存储所有学生的姓名、接着性别、出生年份、出生月份、联系电话、课程成绩、平均成绩。也就是把所有学生的同一个类别(上表中某一列)以定义某一个数组的形式单独放在一起,相当于所有学号放在一个数组里里,所有姓名放在另一个数组里,依次类推,要处理某一个学生的信息如计算平均值并打印某个学生的信息,要分别查询所有不同的数组,很容易出错且效率不高。这样为每一项内容分别定义变量或数组的方法导致存储结构零乱,处理过程非常繁琐,一般不采用
5、这种方法。,未了解决这个问题,C语言定义了一种可由用户自定义的数据类型,根据实际问题,将不同数据类型集中一起,把内在有联系的不同类型的数据统一成一个整体,设计符合要求的新的数据类型,称为结构体类型。这样利用结构体的特性可以把某一个学生的所有相关的不同类型的数据项都顺序存储在一起,便于一个个学生的处理。,如针对上述要求,可以定义为如下的学生的结构体:struct student int stu_id;/*学生的学号*/char stu_name8;/*学生的姓名*/char stu_sex;/*学生的性别*/struct int year;/*学生的出生年份*/int month;/*学生的出生
6、月份*/birthday;int stu_phone;/*学生的联系电话*/char stu_address30;/*学生的家庭地址*/int stu_course3;/*学生的三门课成绩*/float stu_average;/*学生的平均成绩*/;,声明了一种新的数据类型struct student。这个数据类型仅相当于一种结构模式,与int,float,char等类型具有同等地位,也就是用户自定义了一种新的数据类型,但并没有为struct student分配相应的存储空间,就像系统并没有为int分配存储空间一样,而是需要定义一个整型变量,为这个整型变量分配存储空间。同样的,也需要一个结构
7、体变量,为这个结构体变量分配存储空间。,【例9-1】按表9-1的形式从键盘依次输入每个学生的学号,姓名,出生年月,三门课的成绩,计算并打印出每个学生的平均成绩。分析:这里首先要定义一个描述学生学号,姓名,出生年月,三门课,平均成绩的结构体类型,再定义一个结构体变量,通过循环语句对这个结构体变量的各个成员的引用,读入某一个学生的各个数据项,再计算出某一个学生的平均成绩并打印某个学生的各个数据项。接着读下一个学生的数据项,再计算和打印各个数据项。,#include#define M 10struct student/*定义一个学生的结构体*/int stu_id;char stu_name8;st
8、ruct date/*定义一个内嵌的结构体*/int year;int month;birthday;float stu_course3;float stu_ave;,void main()int i;struct student p;/*定义一个结构体变量,具有struct student类型*/for(i=0;iM;i+)/*读入某一个学生的各个数据项*/printf(input studentid:n);scanf(%d,scanf(%f%f%f,9.1问题的提出与示例,说明:使用结构体数据,可将一个学生的数据有机组合起来,例中的stu是个结构体数组,stui表第i个学生的数组,stui
9、.num表第i个学生的学号,stui.name表第i个学生的姓名等。结构体的每一个成员都是通过其名字来引用,引用形式如下:结构体变量名.成员名结构体的引入为处理复杂的数据结构提供了有力的手段(如链表等),也为函数间传递一组不同类型的数据提供了方便。特别是对于数据结构比较复杂的大型程序提供了方便。,9.2结构体类型的说明与变量定义,9.2.1 结构体的声明 定义结构体类型的一般形式:struct 结构体名 结构成员1;结构成员2;结构成员n;其中,struct为结构体定义的关键字,不能省略。结构体名由用户给定,即是定义的结构体类型名。用两个花括号括住的内容是该结构体中的各个成员,每个成员又有自己
10、的数据类型,它们可以是整型、实型、字符型、指针或结构类型等,它们都应进行类型说明。,9.2结构体类型的说明与变量定义,有关结构体的几点说明:结构体类型的定义只是说明了一种结构体的组织形式,在编译时并不为它分配存储空间。只是在定义结构体类型变量后,才为变量按照其组织形式分配内存空间。结构体的成员可以是简单变量、数组、指针,还可以是另一个已定义的结构体或共用体变量。当定义一个结构体的成员又是一个结构体类型,这称为结构体的嵌套定义。struct date int year;int month;int day;,struct student int num;char name20;char sex;s
11、truct date birthday;float score;,9.2结构体类型的说明与变量定义,结构体定义可以在函数内部,也可在函数外部。在函数内部定义的结构体,只有在函数内部使用,在函数外部定义的结构体,从定义点起到源文件尾之间的所有函数都可使用。结构体成员的名字可以同程序中的其他变量名相同,两者的意义不同,不会相混。,9.2结构体类型的说明与变量定义,9.2.2 结构体变量定义先说明结构体类型,再定义变量,struct student int stu_id;char stu_name8;char stu_sex;struct int year;int month;birthdayflo
12、at stu_sc3;float stu_ave;,这里定义了一个结构体类型struct student,用它来定义结构体变量。例如:struct student std;这里定义了std为struct student类型的结构体变量,std的存储结构如图9-1所示。结构体变量中的各成员在内存中按说明中的顺序依次排列,具有这一结构体类型的变量中只能存放一个学生的档案。如果要存放多个学生的档案,就要使用结构体数组。,9.2结构体类型的说明与变量定义,在声明类型的同时定义变量 struct 结构体名 成员列表;变量名表列;struct student int num;char name20;cha
13、r sex;int age;float score;stu1,stu2;,9.2 结构体类型的说明与变量定义,直接定义结构类型变量 struct 成员表列;变量名表列;struct int num;char name20;char sex;int age;float score;stu1,stu2;,4.使用typedef 说明一个结构体类型名,再用新类型名来定义变量。其一般形式为:typedef struct STU;STU std;这里STU是一个具体的结构体类型名,能够唯一地标识这种结构体类型。可以用它来定义变量,如同使用int,float一样,不需要再写关键字struct。这种定义方式
14、较为常见。,9.2 结构体类型的说明与变量定义,对结构体变量,系统要为其分配存储空间。一个结构体变量所占存储空间的大小,是其所含结构体成员所占存储空间的总和,这些结构体成员所占的存储空间是由一组连续的存储空间所组成。也可用sizeof运算来求得,一个变量或数据类型在内存中所占内存空间的字节数,使用形式是:sizeof(变量名)或 sizeof(类型标识符),9.2 结构体类型的说明与变量定义,9.2.3 结构体变量的引用C语言中除两个相同类型结构体变量可以相互整体赋值外,不能对结构体变量名直接引用,只能对结构体变量中的成员分别进行引用,即对结构变量的操作,如赋值、输入、输出、运算等都是通过结构
15、变量的成员来实现的。结构体变量的引用格式 结构体变量名.成员名 stu1.num=10001;strcpy(stu1.name,zhang);/*此处不能写成 stu1.name=zhang*/stu1.sex=M;stu1.age=19;stu1.score=88;,9.2 结构体类型的说明与变量定义,9.2.3 结构体变量的引用不能把结构变量作为整体进行输入输出,下面的引用方式是错误的:scanf(%d%s%c%d%f,stu1);正确的引用方式可以是:gets(stu1.name);scanf(%d%c%d%f,9.2 结构体类型的说明与变量定义,结构体嵌套时逐级引用 struct da
16、te int month;int day;int year;struct person char name20;char sex;struct date birthday;struct person person1;person1.birthday.month,9.2 结构体类型的说明与变量定义,同类型结构体变量间的整体赋值 结构体变量可以通过整体赋值,将一个结构体变量中的所有数据,赋给另一个结构体类型相同的结构体变量中对应的数据成员。例8-2 建立一个学生的基本情况表,然后将其打印输出。#include#include main()struct student int num;char na
17、me20;char sex;int age;float score;stu1,stu2;,9.2 结构体类型的说明与变量定义,stu1.num=10001;strcpy(stu1.name,zhang);stu1.sex=M;stu1.age=19;stu1.score=88;stu2=stu1;/*同类结构体变量之间可以赋值*/printf(stu1:%d,%s,%c,%d,%6.2fn,stu1.num,stu1.name,stu1.sex,stu1.age,stu1.score);printf(stu2:%d,%s,%c,%d,%6.2fn,stu2.num,stu2.name,stu2
18、.sex,stu2.age,stu2.score);,9.2 结构体类型的说明与变量定义,2.结构体变量的初始化 结构体变量定义时的初始化形式如下:struct结构体名 变量名=各成员值列表;#include#include main()struct student int num;char name20;char sex;int age;float score;stu2,stu1=10001,zhang,M,19,88;stu2=stu1;printf(stu1:%d,%s,%c,%d,%6.2fn,stu1.num,stu1.name,stu1.sex,stu1.age,stu1.scor
19、e);printf(stu2:%d,%s,%c,%d,%6.2fn,stu2.num,stu2.name,stu2.sex,stu2.age,stu2.score);,3.结构体变量的输入与输出C 语言不能把一个结构体变量作为一个整体进行输人或输出,应该按成员变量输人输出。例如:struct worker char name12;char addr20;float salary;work=Wang Jun,JiangDong Road 20,2100.0结构体变量work的初始值在内存中的存储是按成员变量依次存放的,,由于变量work 包含两个字符串数据和一个浮点型数据,因此输出work 变量
20、,应该使用如下方式:printf(%s,%s,%fn,work.name,work.addr,work.salary);输入work变量各成员的值,则用如下语句:scanf(%s%s%f,work.name,work.addr,/*输出work.name数组中的字符串*/,9.3 结构体指针变量,9.3.1 指向结构体的指针 可以用一个指针指向结构体变量,指向结构体变量的指针的值是该结构体变量所分配的存储区域的首地址。结构指针变量的定义 struct student int num;char name20;char sex;int age;float score;stu1=10001,zhan
21、g,M,19,88;struct student*p=,9.3 结构体指针变量,通过指针访问结构体变量的成员(结构体类型数据的间接引用)结构变量中简单成员的引用形式有下面3种:结构变量名.成员名(名字引用)结构指针-成员名(指针引用)(*结构指针).成员名,9.3 结构体指针变量,例 使用指向结构变量的指针来访问输出结构变量的各个成员的值。#include#include void main()struct student int num;char name20;char sex;int age;float score;stu1=10001,zhang,M,19,88;struct stude
22、nt*p=,【例9-2】输入某个职工的姓名,工资,奖金和扣款,在原来工资的基础上增加%5,计算该职工的实发工资并输出每个职工的工资条。分析:首先要定义一个描述职工具体信息的结构体,然后定义一个结构体变量和指针变量,通过指针变量引用结构体成员读入该职工的信息,计算该职工新的工资和实发工资,最后输出该职工的工资情况。,#include struct worker char name12;float salary;float bonus;float deduction;float income;,void main()struct worker staff,*pwork;/*定义指针变量*/int
23、i;pwork=/*输出工资条*/,9.4 结构体数组,一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)如果有多个学生的数据需要参加运算和处理,就要使用结构体数组。数组是相同数据类型的集合,结构体数组与以前介绍过的数值型数组不同之处在于数组元素都是结构体类型的数据。9.4.1 结构体数组的定义 struct student int num;char name20;char sex;int age;float score;struct student stu10;,9.4 结构体数组,9.4.2 结构体数组的初始化 struct 结构体名 结构体数组名=第0个元素各成员 第
24、1个元素各成员,;例如:struct student int num;char name20;char sex;int age;float score;stu4=10001,Zhang,M,19,88,10002,Li,M,18,90,10003,He,F,20,92,10004,Cheng,F,18,70;,9.4 结构体数组,9.4.3 结构体数组与指针 可以用一个指针指向结构体数组,指向结构体数组的指针的值是该结构体数组所分配的存储区域的首地址。struct student int num;char name20;char sex;int age;float score;struct s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构 共用 枚举 类型

链接地址:https://www.31ppt.com/p-5641598.html