xx学期C语言 第7章 结构体 链表 共用体补充知识课件

上传人:我*** 文档编号:141078458 上传时间:2020-08-04 格式:PPT 页数:54 大小:343.50KB
返回 下载 相关 举报
xx学期C语言 第7章 结构体 链表 共用体补充知识课件_第1页
第1页 / 共54页
xx学期C语言 第7章 结构体 链表 共用体补充知识课件_第2页
第2页 / 共54页
xx学期C语言 第7章 结构体 链表 共用体补充知识课件_第3页
第3页 / 共54页
xx学期C语言 第7章 结构体 链表 共用体补充知识课件_第4页
第4页 / 共54页
xx学期C语言 第7章 结构体 链表 共用体补充知识课件_第5页
第5页 / 共54页
点击查看更多>>
资源描述

《xx学期C语言 第7章 结构体 链表 共用体补充知识课件》由会员分享,可在线阅读,更多相关《xx学期C语言 第7章 结构体 链表 共用体补充知识课件(54页珍藏版)》请在金锄头文库上搜索。

1、一、结构体,1.声明一个结构体类型的一般形式,2.结构体类型变量的说明,3.结构体变量成员的表示方法,4.结构体变量的赋值,5.结构变量的初始化,6.结构体数组,7.指向结构体类型数据的指针,在实际问题中,一组数据往往具有不同的数据类型。,例如:在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。,不能用一个数组来存放,因为数组中各元素的类型和长度都必须一致。 中给出了另一种构造数据类型“结构体”。 相当于其它高级语言中的记录。 “结构体”是一种构造类型,它是由若干“成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。 结构

2、体既是一种“构造”而成的数据类型,在说明和使用之前必须先定义。,能使用数组来存放这些数据么?,定义一个结构体的一般形式为: struct 结构名 成员表列; 成员表列由若干个成员组成,每个成员都是该结构体的一个组成部分。对每个成员也必须作类型说明,其形式为: 类型说明符 成员名; 成员名的命名应符合标识符的书写规定。例如: struct stu int num; char name20; char sex; float score; ;,1.声明一个结构体类型的一般形式,1)先定义结构体类型,再定义结构变量。 如:struct stu int num; char name20; char se

3、x; float score; ; struct stu boy1,boy2; 这种形式的说明的一般形式为: struct 结构名 成员表列 ; struct stu 变量名表列;,定义结构体变量有以下三种方法。以上面定义的stu为例来加以说明。,2)在声明结构类型的同时定义结构变量。 例如:struct stu int num; char name20; char sex; float score; boy1,boy2; 这种形式的说明的一般形式为: struct 结构名 成员表列 变量名表列;,2.结构体类型变量的说明,3)直接定义结构变量(不出现结构体名)。 例如:struct int

4、num; char name20; char sex; float score; boy1,boy2; 这种形式的说明的一般形式为: struct 成员表列 变量名表列;,定义结构体变量有以下三种方法。以上面定义的stu为例来加以说明。,2.结构体类型变量的说明,三种方法中说明的boy1,boy2变量都具有下图所示的结构。,例如:struct stu int num; char name20; char sex; float score; boy1,boy2;,说明boy1,boy2变量为stu类型后,即可向这两个变量中的各个成员赋值。,成员也可又是一个结构体类型数据,即构成了嵌套的结构。,例

5、:有如下结构体定义: struct date int month; int day; int year; ; struct student int num; char name20; char sex; struct date birthday; float score; boy1,boy2;,首先定义一个结构体类型 struct date,由三个成员组成。再定义struct student并说明变量 boy1 和 boy2 时,其中的成员birthday被说明为struct data结构体类型。 成员名可与程序中其它变量同名,互不干扰。,ANSI C中,一般对结构体变量的使用,包括赋值、输入

6、、输出、运算等都是通过结构体变量的成员来实现的,往往不把它作为一个整体来使用。 表示结构体变量成员的一般形式是: 结构体变量名.成员名 例如:boy1.num 即第一个人的学号;boy2.sex 即第二个人的性别.,boy1,boy2,如果成员本身又是一个结构体,则必须逐级找到最低级的成员才能使用。 例如:boy1.birthday.month 即第一个人出生的月份成员可以在程序中单独使用,与普通变量完全相同。,3.结构体变量成员的表示方法,结构体变量的赋值就是给各成员赋值。可用输入语句或赋值语句来完成。,main() struct stu int num; char *name; char

7、sex; float score; boy1,boy2; boy1.num=102; boy1.name=Zhang ping; printf(input sex and scoren); scanf(%c %f, ,例1:给结构体变量赋值并输出其值。,4.结构体变量的赋值,和其他类型变量一样,对结构体变量可以在定义时进行初始化赋值。 例2:对结构体变量初始化。,main( ) struct stu /*定义结构*/ int num; char *name; char sex; float score; boy2,boy1=102,Zhang ping,M,78.5; boy2=boy1; p

8、rintf(Number=%dnName=%sn,boy2.num,boy2.name); printf(Sex=%cnScore=%fn,boy2.sex,boy2.score); ,5.结构变量的初始化,结构体数组的每一个元素都是具有相同结构体类型的下标结构变量。在实际应用中,经常用结构体数组来表示具有相同数据结构的一个群体。如一个班的学生档案,一个车间职工的工资表等。结构体数组的定义和结构体变量相似,只需说明它为数组类型即可。,例如:struct stu int num; char *name; char sex; float score; boy5; 定义了一个结构数组boy,共有5个

9、元素,boy0boy4。每个数组元素都为struct stu类型。,6.结构体数组,struct stu int num; char *name; char sex; float score; boy5=101,Li ping,M,45, 102,Zhang ping ,M, 62.5, 103,He fang ,F, 92.5, 104,Cheng ling ,F, 87, 105,Wang ming ,M, 58; 当对全部元素作初始化赋值时,也可不给出数组长度。,对结构数组可以作初始化赋值:,例3:计算学生的平均成绩和不及格的人数。,main( ) int i,c=0; float av

10、e,s=0; for(i=0;i5;i+) s=s+boyi. score; if(boyi.score60) c= c+1; printf(s=%fn,s); ave=s/5; printf(average=%fncount=%dn,ave,c); ,一个指针变量当用来指向一个结构体变量时,称之为结构体指针变量。结构体指针变量中的值是所指向的结构体变量的首地址。通过结构体指针即可访问该结构变量。 结构体指针变量说明的一般形式为: struct 结构名 *结构指针变量名 例如,如要说明一个指向结构体stu的指针变量pstu,可写为: struct stu *pstu; 当然也可在定义stu结构

11、体时同时说明pstu。,7.指向结构体类型数据的指针,结构体指针变量必须先赋值才能使用。赋值是把结构体变量的首地址赋予该指针变量,不能把结构体名赋予该指针变量。,如果boy是被说明为stu类型的结构变量,则: pstu= char *name; char sex; float score; boy1=102,Zhang ping,M,78.5,*pstu; main( ) pstu= ,在C语言中,对结构体成员的引用有以下三种形式: 结构变量.成员名 (*结构指针变量).成员名 结构指针变量-成员名 这三种用于表示结构体成员的形式是完全等效的。,*指向结构数组的指针,指针变量可以指向一个结构数

12、组,这时结构指针变量的值是整个结构数组的首地址。结构指针变量也可指向结构数组的一个元素,这时结构指针变量的值是该结构数组元素的首地址。 例如:设ps为指向结构数组的指针变量,则ps也指向该结构数组的0号元素,ps+1指向1号元素,ps+i则指向i号元素。这与普通数组的情况是一致的。,struct stu int num; char *name; char sex; float score; boy5=101,Zhou ping,M,45, 102,Zhang ping,M,62.5, 103,Liu fang,F,92.5, 104,Cheng ling,F,87, 105,Wang ming

13、,M,58; main() struct stu *ps; printf(NotNametttSextScoretn); for( ps=boy;psnum,ps-name,ps-sex,ps-score); ,例5:用指针变量输出结构数组。,score,sex,name,num,应该注意的是,一个结构体指针变量虽然可以用来访问结构体变量或结构体数组元素的成员,但是,不能使它指向一个成员。也就是说不允许取一个成员的地址来赋予它。因此,下面的赋值是错误的。 ps=,3)用结构体变量和指向结构体的指针作函数参数,ANSI C中允许用结构体变量作函数参数进行整体传送。但是这种传送要将全部成员逐个传送

14、,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。 因此最好的办法就是使用指针,即用指针变量作函数参数进行传送。这时由实参传向形参的只是地址,从而减少了时间和空间的开销,提高运行效率。,例6:计算一组学生的平均成绩和不及格人数。用结构指针变量作函数参数。,struct stu int num; char *name; char sex; float score; boy5=101,Li ping,M,45, 102,Zhang ping,M,62.5, 103,“Liu fang,F,92.5, 104,Cheng ling,F,87, 105,Wang ming,M

15、,58 ;,main( ) struct stu *ps; void ave(struct stu *ps); ps=boy; ave(ps); ,void ave(struct stu *ps) int c=0,i; float ave,s=0; for(i=0;iscore; if(ps-score60) c+=1; printf(s=%fn,s); ave=s/5; printf(average=%fncount=%dn,ave,c); ,二、链表,1.链表,2.处理动态链表所需的函数,3.链表的基本操作,链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。 用数组存放数据

16、时,必须事先定义固定的长度(即元素个数)。如果事先难以确定一个班的最多人数,则必须把数组定义的足够大,以能存放任何班级的学生数据。显然这将会浪费内存。,1.链表,链表则没有这种缺点,它根据需要开辟内存单元。下图表示的是最简单的一种链表(单向链表)的结构。,图中,第0个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量。以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号num,姓名name,性别sex和成绩score等。另一个域为指针域,存放下一结点的首地址。 除头结点链表中的每一个结点都是同一种结构类型。,链表的数据结构,必须利用指针变量才能实现。在C语言中

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

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