版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体教学目的与要求:教学目的与要求:1熟练掌握结构体的定义及使用熟练掌握结构体的定义及使用2熟练掌握链表的使用熟练掌握链表的使用3了解共用体的定义与使用了解共用体的定义与使用4了解枚举类型性的定义与使用了解枚举类型性的定义与使用5掌握用户自定义类型掌握用户自定义类型 C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体一、结构体一、结构体二、链表二、链表结束结束 C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体一、结构体一、结构体1.声明声明一个结构体类型的一般形式一个结构体类型的一般形
2、式 2.结构体类型变量的说明结构体类型变量的说明 3.结构体变量成员的表示方法结构体变量成员的表示方法 4.结构体变量的赋值结构体变量的赋值 5.结构变量的初始化结构变量的初始化 6.结构体数组结构体数组 7.指向指向结构体类型数据的指针结构体类型数据的指针返回返回 C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体在实际问题中,一组数据往往具有不同的数据类型。例在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名应为字符型;学号可为整型或字如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实符型;年龄
3、应为整型;性别应为字符型;成绩可为整型或实型。型。 显然不能用一个数组来存放这一组数据。因为显然不能用一个数组来存放这一组数据。因为数组中各数组中各元素的类型和长度都必须一致元素的类型和长度都必须一致,以便于编译系统处理。为了,以便于编译系统处理。为了解决这个问题,语言中给出了另一种构造数据类型解决这个问题,语言中给出了另一种构造数据类型“结构体结构体”。 它相当于其它高级语言中的记录。它相当于其它高级语言中的记录。“结构体结构体”是一种构造类型,它是由若干是一种构造类型,它是由若干“成员成员”组成的。每一个成员组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。可以是一个基本数据类
4、型或者又是一个构造类型。结构体既结构体既然是一种然是一种“构造构造”而成的数据类型,那么在说明和使用之前而成的数据类型,那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义函数一样。要先定义函数一样。 C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体定义一个结构体的一般形式为:定义一个结构体的一般形式为:struct 结构名结构名 成员表列成员表列; 成员表列由若干个成员组成,每个成员都是该结构体的一成员表列由若干个成员组成,每个成员都是该结构体的一个组成部分。对每个成员也必须作类型说明,其形
5、式为:个组成部分。对每个成员也必须作类型说明,其形式为: 类型说明符类型说明符 成员名成员名;成员名的命名应符合标识符的书写规定。例如:成员名的命名应符合标识符的书写规定。例如: struct stu int num; char name20; char sex; float score; ; 注意:注意:大括号后的分号是不可缺少的大括号后的分号是不可缺少的 C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体1)1)先定义结构,再说明结构体变量。先定义结构,再说明结构体变量。如:如:struct stu int num; char name20; char sex; flo
6、at score; ; struct stu boy1,boy2;这种形式的说明的一般形式为:这种形式的说明的一般形式为:struct 结构名结构名 成员表列成员表列 ;struct stu 变量名表列变量名表列; ; 2)在定义结构类型的同时说明结构体变量。在定义结构类型的同时说明结构体变量。例如:例如:struct stu int num; char name20; char sex; float score; boy1,boy2;这种形式的说明的一般形式为:这种形式的说明的一般形式为:struct 结构名结构名 成员表列成员表列 变量名表列变量名表列; ; 3)直接说明结构体变量直接说明
7、结构体变量例如:例如:struct int num; char name20; char sex; float score; boy1,boy2;这种形式的说明的一般形式为:这种形式的说明的一般形式为:struct 成员表列成员表列 变量名表列变量名表列; 定义结构体变量有以下三种方法。以上定义结构体变量有以下三种方法。以上面定义的面定义的stustu为例来加以说明。为例来加以说明。 C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体三种方法中说明的三种方法中说明的boy1,boy2boy1,boy2变量都具有下图所示的结构变量都具有下图所示的结构。 说明了说明了boy1,
8、boy2boy1,boy2变量为变量为stustu类型后,即可向这两个变量中类型后,即可向这两个变量中的各个成员赋值。在上述的各个成员赋值。在上述stustu结构定义中,所有的成员都是基结构定义中,所有的成员都是基本数据类型或数组类型。本数据类型或数组类型。 成员也可以又是一个结构,即构成了嵌套的结构。例如,成员也可以又是一个结构,即构成了嵌套的结构。例如,下图给出了另一个数据结构。下图给出了另一个数据结构。 C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体按上图可给出以下结构定义:按上图可给出以下结构定义: struct date int month; int day;
9、 int year; ; struct int num; char name20; char sex; struct date birthday; float score; boy1,boy2;首先定义一个结构体首先定义一个结构体datedate,由,由month(month(月月) )、day(day(日日) )、year(year(年年) ) 三个成员组成。三个成员组成。 在定义并说明变量在定义并说明变量 boy1 boy1 和和 boy2 boy2 时,其中的成员时,其中的成员birthdaybirthday被说明为被说明为datadata结构体类型。结构体类型。成员名可与程序中其它变量
10、同成员名可与程序中其它变量同名,互不干扰。名,互不干扰。 C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体在程序中使用结构体变量时,往往不把它作为一个整体来在程序中使用结构体变量时,往往不把它作为一个整体来使用。在使用。在ANSI C中除了中除了允许具有相同类型的结构体变量相互允许具有相同类型的结构体变量相互赋值赋值以外,一般对结构体变量的使用,包括赋值、输入、输以外,一般对结构体变量的使用,包括赋值、输入、输出、运算等都是通过结构体变量的成员来实现的。出、运算等都是通过结构体变量的成员来实现的。表示结构体变量成员的一般形式是:表示结构体变量成员的一般形式是: 结构体变量
11、名结构体变量名. .成员名成员名 例如:例如: boy1.num 即第一个人的学号即第一个人的学号boy2.sex 即第二个人的性别即第二个人的性别如果成员本身又是一个结构体,则必须逐级找到最低级的成员才能使如果成员本身又是一个结构体,则必须逐级找到最低级的成员才能使用。用。例如:例如:boy1.birthday.month即第一个人出生的月份成员可以在程序中单独使用,与普通变量完即第一个人出生的月份成员可以在程序中单独使用,与普通变量完全相同。全相同。 C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体 结构体变量的赋值就是给各成员赋值。可用输入语句或结构体变量的赋值就是
12、给各成员赋值。可用输入语句或赋值语句来完成。赋值语句来完成。例例1:给结构体变量赋值并输出其值。:给结构体变量赋值并输出其值。main() struct stu int num; char *name; char sex; float score; boy1,boy2; boy1.num=102; =Zhang ping; printf(input sex and scoren); scanf(%c %f,&boy1.sex,&boy1.score); boy2=boy1; printf(Number=%dnName=%sn,boy2.num,boy2.nam
13、e); printf(Sex=%cnScore=%fn,boy2.sex,boy2.score); C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体和其他类型变量一样,对结构体变量可以在定义时进行初和其他类型变量一样,对结构体变量可以在定义时进行初始化赋值。始化赋值。例例2 2:对结构体变量初始化。对结构体变量初始化。 main()struct stu /*定义结构定义结构*/ int num; char *name; char sex; float score; boy2,boy1=102,Zhang ping,M,78.5; boy2=boy1; printf(Num
14、ber=%dnName=%sn,boy2.num,); printf(Sex=%cnScore=%fn,boy2.sex,boy2.score); C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体数组的元素也可以是结构体类型。因此可以构成结构体型数组。数组的元素也可以是结构体类型。因此可以构成结构体型数组。结构体数组的每一个元素都是具有相同结构体类型的下标结构变量。结构体数组的每一个元素都是具有相同结构体类型的下标结构变量。在实际应用中,经常用结构体数组来表示具有相同数据结构的一个群在实际应用中,经常用结构体数组来表示具有相同数据结构的一个群体。如一个班
15、的学生档案,一个车间职工的工资表等。体。如一个班的学生档案,一个车间职工的工资表等。结构体数组的结构体数组的定义和结构体变量相似,只需说明它为数组类型即可。定义和结构体变量相似,只需说明它为数组类型即可。 例如:例如:struct stu int num; char *name; char sex; float score; boy5; 定义了一个结构数组定义了一个结构数组boyboy,共有共有5 5个元素,个元素,boy0boy0boy4boy4。每个数组元素都具有每个数组元素都具有struct stustruct stu的结构形式。的结构形式。对结构数组可以作初始化赋值。对结构数组可以作初
16、始化赋值。例如:例如: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; 当对全部元素作初始化赋值时,当对全部元素作初始化赋值时,也可不给出数组长度。也可不给出数组长度。 C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体例例3 3:计算学生的平均成绩和不及格的人数。计算学生的平均成绩和不及格的人数。 st
17、ruct 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 ; main() int i,c=0; float ave,s=0; for(i=0;i5;i+) s+=boyi.score; if(boyi.score-成员名成员名 例如:例如: (*pstu).num或者:或者: pstu-num应该注意应该注意( (* *pstupstu)
18、 )两侧的括号不可少,因为成员符两侧的括号不可少,因为成员符“.”.”的优先级高于的优先级高于“* *”。如去掉括号写作。如去掉括号写作* *pstupstu.num.num则等效于则等效于* *(pstu(pstu.num).num),这样,意义,这样,意义就完全不对了就完全不对了。 C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体例例4 4:通过例子来说明结构指针变量的具体说明和使用方法。:通过例子来说明结构指针变量的具体说明和使用方法。 struct stu int num; char *name; char sex; float score; boy1=102,Z
19、hang ping,M,78.5,*pstu;main() pstu=&boy1; printf(Number=%dnName=%sn,boy1.num,); printf(Sex=%cnScore=%fnn,boy1.sex,boy1.score); printf(Number=%dnName=%sn,(*pstu).num,(*pstu).name); printf(Sex=%cnScore=%fnn,(*pstu).sex,(*pstu).score); printf(Number=%dnName=%sn,pstu-num,pstu-name); printf(
20、Sex=%cnScore=%fnn,pstu-sex,pstu-score); C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体在在C语言中,对结构体成员的引用有以下三种形式:语言中,对结构体成员的引用有以下三种形式:结构变量结构变量.成员名成员名(*结构指针变量结构指针变量).成员名成员名结构指针变量结构指针变量-成员名成员名这三种用于表示结构体成员的形式是完全等效的。这三种用于表示结构体成员的形式是完全等效的。 在上例的在上例的printfprintf语句内用上述三种形式输出语句内用上述三种形式输出boy1boy1的的各个成员值。从运行结果可以看出这三种用于表示结构各
21、个成员值。从运行结果可以看出这三种用于表示结构体成员的形式是完全等效的。体成员的形式是完全等效的。上一页上一页 C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体2)2)指向结构数组的指针指向结构数组的指针 指针变量可以指向一个结构数组,这时结构指针变量指针变量可以指向一个结构数组,这时结构指针变量的值是整个结构数组的首地址。结构指针变量也可指向结的值是整个结构数组的首地址。结构指针变量也可指向结构数组的一个元素,这时结构指针变量的值是该结构数组构数组的一个元素,这时结构指针变量的值是该结构数组元素的首地址。元素的首地址。 例如:设例如:设ps为指向结构数组的指针变量,则为
22、指向结构数组的指针变量,则ps也指向也指向该结构数组的该结构数组的0号元素,号元素,ps+1指向指向1号元素,号元素,ps+i则指向则指向i号号元素。这与普通数组的情况是一致的。元素。这与普通数组的情况是一致的。 C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体例例5 5:用指针变量输出结构数组。用指针变量输出结构数组。 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,
23、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); C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体 应该应该注意注意的是,一个结构体指针变量虽然可以用来访问结的是,一个结构体指针变量虽然可以用来访问结构体变量或结构体数组元素的成员,但是,不能使它指向一构体变量或结构体数组元素的成员,但是,不能使它指向一个成员。也就是说不允许取一个成员的地址来赋予它。因此,个成员
24、。也就是说不允许取一个成员的地址来赋予它。因此,下面的赋值是错误的。下面的赋值是错误的。ps=&boy1.sex;而只能是:而只能是: ps=boy;(赋予数组首地址赋予数组首地址)或者是:或者是:ps=&boy0;(赋予赋予0号元素首地址号元素首地址) 如果要将某一成员的地址赋给如果要将某一成员的地址赋给p,可以用强制类型转换,可以用强制类型转换,先将成员地址转换成先将成员地址转换成p的类型。的类型。例:例:ps=(strut stu*) boy1.sex; C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体3)用结构体变量和指向结构体的指针作函数参数用结
25、构体变量和指向结构体的指针作函数参数在在ANSI CANSI C标准中允许用结构体变量作函数参数标准中允许用结构体变量作函数参数进行整体传送。但是这种传送要将全部成员逐个传进行整体传送。但是这种传送要将全部成员逐个传送,特别是成员为数组时将会使传送的时间和空间送,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。因此最好的开销很大,严重地降低了程序的效率。因此最好的办法就是使用指针,即用指针变量作函数参数进行办法就是使用指针,即用指针变量作函数参数进行传送。这时由实参传向形参的只是地址,从而减少传送。这时由实参传向形参的只是地址,从而减少了时间和空间的开销,提高运行效率
26、。了时间和空间的开销,提高运行效率。 C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体例例6 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,58 ; main() struct
27、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-scorenum,p-score); p=p-next; while(p!=NULL); C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体前面讲过,链表结构是动态地分配存储的,即在需要时才开辟一个结前面讲过,链表结构是动态地分配存储的,即在需要时才开辟一个结点的存储单元。如何动态地开辟和释放存储单元,点的存储单元。如何动态地开
28、辟和释放存储单元,C语言编译系统的库函语言编译系统的库函数提供了一下有关函数。数提供了一下有关函数。1) 分配内存空间函数分配内存空间函数malloc调用形式:调用形式: (类型说明符类型说明符*)malloc(size)功能:功能:在内存的动态存储区中分配一块长度为在内存的动态存储区中分配一块长度为size字节的连续区字节的连续区域。函数的返回值为该区域的首地址。域。函数的返回值为该区域的首地址。“类型说明符类型说明符”表示把该区域用于何种数据类型。表示把该区域用于何种数据类型。(类型说明符类型说明符*)表示把返回值强制转换为该类型指针。表示把返回值强制转换为该类型指针。“size”是一个无
29、符号数。是一个无符号数。例如:例如: pc=(char *)malloc(100); C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体2) 分配内存空间函数分配内存空间函数 calloc calloc 也用于分配内存空间。也用于分配内存空间。调用形式:调用形式: (类型说明符类型说明符*)calloc(n,size)功能:功能:在内存动态存储区中分配在内存动态存储区中分配n块长度为块长度为“size”字节的连续区域。字节的连续区域。函数的返回值为该区域的首地址。函数的返回值为该区域的首地址。(类型说明符类型说明符*)用于强制类型转换。用于强制类型转换。calloc函数与函
30、数与malloc 函数的区别仅在于一次可以分配函数的区别仅在于一次可以分配n块区域。块区域。例如:例如:ps=(struet stu*)calloc(2,sizeof(struct stu); C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体3)释放内存空间函数释放内存空间函数free调用形式:调用形式: free(void*ptr);功能:功能:释放释放ptr所指向的一块内存空间,所指向的一块内存空间,ptr是一个任意类型的是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由指针变量,它指向被释放区域的首地址。被释放区应是由malloc或或calloc函数
31、所分配的区域。函数所分配的区域。 例如:例如:free(ptr); C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体1)建立动态链表建立动态链表所谓建立动态链表是指在程序执行过程中从无到有所谓建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结电和输入各结地建立起一个链表,即一个一个地开辟结电和输入各结点数据,并建立起前后相链的关系。建立动态链表常用点数据,并建立起前后相链的关系。建立动态链表常用的方法有两种:的方法有两种:头插法和尾插法头插法和尾插法。为操作上的方便,在。为操作上的方便,在对链表的其它操作中,对于每个结点的数据类型,都采对链表的其
32、它操作中,对于每个结点的数据类型,都采用如下的数据类型:用如下的数据类型:struct stu int num; struct stu *next; *head; int n; /*定义定义n为全程变量为全程变量*/并设每个链表都包含头结点。并设每个链表都包含头结点。 C C程序设计程序设计 第第1111章章 结构体与共同体结构体与共同体例例8_1:尾插法建立单链表尾插法建立单链表/*ex11_8_1.c*/struct stu *creat1(struct stu *head)struct stu *pre,*p; int i,data; pre=head=(struct stu*)malloc(sizeof(struct stu); for(i=1;inum=data; pre-next=p; p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 房屋买卖土地使用权投资合同
- 电影后期制作服务合同
- 高考志愿填报咨询服务合同
- 钢结构建筑材料采购合同范本
- 2025年粤教版七年级科学上册阶段测试试卷
- 2025年统编版2024必修1历史下册阶段测试试卷含答案
- 2025住宅小区绿化养护承包合同
- 2025年航空模具项目申请报告
- 2025年铁皮石斛项目提案报告模范
- 2025年苄胺项目提案报告模板
- 04S519小型排水构筑物(含隔油池)图集
- YB∕T 4146-2016 高碳铬轴承钢无缝钢管
- 多图中华民族共同体概论课件第十三讲先锋队与中华民族独立解放(1919-1949)根据高等教育出版社教材制作
- 高考英语单词3500(乱序版)
- 《社区康复》课件-第五章 脊髓损伤患者的社区康复实践
- 北方、南方戏剧圈的杂剧文档
- 灯谜大全及答案1000个
- 部编小学语文(6年级下册第6单元)作业设计
- 洗衣机事业部精益降本总结及规划 -美的集团制造年会
- 2015-2022年湖南高速铁路职业技术学院高职单招语文/数学/英语笔试参考题库含答案解析
- 铝合金门窗设计说明
评论
0/150
提交评论