第7章结构体、共用体和枚举类型.ppt

上传人:sccc 文档编号:4966380 上传时间:2023-05-26 格式:PPT 页数:46 大小:670.54KB
返回 下载 相关 举报
第7章结构体、共用体和枚举类型.ppt_第1页
第1页 / 共46页
第7章结构体、共用体和枚举类型.ppt_第2页
第2页 / 共46页
第7章结构体、共用体和枚举类型.ppt_第3页
第3页 / 共46页
第7章结构体、共用体和枚举类型.ppt_第4页
第4页 / 共46页
第7章结构体、共用体和枚举类型.ppt_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《第7章结构体、共用体和枚举类型.ppt》由会员分享,可在线阅读,更多相关《第7章结构体、共用体和枚举类型.ppt(46页珍藏版)》请在三一办公上搜索。

1、2023/5/26,1,第7章 结构体、共用体和枚举类型,7.1 结构体类型 7.2 结构体数组 7.3 结构体指针变量 7.4 链表 7.5 共用体 7.6 枚举类型,2023/5/26,2,6.1 结构体类型,概述有时,需将不同类型的数据组合成一个有机的整体,以便于引用。这些数据是相互联系的。如一个学生的有关信息:,可采用结构体数据结构描述上述信息。,2023/5/26,3,结构体类型的定义,示例:struct student int num;char name20;char sex;int age;char addr30;;,定义一个结构体类型的一般形式为:,struct 结构体名 成员

2、表列;,对各成员都要进行类型说明;成员名定名规则与变量名同。,是类型,不是变量名,2023/5/26,4,结构体类型的定义,结构体类型定义的一般形式struct 结构名 数据类型 成员名 1;数据类型 成员名 2;数据类型 成员名 n;;,struct medicinechar code;/*药品代号*/char name;/*药品名称*/float price;/*单价*/char place;/*产地*/stuct goods caption;/*来源地*/;,2023/5/26,5,结构体类型变量的定义,1、在定义类型的同时定义变量struct studentint num;char n

3、ame20;char sex;int age;char addr30;student1,student2;,一般形式是:struct 结构体名 成员表列 变量名表列;,2023/5/26,6,结构体类型变量的定义,2、先定义结构体类型再定义变量名struct studentint num;char name20;char sex;int age;char addr30;struct student student1,student2;,定义student1和student2为struct student类型变量,struct不可省略,不能只指定一个变量为“struct型”而不指定结构体名,20

4、23/5/26,7,结构体类型变量的定义,3、直接定义结构类型变量(无名定义)struct int num;char name20;char sex;int age;char addr30;student1,student2;,省略了结构体类型名,以后不能再用这种结构体类型定义其它变量,2023/5/26,8,结构体变量的存储,一个结构体变量所占用内存空间的字节数可以用sizeof运算符求出,它的一般形式为:sizeof(变量名或类型标识符)例struct test int m110;char m2;float m3;double m4;aa;,sizeof(struct test)=4*10

5、+1+4+8=53,2023/5/26,9,几点说明:,1.类型与变量是不同概念,不要混淆;2.结构体中的成员,可以单独使用,其作用与地位相当于普通变量;3.成员也可以是一个结构体变量;例如:,struct date int month;int day;int year;,struct studentint num;char name20;int age;struct date birthday;student1,student2;,4.成员名可以与程序中的变量名相同,二者不代表同一对象。,2023/5/26,10,结构体变量的初始化,语法形式 struct 结构体类型名 结构体变量名=初始数

6、据示例 struct student/学生信息结构体 int num;/学号 char name20;/姓名 char sex;/性别 int age;/年龄 stu=97001,Lin Lin,F,19;,注意:不能在结构体内直接赋值,2023/5/26,11,结构体变量的初始化,含嵌套结构的结构体变量初始化,struct date int month;int day;int year;,Struct studentint num;char name20;int age;struct date birthday;,struct student st1=10001,Lin Lin,21,8,1

7、5,1990;struct student st2=10002,Li Lin,20,6,12,1991;,2023/5/26,12,结构体变量的成员的访问,语法形式:结构体变量名.成员名说明对成员变量可以象普通变量一样进行赋值或存取以及各种运算,如:st1.num=10015;scanf(%d,若成员本身又属一个结构体类型,只能对最低级的成员进行赋值或存取以及运算。如:st1.birthday.year,2023/5/26,13,结构体变量的成员的访问(续),两个结构体变量之间可以进行整体赋值。但对结构体变量进行输入和输出时,只能是针对每一个成员来进行。struct student st3;s

8、t3=st1;printf(%d,st3);/错误,2023/5/26,14,例7-2 结构体变量初始化(p175),#includestruct long no;char name20;char sex;int age;char addr30;stu1=11301,Wang Lin,M,19,200 Beijing Road;int main()printf(no=%ld,name=%s,sex=%c,age=%d,addr=%sn,stu1.no,stu1.name,stu1.sex,stu1.age,stu1.addr);,2023/5/26,15,例7-3 结构体变量赋值,#inclu

9、de#include struct long no;char name20;char sex;STUDENT;int main()STUDENT.no=11201;strcpy(STUDENT.name,Li Ping);STUDENT.sex=M;printf(no=%ld,name=%s,sex=%cn,STUDENT.no,STUDENT.name,STUDENT.sex);,2023/5/26,16,7.2 结构体数组,1.结构体数组的定义struct student int num;char name20;double score;stu15;struct student stu25

10、;,2023/5/26,17,结构体数组,2.访问结构体数组元素的成员 例:stu10.num3.结构体数组的初始化 struct student int num;char name20;double score;stu12=1001,”wangliping”,85.5,1002,”zhangli”,78;,2023/5/26,18,示例:设有三个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。,struct person char name20;int count;leader3=Li,0,Zhang,0,Liu,0;int main()int i,j;char leade

11、r_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+;for(i=0;i3;i+)printf(%s,%dn,leaderi.name,leaderi.count);,2023/5/26,19,7.3 结构体指针变量,指向结构体变量的指针变量结构体指针变量的定义及初始化struct 结构体类型名*指针变量名;例:struct student*s;注意:此时s还未具体确定指向哪个结构体变量,需要在程序中把结构体变量的地址赋给

12、s;或者在定义s时初始化例:student stu;struct student*s=,2023/5/26,20,结构体指针,访问结构体变量中的成员有三种方式结构体变量.成员名(*结构体指针).成员名 结构体指针-成员名指向结构体数组的指针变量与指向普通数组的指针变量的定义和使用方法完全一样,指向运算符。其优先级高于自增、自减运算符,2023/5/26,21,指向运算符示例,试分析以下运算:p-n 得到p指向的结构体变量中的成员n的值p-n+得到p指向的结构体变量中的成员n的值,用完后使它加1;+p-n 得到p指向的结构体变量中的成员n的值 使其先加1,2023/5/26,22,例7-7 用指

13、向结构体数组的指针输出结构体数组中各成员的值(p180),#include#includeint main()struct STUDENT long no;char name20;char sex;float score;student5=11001,Li ping,M,45,11002,Zhang ping,M,62.5,11003,He fang,F,92.5;struct STUDENT*p;printf(no name sex scoren);for(p=student;pno,p-name,p-sex,p-score);,2023/5/26,23,结构体指针的应用,1.用结构体指针变

14、量作函数的参数P181-例7-92.用结构体指针处理链表链表概述链表的建立和输出(例6.8),2023/5/26,24,7.4 链表,链表是将若干数据项按一定规则连接起来的表,链表中的每个元素称为一个结点。即链表是由称为结点的元素组成的,结点的多少根据需要确定。链表连接的规则是:前一个结点指向下一个结点;只有通过前一结点才能找到下一个结点。因此,每个结点都应包括两方面的内容:(1)数据域,该部分可以根据需要由多个成员组成,它存放的是需要处理的数据。(2)指针域,该部分存放的是一个结点的地址,链表中的每个结点通过指针连接在一起。,2023/5/26,25,链表结构(1),2023/5/26,26

15、,链表结构(2),2023/5/26,27,单链表结点的类型定义,struct 结构名 数据成员列表;struct 结构名*指针名;,表示成员指针所指对象的类型就是自身结点类型。,示例:struct student long num;double score;struct student*next;,2023/5/26,28,链表的基本操作,对链表的基本操作有建立、查找、插入、删除和修改等。(1)建立链表是指从无到有建立一个链表,即往空链表中依次插入一个结点,并保持结点之间的前驱和后继的关系。(2)查找操作是指在给定的链表中,查找具有检索条件的结点。(3)插入操作是指在某两个结点之间插入一个新

16、的结点。(4)删除操作是指在给定的链表中,删除某个特定的结点,也就是插入的逆过程。(5)修改操作是指在给定的链表中,首先根据某已知的条件,查找到该结点,再修改数据域中的某些数据项。,2023/5/26,29,链表的建立,struct STUDENT*create()struct STUDENT*head,*p1,*p2;head=(struct STUDENT*)malloc(LEN);head-next=NULL;p1=head;p2=(struct STUDENT*)malloc(LEN);/建立第一个节点 scanf(%ld,%f,2023/5/26,30,链表的建立(续),while(

17、p2-no!=0)p2-next=p1-next;p1-next=p2;p1=p2;p2=(struct STUDENT*)malloc(LEN);scanf(%ld,%f,2023/5/26,31,链表的输出,void print(struct STUDENT*head)struct STUDENT*p;printf(nThese%d nodes are:n,n);p=head-next;/指针P指向第一个节点while(p!=NULL)printf(%ld%5.1fn,p-no,p-score);p=p-next;/p指针后移,2023/5/26,32,插入节点(保持学号由小到大的次序),

18、void insert(struct STUDENT*head,struct STUDENT*p0)struct STUDENT*p1,*p2;p1=head-next;p2=head;while(p0-nop1-no),2023/5/26,33,删除节点,int delete(struct STUDENT*head,long num)struct STUDENT*p1,*p2;p2=head;p1=head-next;if(head-next=NULL)/链表为空表return-1;while(num!=p1-no,2023/5/26,34,7.5 共用体(联合体),使几个不同的变量共占同一

19、段内存的结构,称为“共用体”类型的结构定义形式:union 共用体类型名 数据类型 成员名 1;数据类型 成员名 2;数据类型 成员名 n;;,2023/5/26,35,或union int i;char ch;float f;a,b,c;,共用体定义示例,union data int i;char ch;float f;a,b,c;,或union dataint i;char ch;float f;union data a,b,c;,直接定义,先定义类型,不可省略,2023/5/26,36,访问共用体的成员,访问方法共用体变量.成员名(*共用体指针).成员名共用体指针-成员名注意:只能引用共

20、用体变量中的成员,不能引用共用体变量本身。如:可以引用 a.i(引用共用体变量中的整型变量i)a.ch(引用共用体变量中的字符变量ch)a.f(引用共用体变量中的实型变量f)不能引用 printf(%d,a);,2023/5/26,37,共用体类型的特点,每一瞬时只有一个成员起作用;共用体变量中起作用的成员是最后一次存放的成员;共用体变量的地址和它的各成员的地址都是同一地址;共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。而结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。,2023/5/26,38,结构体与联合体所占用的内存长度,结构体类型变量所占内存长度是各成员占

21、的内存长度之和。联合体类型变量所占内存长度等于最长的成员的长度。,2023/5/26,39,例7-15为共用体各成员赋值,并输出各成员的值(p189),#includeint main()union data float m;int n;char c;temp;temp.m=25.6F;/temp.n=12;/temp.c=a;printf(共用体各成员的值:n);printf(m=%.2fnn=%dnc=%cn,temp.m,temp.n,temp.c);printf(%d,sizeof(union data);,2023/5/26,40,所谓“枚举”是指将变量的值一一列举出来,变量的值只限

22、于列举出来的值的范围内。定义枚举类型 enum 枚举类型名 变量值列表;例:enum weekday sun,mon,tue,wed,thu,fri,sat;定义枚举变量用定义好的枚举类型类型定义变量 enum weekday workday,week_end;直接定义枚举变量 enum weekday sun,mon,tue,wed,thu,fri,sat workday,week_end;,7.6 枚举类型,2023/5/26,41,枚举元素为整型常量,不是变量,故不能对它们赋值枚举常量有值。如上面定义中,sun、mon、tue sat的值依次为0、1、27也可改变枚举元素的值,在定义时指

23、出,如:enum weekdaysun=7,mon=1,tue,wed,thu,fri,sat;枚举值可用来作判断比较,如:if(workday=mon)if(workdaysun)一个整数不能直接赋值给一个枚举变量,应先进行强制类型转换才能赋值(c+规定),如:workday=(enum weekday)2;(相当于将序号为2的枚举元素值赋给workday,即:workday=tue;,说明:,省略赋值的枚举元素将以其前面的元素值为基础顺序加1,2023/5/26,42,枚举类型运用举例,#includeint main()enum workday sun=7,mon=1,tue,wed,f

24、ri,thu,sat today,tomorrow;today=sat;tomorrow=(enum workday)(today%7+1);printf(today=%dn,today);if(tomorrow=7)/tomorrow=sunprintf(tomorrow is Sunday!n);return 0;,today=6tomorrow is Sunday!,2023/5/26,43,用typedef定义类型,用于为一个已有的数据类型另外命名语法形式typedef 已有类型名 新类型名表;例如typedef double area,volume;typedef int natur

25、al;natural i1,i2;/等价于int i1,i2;area a;/等价于double a;volume v;/等价于double v;,为变量起一个别名,使变量所表示的含义较为清楚,从而增加程序的可读性。,2023/5/26,44,使用typedef定义结构体类型名,定义方法:typedef struct 成员列表;类型名;示例:typedef struct double real,img;COMPLEX;COMPLEX a,b;,定义类型名后,可用类型名直接定义结构体变量,而不再需要关键词struct,2023/5/26,45,作业,1、P192填空1,2;2、编写一段程序,完成以下要求:(1)分别定义一个结构体变量、共用体变量和一个枚举类型变量(2)分别对以上三类变量进行赋值;(3)分别输出以上三类变量的值。,2023/5/26,46,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号