C语言程序设计第7章.ppt
《C语言程序设计第7章.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计第7章.ppt(93页珍藏版)》请在三一办公上搜索。
1、第7章结构与共用,返回总目录,目录,7.1结构类型,7.2共用类型,7.3枚举类型,7.5自定义类型,7.4位域,返回总目录,7.6习题七,基本要求:)熟悉结构类型的定义与使用;)熟悉共用类型的定义与使用;)掌握枚举类型、位域及自定义类型的定义与使用学习重点:)结构类型的定义与使用;)自定义类型的定义与使用;,7.1结构类型,7.1.1 结构类型的定义、初始化与引用,返回目录,在日常生活中,我们常会遇到一些需要填写的登记表,如成绩表、通讯地址等,如图7.1所示。这些表中集合了各种标准类型数据,无法用前面学过的任一种数据类型完全描述,因此,C语言引入一种能集不同数据类型于一体的数据类型结构类型(
2、structure)。,图7.1,结构类型的定义,7.1结构类型,7.1.1 结构类型的定义、初始化与引用,定义一个结构类型的一般形式为:struct 结构名 类型成员名1;类型成员名2;;花括弧内是该结构类型中的各个成员(或称分量),是一组系统标准变量类型,由它们组成一个结构类型。若把成员的集合称为“域表”,每一个成员则称为一个域。成员的命名规则与标准变量命名规则相同。,结构类型的定义,7.1结构类型,7.1.1 结构类型的定义、初始化与引用,例如,通讯录的结构类型定义为:struct addr char name20;/*姓名*/char department30;/*部门*/char a
3、ddress30;/*住址*/long int zip;/*邮编*/long int phone;/*电话号码*/char email30;/*Email*/;,结构类型的定义,7.1结构类型,7.1.1 结构类型的定义、初始化与引用,同样,成绩表的内容可以用另一个结构类型来表示:struct score char grade20;/*班级*/long int number;/*学号*/char name20;/*姓名*/char sex;/*性别*/float maths;/*数学成绩*/float database;/*数据库成绩*/float english;/*英语成绩*/;,结构类型
4、的定义,7.1结构类型,7.1.1 结构类型的定义、初始化与引用,结构类型变量的定义(3种方式),先定义结构类型再定义变量名其一般形式为:struct 结构名 类型成员名1;类型成员名2;;struct 结构名结构变量名表;,例如:struct score char grade20;long int number;char name20;char sex;float maths;float database;float english;struct score stu1,stu2;,7.1结构类型,7.1.1 结构类型的定义、初始化与引用,(2)在定义类型的同时定义变量这是一种双重定义,其一般
5、形式为:struct 结构名 类型成员名1;类型成员名2;结构变量名表;,例如:struct score char grade20;long int number;char name20;char sex;float maths;float database;float english;stu1,stu2;,结构类型变量的定义(3种方式),7.1结构类型,7.1.1 结构类型的定义、初始化与引用,(3)直接定义结构类型变量若仅需要结构变量,则定义时可以不出现结构名。其一般形式为:struct 类型成员名1;类型成员名2;结构变量名表;,例如:structchar grade20;long in
6、t number;char name20;char sex;float maths;float database;float english;stu1,stu2;,结构类型变量的定义(3种方式),7.1结构类型,7.1.1 结构类型的定义、初始化与引用,上3例中的结构变量stu1与stu2定义后,具有结构类型struct score定义的结构。如图7.2所示。(图中结构变量的各个成员的值是假设的),结构类型变量的定义(3种方式),7.1结构类型,7.1.1 结构类型的定义、初始化与引用,在编译时,不对结构类型分配空间,只对结构变量分配空间。Turbo C编译器将自动地分配适当的内存区域给结构变
7、量的各个成员变量。结构变量stu1的内存分配情况(设字符占1bytes,整型数占2 bytes)如表7.1所示。,结构类型变量的定义(3种方式),7.1结构类型,7.1.1 结构类型的定义、初始化与引用,结构变量引用规则,(1)成员的访问。对结构变量中各个成员的访问,用操作符“.”表示,其格式为:结构变量名.成员名操作符“.”称为成员运算符,具有最高优先级。C允许直接赋值给一个结构变量成员,而不能将一个结构变量作为一个整体进行输入和输出。例如,若系统已经进行了如图7.2所示的定义,则将30301赋给其结构变量stu1中的number成员的正确语句是:stu1.number=30301;而以下语
8、句是错误的:scanf(%s,%ld,%s,%c,%f,%f,%f,7.1结构类型,7.1.1 结构类型的定义、初始化与引用,(2)对成员变量可以象普通变量一样进行各种运算。下列运算是正确的:stu1.number+;+stu1.number;注意:运算stu1.number+是对stu1中的number进行自加运算,而不是先对stu1进行自加运算。,结构变量引用规则,7.1结构类型,7.1.1 结构类型的定义、初始化与引用,(3)可以引用成员的地址,也可以引用结构变量的地址。如对于如图7.2的结构类型:scanf(%ld,/*输出stu1的首地址*/结构体变量的地址主要用于作函数参数,传递结
9、构体的地址值。,结构变量引用规则,7.1结构类型,7.1.1 结构类型的定义、初始化与引用,结构变量的初始化,可以在定义结构变量的同时,对结构变量中的各个成员进行初始化。初始化时注意数据类型一致性。,7.1结构类型,7.1.1 结构类型的定义、初始化与引用,例7.1在定义结构类型的同时进行结构变量的定义及初始化。#include struct addrchar name20;char department30;char address30;long int zip;long int phone;char email30;a=Liu Lin,Maths,17 BeiHuang Road,1000
10、08,856432,LL;main()printf(name:%sndepartment:%snaddress:%sn,a.name,a.department,a.address);printf(zip:%ldnphone:%ldnemail:%sn,a.zip,a.phone,a.email);,结构变量的初始化,7.1结构类型,7.1.1 结构类型的定义、初始化与引用,例7.2先定义结构类型,再进行结构变量的定义及初始化。#include main()struct addrchar name20;char depart30;char address30;long int zip;long
11、int phone;char email30;struct addr a=Liu Lin,Maths,17 BeiHuang Road,10008,856432,LL;printf(name:%sndepartment:%snaddress:%sn,a.name,a.depart,a.address);printf(zip:%ldnphone:%ldnemail:%sn,a.zip,a.phone,a.email);,结构变量的初始化,7.1结构类型,7.1.2 结构类型数组,1.结构数组定义,与定义结构变量的方法相似,结构数组只需说明其为数组即可。例如,定义一个能保存35个同学的通讯录结构数
12、组,格式1为:struct addrchar name20;char depart30;char address30;long int zip;long int phone;char email30;struct addr stu35;,7.1结构类型,7.1.2 结构类型数组,与定义结构变量的方法相似,结构数组只需说明其为数组即可。例如,定义一个能保存35个同学的通讯录结构数组,格式2为:struct addrchar name20;char depart30;char address30;long int zip;long int phone;char email30;stu35;,1.结
13、构数组定义,7.1结构类型,7.1.2 结构类型数组,与定义结构变量的方法相似,结构数组只需说明其为数组即可。例如,定义一个能保存35个同学的通讯录结构数组,格式3为:struct char name20;char depart30;char address30;long int zip;long int phone;char email30;stu35;,1.结构数组定义,7.1结构类型,7.1.2 结构类型数组,2.结构数组的初始化,示例一在定义结构类型的同时进行结构数组的定义及初始化。#include struct addrchar name20;char department30;ch
14、ar address30;long int zip;long int phone;char email30;stu3=Liu Lin,Maths,17 BeiHuang Road,100008,856432,LL,Huang Lu,Office,118 HengHuanRoad,100070,833932,“Huang_L”,Wang Min,Design,1010 Zhongshan Road,400030,674322,WangM;,7.1结构类型,7.1.2 结构类型数组,示例二先定义结构类型,再进行结构数组的定义及初始化。#include struct addrchar name20;
15、char department30;char address30;long int zip;long int phone;char email30;struct addr stu3=Liu Lin,Maths,17 BeiHuang Road,100008,856432,LL,Huang Lu,Office,118 HengHuanRoad,100070,833932,“Huang_L”,Wang Min,Design,1010 Zhongshan Road,400030,674322,WangM;,2.结构数组的初始化,7.1结构类型,7.1.3 结构类型数据的指针,1.指向结构变量的指针,
16、(2)定义指向结构类型变量的指针变量:struct 结构名*指针变量名;也可将所定义的指针变量指向结构类型变量(注意,它只能指向一个结构类型变量,而不能指向结构类型变量的某一成员)。如:指针变量=(3)引用形式如下:指针变量-成员其中算符“-”称为指向运算符,由一个减号“-”和一个小于号“”组成。下面是与指向运算符相关的几种运算:,下面用简单例子来说明指向结构变量的指针变量的应用,指针指向的示意图如图7.4。在这段程序中,前两个printf函数是输出stu1的各个成员的值,后两个printf函数使用p-num的形式来输出stu1各成员的值,而结果是相同的。,7.1结构类型,7.1.3 结构类型
17、数据的指针,1.指向结构变量的指针,例7.3:,在C语言中,当用一个指针变量p指向某个结构变量后,则以下三种结构成员的引用是等价的:结构变量.成员名;p-成员名;(*p).成员名;一般采用前两种方法之一。,7.1结构类型,7.1.3 结构类型数据的指针,1.指向结构变量的指针,7.1结构类型,7.1.3 结构类型数据的指针,2.指向结构数组的指针,可以用指针或指针变量来指向结构数组及其元素,其定义和使用原则与指向结构变量的指针相同。,例7.4:,7.1结构类型,7.1.3 结构类型数据的指针,3.用指向结构的指针作函数参数,把一个结构变量的值传递到另一个函数,有3种方式:传递结构成员:把结构变
18、量的成员按普通变量一样进行按值传递,此时调用函数仅使用结构的部分成员。传递结构变量:用结构变量作函数参数进行整体传送。但是这种传送要将全部成员逐个按值传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。传递结构指针:即用指针变量(或结构数组名)作函数参数进行传送,这里由实参传向形参的只是地址,从而减少了时间和空间的开销。,例7.5,例7.6:,7.1结构类型,7.1.4 结构的嵌套,结构类型的嵌套结构就是成员也可以是一个结构变量,即允许“嵌套”的结构类型。例如图7.6所示的结构类型。,由于成员本身又属一个结构类型,在访问成员时,则要用若干个成员运算符,逐级找到最低一
19、级的成员。系统只能对最低的成员进行赋值或存储以及运算。例如,对上面定义的struct score结构变量stu1,可以这样访问各成员:stu1.name不能是stu1.subject,因为subject本身是一个结构变量。同理,下面语句是正确的:sum=stu1.course.maths+stu2.course.maths;stu2.course.maths=stu1.course.maths;,7.1结构类型,7.1.4 结构的嵌套,7.1结构类型,7.1.5 用指针处理链表,利用在结构变量中所包含的指针类型成员,用它来指向其它结构类型数据,或指向与自身所在结构类型相同的结构类型数据,以这种
20、方法来定义一个链表。例如:struct stu int num;char name20;float score;struct stu*next;,1.链表概述,7.1结构类型,7.1.5 用指针处理链表,其中next是指针类型的成员名,它指向struct stu类型数据(即next所在的结构类型数据)。构成的链表结构如图7.8所示。该链表中每一个结点都属于struct stu类型,其成员next存放下一结点的地址。,1.链表概述,7.1结构类型,7.1.5 用指针处理链表,2.建立与输出链表,在定义结构类型时,系统并未实际分配存储空间。为能让链表在需要时动态地开辟和释放一个结点的存储单元,语言
21、编译系统的库函数提供以下相关库函数:void*malloc(unsigned size)在内存的动态存储区中分配一长度为size的连续空间。分配空间成功则返回值是一个空类型指针,指向该分配域的起始地址。否则返回值为NULL。void*calloc(unsigned n,unsigned size)在内存的动态区存储中分配n个长度为size的连续空间。分配空间成功则返回值是一个空类型指针,指向该分配域的起始地址。否则返回值为NULL。void free(void*ptr)释放由ptr指向的内存区。,链表的建立过程:定义链表数据结构;创建一个空表head=NULL;输入数据有效,重复以下操作:利用
22、malloc()函数向系统申请分配一个节点p1,并初始化p1的数据项和指针项。若是空表,将新节点连接到表头;若是非空表,将新节点接到表尾;注意:链表的头指针是非常重要的参数,因为对链表的输出和查找都要从链表的头开始,所以链表创建成功后,要返回一个链表头节点的地址,即头指针。,7.1结构类型,7.1.5 用指针处理链表,2.建立与输出链表,7.1结构类型,7.1.5 用指针处理链表,2.建立与输出链表,链表的输出过程:首先找到链表头head,只有是非空链表才将节点的值输出,若是空表则立即退出输出过程;若是非空链表,则通过指针的不断向后移动逐个输出链表中各个节点的值,直到链表尾。算法流程图如图7.
23、10所示,即:找到表头p=head;当链表非空p!=NULL时,重复以下操作;输出节点p数据p-num;跟踪p下一节点p=p-next;,7.1结构类型,7.1.5 用指针处理链表,2.建立与输出链表,head,输入1,输入2,输入3,输入4,输入1,则结束,1)建立链表:,2)输出链表:,输出1,输出2,输出3,输出4,7.1结构类型,7.1.5 用指针处理链表,3.链表的删除与插入操作,从链表中删除一个节点有三种情况:删除链表头节点、删除链表中间的某一节点、删除链表的尾节点,如图7.11所示。由于删除的节点可能是链表的头,会对链表的头指针进行修改,所以删除节点函数的返回值定义为返回结构类型
24、的指针。,7.1结构类型,7.1.5 用指针处理链表,3.链表的删除与插入操作,7.1结构类型,7.1.5 用指针处理链表,3.链表的删除与插入操作,附图链表中第i个结点的删除过程,head,a1,ai-1,a,i,p,head,a1,p,s p-next;,p-next s-next;,free(r);,ai-1,ai+1,ai,an,an,(a)寻找第i1个结点,并由p指向它,(b)删除并释放第i个结点,7.1结构类型,7.1.5 用指针处理链表,3.链表的删除与插入操作,将一个节点插入到一个已有的链表中也有三种情况,如图7.12所示。插入的节点可以在表头、表中或表尾。,7.1结构类型,7
25、.1.5 用指针处理链表,3.链表的删除与插入操作,7.1结构类型,7.1.5 用指针处理链表,3.链表的删除与插入操作,a1,head,a4,a5,a6,(a)寻找插入位置,(b)申请新的结点,a2,a3,e,(c)插入过程,附图在链表第5个结点前插入一个结点的过程示意图,7.1结构类型,7.1.5 用指针处理链表,3.链表的删除与插入操作,例7.8创建包含学号、姓名节点的单链表。其节点数不限,表以学号为序,低学号的在前,高学号的在后,以输入姓名为空作结束。在此链表中,要求删除一个给定姓名的节点,并插入一个给定学号和姓名的节点。解题思路链表定义与输出函数可以参见前例。对于插入函数,利用mal
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-6504143.html