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

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