《结构和链表》PPT课件.ppt
《《结构和链表》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《结构和链表》PPT课件.ppt(114页珍藏版)》请在三一办公上搜索。
1、1,第7章 结构和链表,7.1 结构类型和结构变量7.2 结构数组7.3 结构与函数 7.4 链表*7.5 联合,*7.6 位域*7.7 枚举*7.8 类型定义*7.9 变量定义,2,基本类型:如整型、实型、字符型等。构造类型:数组,每个元素都是属于同一个类型。结构类型:不同的数据类型组成一个整体方便引用。例如:一个学生数据实体可能有以下多项信息 学号、姓名、性别、年龄、成绩、家庭地址 int char char int float char说明:这类实体的数据因所包含的成员类型不同,不能用单个数组来表示,也不便将它们的成员分拆成多个独立的简单变量,因为这样会失去实体的整体性。,7.1 结构类
2、型和结构变量,3,结构类型形式:struct 结构类型名 成员说明表;其中关键字“struct”:引出结构类型的定义。结构类型名:结构类型的标记,用来定义引用该结构的结构变量。成员说明表:指明该结构类型的各成员的数据类型和名称。每个成员的说明形式为:类型 成员名;,1.结构类型,4,【例】学生基本信息的结构类型:struct student int number;/*学号*/char name20;/*姓名,设姓名少于20个字符*/char sex;/*性别*/char address40;/*家庭地址*/;说明:在C+中,如果不会引起混淆(例如,结构类型与结构变量同名),引用结构类型可以不用
3、struct引导。,结构类型例,5,当结构类型中的某个成员又是另一个结构类型时,这种结构类型是一种嵌套的结构类型。例如,给上述学生信息增加出生日期,并将出生日期定义为一种包含日、月、年3项信息的结构类型,则更完整的学生信息类型就被定义成嵌套的结构类型。,嵌套的结构类型,6,struct Date int day;/*日*/int month;/*月*/int year;/*年*/;struct student int number;/*学号*/char name20;/*姓名*/char sex;/*性别*/struct Date birthday;/*嵌套 Date结构*/char addr
4、ess40;/*家庭地址*/;,嵌套的结构类型例,7,在结构类型定义中,详细列出了结构类型所包含的每个成员的名称及其类型。实际上,结构类型定义只是表明一类实体其数据属性的“模式”,并不定义一个特定的数据实体,因此不要求分配存储单元。程序如果要实际使用结构类型所描述的数据信息,就必须定义结构变量。结构变量要占用存储单元,能存放如结构类型所描述的具体数据。对结构类型和结构变量,我们可以简单地理解为,结构类型是表示数据框架的描述文本,结构变量才能存放实际数据。,2.结构变量,8,一、先定义结构类型,再声明结构变量形式:struct 结构类型名 结构变量名表;例如:利用前面已定义的结构类型 stude
5、nt声明结构变量代码:struct student st1,st2;其中:student为结构类型名,st1和st2为结构变量。说明:结构变量声明后,每个结构变量的成员名称、成员个数和各成员的数据类型与结构类型定义中的成员名称、成员个数和各成员的数据类型相一致。,结构变量的定义,9,结构变量内存分配单元,10,二、在定义结构类型的同时声明结构变量,一般形式:struct 结构类型名 成员说明表 结构变量表;,结构变量的定义,例如:struct stuSType int number;/*学号*/char name20;/*姓名*/int score;/*成绩*/stuS;,结构变量,11,在定
6、义结构变量的同时给它赋初值,称为结构变量的初始化。结构变量初始化时,要按结构类型定义中成员的顺序逐一给出各成员的初值。例如:struct point/*说明绘图程序的坐标类型*/int x;int y;p1=20,50,p2;/*p1的x值为20,p1的y值为50*/说明:也可以在定义结构类型与声明结构变量分开的情况下,在声明结构变量时进行初始化。例如:struct point p3=10,40,p4=20,50;,结构变量初始化,12,要注意结构类型名和结构变量名的区别。不能对结构类型名进行赋值、存取或运算,因为类型不占用存储空间;而结构变量会占用存储空间,定义时可以赋初值,定义后可引用。结
7、构变量初始化的时间。静态的和全局的结构变量初始化在程序执行之前完成,静态的结构变量未指定初值时,值自动置0。局部结构变量初始化是程序控制每次进入它所属辖域时创建并初始化,未指定初值的局部结构变量其初值是不确定的。,结构变量初始化说明,13,可以定义指向结构的指针变量(结构指针变量简称结构指针)。例如:struct Date*pd,date3;/*定义变量*/pd=/*pd指向date3*/表示:定义结构指针pd和结构变量date3,并使结构指针pd指向结构变量date3,即结构指针pd的内容为结构变量date3所占据的存储块的首地址。,结构变量初始化说明,14,一、引用结构变量1.用结构变量名
8、直接引用结构变量例如:struct student int number;/*学号*/char name20;/*姓名*/float score;/*成绩*/st1=10001,Zhang ping,85.0,st2;st2=st1;/*将结构变量st1作为整体赋值给结构变量st2*/说明:两个结构变量必须是同类型的。,3.结构变量的引用,15,2.指向结构变量的指针间接引用结构变量例如:struct student int number;/*学号*/char name20;/*姓名*/float score;/*成绩*/st1=10001,Zhang ping,85.0,st2;struct
9、 student*p1=/*定义结构指针变量p1,并指向结构变量st1的首地址*/,3.结构变量的引用,16,二、引用结构成员1.使用结构变量和成员运算符 引用方法:结构变量名.成员名其中:点符号“.”是结构的成员运算符,是优先级最高运算符之一。假设有前面定义的类型为stuSType的结构变量stuS例如:stuS.name/*直接引用stuS结构变量的name成员*/,3.结构变量的引用,17,引用结构变量的成员无非是对该成员进行输入输出、赋值、运算等操作。例如:printf(学号:%d 姓名:%s 成绩:%dn,stuS.number,stuS.name,stuS.score);/*输出学
10、生stuS的信息*/代码:stuS.score+=5;/*更新学生stuS的成绩*/strcpy(stuS.name,Li ming);/*更正学生stuS的姓名*/,3.结构变量的引用,18,2.使用结构指针和指针运算符 引用方法:指针变量名-成员名其中:“-”是指针运算符,它是由减号“-”和大于号“”两个字符组成(请注意中间不能有空格符),其优先级与成员运算符“.”一样,也是优先级最高的运算符之一。继续使用前面定义的结构变量stuS,可以使用结构指针间接引用stuS结构变量的成员。struct stuSType*sp=/*修改成绩*/,二、引用结构成员,19,3.使用结构指针和成员运算符
11、引用方法:(*指针变量名).成员名 其中:圆括号是必要的。若省略,由于成员运算符“.”优先级高于“*”,将会导致编译错误。例如:struct stuSType*sp=*/,二、引用结构成员,20,(1)不能直接对结构变量进行输入或输出,只允许对结构变量的成员变量进行输入和输出。例如,对于前面定义的类型为student的结构变量st1,以下分别是错误和正确的代码:printf(%s,st1);/*错误,st1是结构变量不能直接输出*/printf(%s,st1.name);/*正确,仅输出st1的name成员*/,引用结构变量或成员注意,21,(2)如果结构中的成员本身也是一个结构类型,在引用该
12、成员的成员时需使用多个成员运算符“.”,将嵌套的结构成员一级一级地连续指定。例如,想引用前面定义的类型为student的结构变量st1中成员birthday成员year,正确的写法是:,引用结构变量或成员注意,22,#include struct stuScore/*定义结构*/char name20;int chinese;int math;void main()float aver1,aver2,aver3;struct stuScore st1,st2,st3;/*定义3个结构变量*/printf(请输入3位学生的姓名、语文成绩、数学成绩n);scanf(%s%d%d,st1.name,
13、【例7.1】利用结构变量,输入3个学生的姓名、语文成绩和数学成绩,然后计算每个学生的平均成绩并输出。,23,aver1=(st1.chinese+st1.math)/2.0;/*计算平均成绩*/aver2=(st2.chinese+st2.math)/2.0;aver3=(st3.chinese+st3.math)/2.0;printf(姓名t语文t数学t平均成绩n);printf(%st%4dt%4dt%6.2fn,st1.name,st1.chinese,st1.math,aver1);printf(%st%4dt%4dt%6.2fn,st2.name,st2.chinese,st2.ma
14、th,aver2);printf(%st%4dt%4dt%6.1fn,st3.name,st3.chinese,st3.math,aver3);,【例7.1】程序续,24,从例7.1中可以看出,一个结构变量只能存放一个学生的基本信息。如果要描述两个学生的信息需要有两个结构变量,依此类推,当要描述一个班级的学生时,独立定义同样类型的许许多多结构变量的方法显然是不可取的。在C程序设计中,一般用结构类型描述个体的信息结构,用数组表示个体的集合。当数组的元素是结构时,这种数组就称为结构数组。例如,用结构数组表示一个班级学生,数组的元素存储一个学生的有关信息。这样,能充分反映班级的整体性,程序处理也变得
15、更为方便。,7.2 结构数组,25,定义结构数组与定义结构变量的方法类似也有两种方法。(1)先定义结构类型,再声明结构数组struct stuScore char name20;int chinese;int math;struct stuScore st3;,1.结构数组的定义,结构数组,26,与结构变量初始化相仿,在定义结构数组时,也可给结构数组赋初值。例如:struct stuScore char name20;int chinese;int math;st3=Zhang,80,85,Li,85,90,Wang,90,70;,结构数组的初始化,27,结构数组的引用实际上是对每个元素中的成
16、员进行引用。与引用结构成员类似,也有以下3种方法:(1)使用结构数组元素和成员运算符方法:结构数组名元素下标.结构成员名例如:printf(%s,st0.name);说明:输出第1个学生的姓名,即Zhang,2.结构数组的引用,28,2.结构数组的引用,(2)使用结构指针和指针运算符 方法:指针变量名-成员名例如:struct stuScore*sp=st;/*定义结构指针sp,指向结构数组st首元素*/printf(%sn,sp-name);/*输出第1个学生的姓名,即Zhang*/sp+;/*结构指针指向下一个元素*/printf(%sn,sp-name);/*输出第2个学生的姓名,即Li
17、*/,29,2.结构数组的引用,(3)使用结构指针和成员运算符 方法:(*指针变量名).成员名例如:struct stuScore*sp=st;/*定义结构指针sp,指向结构数组st首元素*/printf(%sn,(*sp).name);/*输出学生st0的姓名,即Zhang*/sp+;/*结构指针指向下一个元素,即指向st1*/printf(%sn,sp-name);/*输出学生st1的姓名,即Li*/,30,#include struct stuScore char name20;int chinese;int math;void main()int i;float aver3;/*定义普
18、通数组*/struct stuScore st3;/*定义结构数组*/printf(请输入3位学生的姓名、语文成绩、数学成绩n);,【例7.2】利用结构数组,输入3个学生的姓名、语文成绩和数学成绩,然后计算每个学生的平均成绩并输出。,31,for(i=0;i3;i+)scanf(%s%d%d,sti.name,【例7.2】程序续,32,在C语言中,函数的形参可以是变量、指针、数组,也允许是一个结构。将一个结构传递给函数有三种方式:传递单个成员、传递整个结构、传递指向结构的指针。传递单个成员或整个结构给函数在C中认为是值调用,即在被调用的函数中尽管修改了形参的值,但不会改变调用函数时提供的实参变
19、量的值。,7.3 结构与函数,33,将结构成员作为实参传递给一个函数,实际上和其他基本数据类型的传递方法相同。【例7.3】输入年月日,输出该年中的第几天#include int dayTable12=31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31;/*平年或闰年*/struct Date/*定义一个Date结构类型*/int day;int month;int year;int yearDay;date;/*定义一个Date结构类型的结构变量*/,1.结构成员作为函数参数,34,int dayofY
20、ear(int d,int m,int y)/*计算年中第几天函数*/int i,leap,day=d;leap=(y%4=0/*返回计算的结果*/,【例7.3】程序续 dayofYear()函数,35,void main()int leap,days;printf(Date Conversion Programn);printf(Year=);scanf(%d,【例7.3】程序续主函数,36,leap=(date.year%4=0,【例7.3】程序续主函数,37,程序运行时,输入的数据与输出的结果如下:,【例7.3】程序运行结果,38,使用结构作为实参传递给一个函数,实际上将这个结构的所有成
21、员都传递给了被调用函数的形参。以例7.3程序为例,对主函数中对函数dayofYear的调用,原来使用表示日、月、年的3个结构成员作为实参改为用一个结构变量date作为实参。即将代码 date.yearDay=dayofYear(date.day,date.month,date.year);改写成 date.yearDay=dayofYear(date);,2.结构作为函数参数,39,对应的dayofYear函数也要作如下的修改:int dayofYear(struct Date d)/*计算年中第几天函数*/int i,leap,day=d.day;leap=(d.year%4=0/*返回计算
22、的结果*/,2.结构作为函数参数,40,指向结构的指针作为函数的形参。实参可以是结构的地址,也可以是指向结构的指针变量。仍以例7.3程序为例,主函数中对函数dayofYear的调用,原来使用结构变量date作为实参现改为用结构变量date的地址作为实参。即将代码 date.yearDay=dayofYear(date);改写成 dayofYear(,2.结构指针作为函数参数,41,对应的dayofYear函数也要作如下的修改:/*计算年中第几天函数,无返回值*/void dayofYear(struct Date*dp)int i,leap,day=dp-day;leap=(dp-year%4
23、=0/*计算结果回填到yearDay成员,没有return语句*/,2.结构作为函数参数,42,(1)结构或结构成员作为函数参数是值传递方式,在被调用函数dayofYear中必须用return语句返回结果。如果不用return语句,写成“d.yearDay=day;”,主函数不能获得函数结果。因为函数的形参是函数的局部变量,函数调用时,将结构date的各成员值依次送给形参d的各成员中,以后函数对d作任何的改变与date无关。,对结构、结构成员与结构指针作为函数参数作一个总结,main函数调用语句 dayofYear函数 date结构(实参)d结构(形参),43,(2)使用结构地址或结构指针作为
24、函数的参数,函数调用时,虽只传递结构的地址给结构指针形参,但通过该结构指针形参间接引用所指向的结构变量。因此,函数既可以引用结构指针形参所指向结构的成员,也可把计算结果存储于结构指针形参所指向结构的成员中。,对结构、结构成员与结构指针作为函数参数作一个总结,date结构,形参dp,44,将结构date作为实参传递给dayofYear函数的结构类型形参d,但计算结果是通过return day;语句返回到主函数的调用语句。如果希望将计算的结果先保存到结构类型形参d的成员yearDay中,然后返回结构类型形参d的值,可以对函数dayofYear重新改写如下:struct Date dayofYear
25、(struct Date d)int i,leap;d.yearDay=d.day;leap=(d.year%4=0/*返回结构类型*/,4.函数返回结构类型值,45,在主函数中,调用dayofYear函数后把返回的结构赋值给结构变量date,调用语句也作相应的修改。即将 date.yearDay=dayofYear(date);改写成 date=dayofYear(date);调用带有结构类型形参的函数时,实参结构的各成员的值需要全部拷贝给形参结构的相应成员,费时间又费空间。一般情况下,以传递结构地址或指针为好。,4.函数返回结构类型值,46,变量:通过变量定义引入。程序执行时,不能显式地用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构和链表 结构 PPT 课件
链接地址:https://www.31ppt.com/p-5589846.html