第11章 结构体与共用体.ppt
《第11章 结构体与共用体.ppt》由会员分享,可在线阅读,更多相关《第11章 结构体与共用体.ppt(57页珍藏版)》请在三一文库上搜索。
1、第11章 结构体与共用体,概述 定义结构体类型变量的方法 结构体类型变量的引用 结构体变量的初始化 结构体数组 指向结构体类型数据的指针 用指针处理链表 共用体 枚举类型 用typedef定义类型,1. 概述,除数组外,前面介绍的数据类型都是简单类型: 整型、实型、字符型 数组是构造类型,但其所有的元素具有相同的数据类型。 本章将介绍另外一种构造类型:结构体,它的特点是内含的数据元素成员可以具有不同的数据类型。,例如: struct student unsigned int No; char name32; unsigned short age; float score; char addre
2、ss64; ;,“记录”结构体包含不同数据类型的“数据项”数据元素,每个记录作为整体进行考虑。,1. 概述,声明结构体类型的形式: struct 结构体名称 成员列表 ; 声明后的结构体类型就可以同其它的数据类型一样用来定义变量等。 结构体中的成员可以是一个简单的基本类型,也可以是复杂的构造类型。 类型与变量是不同的概念,这里只是定义了类型,尚未定义变量,因此未分配内存空间。,struct University char name32; struct School school50; ;,例如: struct School char name32; int num_staff; int typ
3、e; ;,2. 定义结构体类型变量的方法,先声明结构体类型再定义变量名 在声明类型的同时定义变量 直接定义结构体类型变量,不出现结构体名,struct student unsigned int No; char name32; unsigned short age; float score; char address64; ; struct student stu1, stu2; struct student *stu3;,struct student unsigned int No; char name32; unsigned short age; float score; char add
4、ress64; stu1, stu2, *stu3;,struct unsigned int No; char name32; unsigned short age; float score; char address64; stu1, stu2, *stu3;,2. 定义结构体类型变量的方法,说明: 类型与变量是不同概念; 结构体成员可以单独使用; 成员也可以是结构体变量; 成员名称可以与程序中的其它变量名称相同,是两个不同的对象。,sizeof(int) 4 sizeof(struct student) ? 结构体中所有成员占用字节的和。,sizeof(struct student) 10
5、6,2. 定义结构体类型变量的方法,说明: 类型与变量是不同概念; 结构体成员可以单独使用; 成员也可以是结构体变量; 成员名称可以与程序中的其它变量名称相同,是两个不同的对象。,struct student unsigned int No; char name32; unsigned short age; float score; struct data birthday; stu1, stu2;,struct data int month; int day; int year; ;,3. 结构体变量的引用,结构体变量中成员的引用: 结构体变量名.成员名 结构体指针变量中成员的引用: 结构体
6、指针变量名-成员名 不能将结构体变量作为一个整体进行输入/输出。只能对结构体变量中的各个成员分别进行输入和输出; 如果成员本身又是结构体类型,则要用若干个成员运算符,一级一级找到最低一级的成员。只能对最低级的成员进行运算; stu1.No stu1.birthday.month 结构体变量中的成员可以同其它变量一样进行运算; strcpy(stu1.name, “LiNa”); stu1.age+; 可以引用结构体变量中成员的地址,结构体变量的地址; scanf(“%d”, /输出stu1的首地址,用做函数参数,3. 结构体变量的引用,struct stu int num; char *nam
7、e; char sex; float score; ;,main() struct stu boy1,boy2; boy1.num=102; boy1.name=“Zhang ping“; printf(“input sex and scoren“); scanf(“%c %f“, ,4. 结构体变量的初始化,struct stu /*定义结构*/ int num; char *name; char sex; float score; ; main() struct stu boy2, boy1=102,“Zhang ping“,M,78.5; boy2=boy1; printf(“Numbe
8、r=%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; boy3; struct stu girl10;,定义: struct int num; char *name; char sex; float score; boy3;,5. 结构体数组,结构体数组的存储形态:,各个数组元素连续存放,5. 结构体数组,初始化: struct stu in
9、t 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 ;,可不写,struct stu int num; char *name; char sex; float score; ; struct stu boy5 = 101,“Li ping“,M,45, 102,“Zhang ping“,M,62.5, 103,“He fang“,
10、F,92.5, 104,“Cheng ling“,F,87, 105,“Wang ming“,M,58 ;,=初值列表,5. 结构体数组,【例】计算学生的总平均成绩 和统计大于90分的人数。 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,86 ;,main() int i, c=0; float ave,
11、s=0; for(i=0; i90) c+=1; printf(“s=%fn“,s); ave=s/5; printf(“average=%fn“, ave); printf(“count=%dn“, c); ,5. 结构体数组,【例】建立同学通讯录 #include #define NUM 3 struct mem char name20; char phone10; ;,main() struct mem manNUM; int i; for(i=0; iNUM; i+) printf(“input name:n“); gets(mani.name); printf(“input phon
12、e:n“); gets(mani.phone); printf(“nametttphonenn“); for(i=0;iNUM;i+) printf(“%sttt%sn“, mani.name,mani.phone); ,5. 结构体数组,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_name,leaderj.name)=0) leaderj.count+; printf(“n“); for(i=0;i3;i+) pr
13、intf(“%s:%dn“,leaderi.name,leaderi.count); ,【例】对候选人得票的统计程序 #include #include #include struct person char name20; int count; leader3=“Li“,0,“Zhang“,0,“Fun“,0;,6. 指向结构体类型数据的指针,指向结构体变量的指针; 指向结构体数组的指针; 结构体变量和结构体指针变量作函数参数。,【例】 struct stu int num; char *name; char sex; float score; boy, *pboy; struct stu
14、*pstu; pboy = ,结构体指针变量说明的一般形式为: struct 结构体名 *结构体指针变量名 结构体指针必须先赋值才能使用 pboy = 有了结构体指针变量,就能更方便地访问结构变量的各个成员。其访问的一般形式为: (*结构指针变量).成员名 或为: 结构指针变量-成员名,6. 指向结构体类型数据的指针,指向结构体变量的指针; 指向结构体数组的指针; 结构体变量和结构体指针变量作函数参数。,struct stu int num; char *name, sex; float score; boy1=102, “李平“,M,78.5, *pstu; main() pstu= ,注意
15、: pstu-num pstu-num+ (pstu-num)+ +pstu-num +(pstu-num),6. 指向结构体类型数据的指针,指向结构体数组的指针; 结构体变量和结构体指针变量作函数参数。,struct stu int num; char *name, sex; float score; boy5= 101,“Zhou ping“,M,45, 102,“Zhang ping“,M,62.5, 103,“Liou fang“,F,92.5, 104,“Cheng ling“,F,87, 105,“Wang ming“,M,58 ;,main() struct stu *ps; p
16、rintf(“NotNametttSextScoretn“); for(ps=boy; psnum,ps-name,ps-sex,ps-score); ,ps=boy; = boy0 ps+1 = boy1 ps+4 = boy4 (+ps)-num ? (ps+)-num ? 二者区别,101,“Li ping”,M,45,102,“Zhang ping”,M,62.5,103,“Liou fang”,boy0,boy1,boy2,p,p+1,pstu是指向结构的指针,若要 指向 某个成员,必须强制类型 转换 pstu=(struct stu*)boy1.name; printf(“ Nam
17、e=%sn“,pstu); Name=Zhang ping,6. 指向结构体类型数据的指针,结构体变量和结构体指针变量作函数参数。,用结构体变量的成员作参数与普通变量相同,值传递; 用结构体变量作参数效率低,一般不用,值传递,将结构 体变量所占内存单元的内容全部顺序传递给行参,行参也占内 存单元,若行参值发生变化,实参不变。 c. 用结构体变量(或数组)的指针作参数效率高。,【例】计算一组学生的平均成绩和大于90分人数。 用结构指针变量作函数参数编程。 struct stu int num; char *name, sex; float score; boy5= 101,“Li ping“,M
18、,45, 102,“Zhang ping“,M,62.5, 103,“He fang“,F,92.5, 104,“Cheng ling“,F,87, 105,“Wang ming“,M,58 ;,6. 指向结构体类型数据的指针,结构体变量和结构体指针变量作函数参数。,void ave(struct stu *ps); main() struct stu *ps = boy; ave(ps); ,void ave(struct stu *ps) int c=0, i; float ave, s=0; for(i=0; iscore; if(ps-score 90) c+=1; printf(“s
19、=%fn“, s); ave=s/5; printf(“average=%fncount=%dn“,ave,c); ,6. 指向结构体类型数据的指针,结构体变量和结构体指针变量作函数参数。,#include #include #include #define FORMAT “%dn%sn%fn%fn%fn“ struct student int num; char name20; float score3; ,main() void print(struct student); struct student stu; stu.num=12345; strcpy(stu.name,“LiLi“)
20、; stu.score0=75; stu.score1=89; stu.score2=93; print(stu); void print (struct student stu) printf(FORMAT,stu.num,stu.name,stu.score0,stu.score1,stu.score2); printf(“n“); ,6. 指向结构体类型数据的指针,结构体变量和结构体指针变量作函数参数。,#include #define FORMAT “%dn%sn%fn%fn%fn“ struct student int num; char name20; float score3;
21、stu=12345,“Li Li“,75,89,93; main() void print(struct student *); print( ,7. 用指针处理链表,链表概述; 简单链表; 建立动态链表; 输出、查询链表; 对链表的删除操作; 对链表的插入操作; 对链表的综合操作。,数组的缺陷: 需要事先按照问题规模的最大可能确定数组大小。容易造成空间浪费当问题规模远远小于给定值时,扩展性差问题规模超过最大可能改变值后,需要重新修改; 插入、删除数据元素需要大量的数据元素移动; 解决办法: 采用动态链表方法,需要多少个元素申请多少个。通过指针建立元素之间的联系。,7. 用指针处理链表,链表概
22、述; 简单链表; 建立动态链表; 输出、查询链表; 对链表的删除操作; 对链表的插入操作; 对链表的综合操作。,链表的特点: 一个头指针变量,指向头结点; 每个结点包含两部分内容: 元素值和指向后继结点的指针; 最后结点无后继,其指针为空; 结点在内存中可以不连续存放; 结点的查找需要从头指针开始,顺链一个一个查找; 查找失败的条件是到达最后结点,且该结点不满足查找条件; 插入、删除只需要修改指针,不需要元素移动; 容易扩展。,7. 用指针处理链表,链表概述; 简单链表; 建立动态链表; 输出、查询链表; 对链表的删除操作; 对链表的插入操作; 对链表的综合操作。,链表的实现: 采用结构体类型
23、数据实现。 结点结构: struct Node char name32; float score; struct Node *next; ; 链表运算: 创建、遍历、查询、插入、删除、销毁等。,7. 用指针处理链表,简单链表; 建立动态链表; 输出、查询链表; 对链表的删除操作; 对链表的插入操作; 对链表的综合操作。,简单链表:静态链表,通过结构体变量或数组实现。,struct Node char *name; float score; struct Node *next; ; main() struct Node a, b, c, *head, *p; a.name = “LiPing”;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第11章 结构体与共用体 11 结构 共用
链接地址:https://www.31doc.com/p-3418947.html