第8章结构体共用体和枚举类型.ppt
《第8章结构体共用体和枚举类型.ppt》由会员分享,可在线阅读,更多相关《第8章结构体共用体和枚举类型.ppt(89页珍藏版)》请在三一办公上搜索。
1、第8章 结构体、共用体和枚举类型,教学目的:通过本章的学习,要求了解结构型、链表、共用型和枚举型数据的特点,熟练掌握结构型的定义方法,结构型变量、数组、指针变量的定义、初始化和成员的引用方法;掌握简单链表的基本操作原理和应用;掌握共用型和枚举型的定义方法及对应变量的定义与引用;掌握用户自定义类型的定义和使用。学习本章内容可以为今后学习数据结构中的链表创建和使用打下基础。,第8章 结构体、共用体和枚举类型,教学内容,结构型的引入,很好的处理生活总的各种表格或表格中的记录,结构型的定义,结构型变量的定义、赋值、引用及引用链表等方法,共用型的定义,共用型变量的定义、赋值、引用,枚举型的定义,共用型变
2、量的定义、赋值、引用,第8章 结构体、共用体和枚举类型,重点和难点重点:(1)结构型、共用型、枚举型数据的特点和定义(2)结构型变量、数组、指针变量的定义、初始化和成员引用方法(3)共用型和枚举型变量的定义和引用方法难点:(1)嵌套的结构型数据的处理(2)用结构体解决链表问题(建立、插入、删除、输出和查询)。,8.1 结构体类型,结构型是用户自己定义的数据类型,8.1.1 结构体型的实例,前面我们学习过了基本数据类型,例如:short、long、int、float、double、char等,这些基本数据类型都是系统已经定义好的,用户可以直接使用它们。但现实世界是复杂的,在我们的日常生活中有很多
3、的表格,各表格之间又有关联。因此用户需要自己定义数据类型,用户自己定义的数据类型一旦定义好之后,就可以像使用系统类型一样使用它。例如:对一个新生进行入学登记时,就需要填一张表格,填写的内容包括姓名、性别、学号、年龄、家庭住址、联系电话、总分等多个数据项,其中姓名是字符串型(可以用字符数组来表示),性别是字符型(用m表示男性、用f表示女性),年龄是整型,总分是实型。,如图8-1所示,这些数据项之间关系紧密,每一个学生通过姓名、性别、学号、年龄、家庭地址、联系电话、总分等属性构成一个整体反映一个学生的基本情况。如果将姓名、性别、学号、年龄、家庭地址、联系电话、总分分别定义为互相独立的简单变量,难以
4、反映它们之间的内在联系。为了方便处理此类数据,常常把这些关系密切但类型不同的数据项组织在一起,即“封装”起来,并为其取一个名字,在语言中就称其为结构体(也人称为构造体),结构体是用户自定义数据类型的一种。,8.1.2 结构体类型的定义,结构体类型定义的一般形式struct 结构型名数据类型标识符成员;数据类型标识符成员;数据类型标识符成员n;请读者注意结构体定义语句的右花括号后面用分号(;)做语句结束标记。,8.1.2 结构体类型的定义,结构体型定义实例例如:为了存放一个人的姓名、性别、年龄、工资,可以定义如下的结构型:struct person char name10;char sex;in
5、t age;float wage;/*这个名为person的结构型共含有4个成员*/,8.1.2 结构体类型的定义,结构型嵌套定义【例8.1】一开始所讲的例题中的birthday类型和person类型。struct birthday/*定义含有3个整型成员的结构型 birthday*/int year;int month;int day;struct person/*定义含有4个成员的结构型 person*/char name20;char sex;struct birthday bir;/*该成员的数据类型是结构型*/float wage;,8.2.1结构型变量的定义和初始化,先定义结构型,
6、后定义变量定义结构型的同时定义变量 定义无名称的结构型的同时定义变量,8.2 结构体变量的定义和引用,例如:为学生信息定义2个变量x和y,程序段如下:struct studentlong number;char name20;char sex;float score3;struct student x,y;在定义变量的同时,可以变量赋初值,例如上例中的定义语句可以改写如下:struct student x=100001L,”Tom”,m,86,94,89,y=100002L,”Lucy”,f,78,88,45;,1.先定义结构型,后定义变量,2.定义结构型的同时定义变量,例如:为学生信息定义2
7、个变量x和y,并给他们赋初值,程序段如下:struct studentlong number;char name10;char sex;float score3;x=100001L,”Tom”,m,86,94,89,y=100002L,”Lucy”,f,78,88,45,;这种方法是将类型定义和变量定义同时进行。以后仍然可以使用这种结构型来定义其它的变量。,3.定义无名称的结构型的同时定义变量,例如:为学生信息定义2个变量x和y,并给它们赋初值,程序段如下:structlong number;char name10;char sex;float score3;x=100001L,”Tom”,m
8、,86,94,89,y=100002L,”Lucy”,f,78,88,45,;这种方法是将类型定义和变量定义同时进行,但结构型的名称省略,以后将无法使用这种结构型来定义其它变量,建议尽量少用。,8.2.2 结构型变量成员的引用,1.结构型变量成员的引用方法2.结构型变量成员地址的引用方法3.结构型变量地址的引用方法,1.结构型变量成员的引用方法,结构型变量成员的引用格式如下:结构型变量名.成员名 其中的“.”称为成员运算符,其运算级别是最高的,和圆括号运算符“()”、下标运算符“”是同级别的,运算顺序是自左向右。如果某个结构型变量的成员数据类型又是一个结构型,则其成员的引用方法如下:外层结构型
9、变量.外层成员名.内层成员名,结构型变量成员的引用实例,【例8.2】求Tom的三门课程的成绩总分,并在显示器显示出来(使用结构型变量成员的引用)。#include”string.h”struct student long number;char name10;char sex;float score3;main()struct student stu1;/*定义student类型的变量stu1*/stu1.number=100001L;/*给结构型变量stu1的成员number赋值*/strcpy(stu1.name;”Tom”);/*给结构型变量stu1的成员name赋值*/stu1.sex
10、=f;/*给结构型变量stu1的成员sex赋值*/stu1.score0=89;/*给结构型变量stu1的成员score赋值*/stu1.score1=91;stu1.score2=86;printf(“%s的总分是:%fn”,stu.name,stu1.score0+stu1.score1+stu1.score2);,2.结构型变量成员地址的引用方法,结构型的变量成员地址引用格式如下:&结构型的变量名.成员名存放结构型变量成员地址的指针变量类型必须和该成员的类型相同。,【例8.4】结构型变量成员地址引用。,#include“string.h”/*程序中使用了字符串处理函数*/sturct s
11、tudent2/*定义student2结构型*/long number;char name10;main()struct student2 x;/*定义student2类型的变量x*/long*p_number;/*定义能指向结构型student成员number的指针变量*/char*p_name;/*定义能指向结构型student成员namer的指针变量*/p_number=/*用指针变量输出结构型变量x所有成员的值*/从这个例子可以看出,使用指向结构型变量成员的指针变量来引用成员的方法比较繁琐,可以直接使用结构型变量的指针成员来引用成员。具体使用方法请参看第8章8.4节。,3.结构型变量地
12、址的引用方法,结构型变量地址的引用格式如下:存放结构型变量地址的指针变量必须是类型相同的结构型指针,关于如何使用结构型变量地址的例子请参见8.4节中介绍的指向结构型数据的指针变量。,8.3 结构型数组的定义和引用,在实际应用中,我们经常要处理的是具有 相同数据结构的一个群体。比如一批书,所有员工的通信地址,一个班级的学生等。由相同结构类型变量组成的数组,称为结构型数组。例如,全班有40人,在总成绩单上每人占一行,每行的内容包括学号、姓名、3门功课的成绩、平均分、名次,这样一个总成绩单就可以用结构型数组表示。,8.3.1 结构型数组的定义和初始化,1.先定义结构型,然后再定义结构型数组并赋初值
13、2.定义结构型的同时定义数组并赋初值 3.定义无名称的结构型的同时定义数组并赋初值,1.先定义结构型,再定义结构型数组并赋初值运算,struct student/*定义结构型*/long number;char name10;char sex;float score3;struct student s3=200001L,”Tom”,m,78,86,92,200002L,”Lucy”,f,85,69,82,200003L,”Jack”,m,84,88,96;,2.定义结构型的同时定义数组并赋初值,struct student/*定义结构型*/long number;char name10;cha
14、r sex;float score3;s3=200001L,”Tom”,m,78,86,92,200002L,”Lucy”,f,85,69,82,200003L,”Jack”,m,84,88,96;,3.定义无名称的结构型的同时定义数组并赋初值,struct/*定义结构型*/long number;char name10;char sex;float score3;s3=200001L,”Tom”,m,78,86,92,200002L,”Lucy”,f,85,69,82,200003L,”Jack”,m,84,88,96;,8.3.2 结构型数组元素成员的引用,1.结构型数组元素的引用格式如下
15、;结构型数组名下标.成员名2.结构型数组元素成员地址的引用格式如下:&结构型数组名下标.成员名,1.结构型数组元素的引用:结构型数组名下标.成员名,【例8.5】输入3个学生的数据,每个学生的信息由学号、姓名和三门功课的成绩组成,然后计算每一个学生的总分,并输出总分最高的学生信息。分析:将3个学生定义为结构型类型数组,学号为长整型、成绩为实型数组,总分存在成绩数组中。,#define N 3struct student/*定义结构型*/long number;char name10;float scoreN+1;/*score数组前三个元素用来存放成绩,第四个元素用来存 放总分*/stuN;ma
16、in()float max=0;int i,j,max_i=0;for(i=0;iN;i+)printf(“输入第%d个学生的信息,依次输入学号,姓名,三个成绩,各数据之间用,隔开”,i);scanf(“%ld,%s,%f,%f,%f”,2.结构型数组元素成员地址的引用&结构型数组名下标.成员名,【例8.6】结构型数组元素成员地址的引用#include“string.h”struct student3 long number;char name10;main()struct student3 s2;long*p_number;char*p_name;p_number=,8.4 指向结构型数据的
17、指针变量的定义和引用,前面已经提到,结构型变量或数组元素的成员可以使用“成员运算符”来直接引用,也可以使用指向结构型数据成员的指针变量来引用,但不方便。我们还可以使用指向结构型变量或数组元素的指针变量来间接引用其成员。,8.4.1 指向结构型变量的指针(两种引用方式),方式1(*指针变量).成员名方式2 指针变量-成员名 方式1比较好理解,其中“*指针变量”就代表了它所指向的结构型变量,利用“成员运算符”来引用,其作用相当于“结构型变量.成员名”。需要注意的是“*指针变量”必须用圆括号括住,因为“*”运算符的级别低于“.”运算符,如果不加括号,则优先处理“.”运算符,将出现“指针变量.成员名”
18、,会造成语法错误。方式2是一种新的引用方法,其中“-”称为“指向成员运算符”,也简称“指向运算符”。其运算级别和“()”、“”、“.”是同级的。指向运算符的左边必须是已指向某个结构型变量或数组元素的指针变量,其右边必须是对应结构型数据的成员名。,8.4.2 指向结构型数组的指针,1.指针变量指向数组元素 如果一个结构型数组元素的地址已赋予相同结构型指针变量(即指针变量指向结构型数组元素),可以使用下列两种方法来引用数组该元素的成员,其作用完全相同。方式1(*指针变量)。成员名 方式2 指针变量-成员名 注意:这里的指针变量必须是指向某个数组元素的。例如,它指向的数组元素为“数组名k”,则上述两
19、种引用方式均代表“数组名k。成员名”。2.指针变量指向数组首地址 当一个结构型数组的首地址已经赋予相同结构型的指针变量(即指针变量指向结构型数组),可以使用下列两种方式来引用下标为i的数组元素成员,其作用完全相同。方式1(*(指针变量+i).成员名 方式2(指针变量+i)成员名 注意:这里的指针变量必须是指向某个数组首地址的,则上述两种引用方式均代表“数组名i。成员名,8.4.3 在函数间传递结构型数据,1.采用“全局外部变量方式传递数据”2.采用“返回值方式传递数据”3.采用“形式参数和实际参数结合的地址传递方式双向传递数据”,8.5 用指针处理链表,我们知道用数组存放数据时,必须事先定义好
20、数组的大小,不能在程序中随便进行调整。比如有的班有100人,有的班只有30人,如果要用同一个数组先后存放不同班级的学生数据,则必须定义长度为100的数组。如果事先难以确定一个班的最多人数,则必须把数组定义的足够大,以存放任何班级的学生数据,这显然非常浪费存储空间。为此C语言提供了动态数组的构建,即链表。,8.5.1 什么是链表,链表如同一条铁链一样,一环扣一环,中间是不能断开的。这好比幼儿园的老师带领孩子出去玩,老师牵着第一个孩子的手,第一个孩子的另一只手牵着第二个孩子的手这就是一个“链”,最后一个孩子有一只手空着,他就是“链尾”。要找这个队伍,就必须先找到老师,然后顺序找到每一个孩子。链表是
21、一种动态数据结构,在程序的执行过程中可以根据需要随时间系统申请存储空间,动态地进行存储空间的分配。动态数据结构最显著的特点是包含的数据对象个数及其相互关系都可以按需要改变。常用的动态数据结构有链表、循环链表、双向链表三种。本章只介绍动态数据结构中最简单的单链表的建立及其基本操作。,1.单链表的结构,链表有一个“头指针”head,它存放链表第一个结点的首地址,它没有数据,只是一个指针变量。从图8-2中我们看到它指向链表的第一个元素。链表的每一个元素称为一个“结点”(node)。每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号num、姓名name、性别sex、和成绩score等。另一
22、个域为指针域,存放下一个结点的首地址,即指向下一个结点。链表中的每一个结点都是同一个结构类型。最后一个结点称为“链尾”,尾结点无后续点,因此不指向其他的元素,表尾结点的指针为空(NULL)。,2.链表结点的构成,由于每个结点包含数据域或者指针域两部分内容,所以链表结点采用结构体表示。例如链表结点的数据结构定义如下:struct node int num;char name10;float score;struct node*next;在链表结构中,除了数据项成员之外,还应包含一个指向本身的指针,该指针在使用时指向具有相同类型结构体的下一个结点。在链表结点的数据结构中,比较特殊的一点就是结构体内
23、指针域的数据类型使用了未定义成功的数据类型。这是在C语言中唯一可以先使用后定义的数据结构。,3.如何建立和输出一个简单静态链表,【例 8.10】建立一个如图8-3所示的简单链表,它由三个学生数据结点组成。请输出各结点中的数据。分析:为方便操作,将学生定义为一个结构体类型student,它有三个成员分别用来表示学生的学号、姓名和下一个结点的地址。在程序中逐个输入各学生的数据,通过地址赋值操作建立链表。利用当型循环用printf语句逐个输出个结点中成员的值。,程序如下:#includestruct student char no6;char name10;struct student*next;v
24、oid main()struct student A=“02001”,”tom”,B=“02002”,”jane”,C=“02003”,”henry”;struct srudent*head=NULL,*p;head=在本例中,所有结点都是在程序中定义的、不是临时开辟的、用完后也不能释放,我们把这种链表称为“静态链表”,4动态存储分配函数,所谓“动态链表”就是链表的结构是动态分配和存储的,在程序的执行过程中要根据需要随时向系统申请存储空间,动态地进行存储空间的分配。在C语言中,提供了一下函数完成存储空间的动态分配和释放。malloc函数calloc函数free函数,malloc函数,其函数原型
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构 共用 枚举 类型
链接地址:https://www.31ppt.com/p-5003491.html