版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十一章第十一章 结构体与共用体结构体与共用体内容提要内容提要 结构体概述结构体概述 定义结构体类型和变量定义结构体类型和变量 结构体变量的引用结构体变量的引用 结构体变量的初始化结构体变量的初始化 结构体数组结构体数组 指向结构体类型数据的指指向结构体类型数据的指针针 用指针处理链表用指针处理链表11.1 概述概述有时需要将不同类型的数据组合成一个有机的整体有时需要将不同类型的数据组合成一个有机的整体如,一个学生信息:如,一个学生信息:010510Li FengM1981.5.4680029-8482500工程:学号工程:学号 姓名姓名 性别性别 出生日期出生日期 成果成果 电话号码电话号码
2、 数据数据: :类型类型: : 长整长整/ /字串字串 字串字串 字符字符 字串字串 整型整型 字串字串 反映某一个学生基本情况的数据,它们之间有一反映某一个学生基本情况的数据,它们之间有一定联系,用变量表示各项定联系,用变量表示各项,反映不出这种联系;用数反映不出这种联系;用数组存放,又有类型不同的问题,因此可采用结构体组存放,又有类型不同的问题,因此可采用结构体这种数据类型实现。这种数据类型实现。 结构体:结构体: 若干个数据类型不同若干个数据类型不同(也可相同也可相同)的数据项的组合。的数据项的组合。结构体是一种数据结构,需要用户根据自己的结构体是一种数据结构,需要用户根据自己的需要、按
3、某种规则定义,即定义结构体。需要、按某种规则定义,即定义结构体。注意:注意: 本身并没有新的含义,只是为用户在处理本身并没有新的含义,只是为用户在处理数据时反映一个整体概念。数据时反映一个整体概念。 一种组合就是一种类型。数据项的组合是一种组合就是一种类型。数据项的组合是多种多样的,因此结构体的类型也是多种多多种多样的,因此结构体的类型也是多种多样的,系统不能事先定义,应由用户自己定样的,系统不能事先定义,应由用户自己定义义11.2 定义结构体的类型和定义结构体变量定义结构体的类型和定义结构体变量一、 定义结构体类型一般形式:一般形式:struct struct 结构体名结构体名 类型标识符类
4、型标识符 成员名成员名1 1; 类型标识符类型标识符 成员名成员名2 2; 类型标识符类型标识符 成员名成员名n n; ; ;其中:其中:1struct 结构体名组成具体的结构体类型标识符,结构体名组成具体的结构体类型标识符, 可用这个结构体类型标识符去定义变量等对象;可用这个结构体类型标识符去定义变量等对象;2结构体名、成员名应符合标识符命名规则;结构体名、成员名应符合标识符命名规则;3类型标识符确定各成员类型;类型标识符确定各成员类型;表示结构体类型表示结构体类型例:定义可表示学生基本情况的结构体类型。例:定义可表示学生基本情况的结构体类型。工程:工程: 学号学号 姓名姓名 性别性别 出生
5、日期出生日期 成果成果 电话电话号码号码 数据数据:类型类型: 长整长整/字串字串 字串字串 字符字符 字串字串 整型整型 字字串串 struct student1 /*结构体类型标识结构体类型标识*/ long num; char name20; char sex; char birthday12; float score; char tel15; ; 010510Li FengM 1981.5.4 680明:说明:结构体没有统一的结构,用户依据具体情况自己定义;结构体没有统一的结构,用户依据具体情况自己定义;一个一个C C程序可定义多个结构体类型;定义的位置可在函
6、数程序可定义多个结构体类型;定义的位置可在函数之内,也可在函数之外;其有效范围由位置决定;之内,也可在函数之外;其有效范围由位置决定;如:结构体类型定义如:结构体类型定义1 1; main( )main( ) 结构体类型定义结构体类型定义2 2; ; ; fun1() fun1() ; ; 二、 定义结构体类型的变量1 1、先定义结构体类型再定义变量、先定义结构体类型再定义变量structstudent int num; charname20; charsex; intage; floatscore; charaddr30; ;struct student stu1, stu2;一般形式:一般
7、形式:struct 结构体类型名结构体类型名 成员列表;成员列表; ;struct 结构体类型名变量名列表结构体类型名变量名列表;将一个变量定义为结构体类型:不仅要指定变量为将一个变量定义为结构体类型:不仅要指定变量为结构体类型,且要指定为某一特定结构体类型。结构体类型,且要指定为某一特定结构体类型。2、在定义结构体类型同时定义变量、在定义结构体类型同时定义变量structstudent int num; charname20; charsex; intage; floatscore; charaddr30; stu1, stu2;一般形式:一般形式:struct 结构体类型名结构体类型名 成
8、员列表;成员列表; 变量名列表变量名列表;3、直接定义结构体类型变量、直接定义结构体类型变量struct int num; charname20; charsex; intage; floatscore; charaddr30; stu1, stu2;一般形式:一般形式:struct 成员列表;成员列表; 变量名列表变量名列表;说明:说明:1 1类型和变量的区别类型和变量的区别 定义时先定义结构体类型再定义变量,定义时先定义结构体类型再定义变量, 类型不分配空间,变量才分配空间。类型不分配空间,变量才分配空间。2结构体的嵌套定义;结构体的嵌套定义; 结构体成员可以是结构体变量结构体成员可以是结
9、构体变量如:如:struct date int m; int d; iny y; ;struct student2 long num; char name20; char sex; struct date birthday; float score; char tel15; stu1;3成员名可与程序中其它量同名成员名可与程序中其它量同名如:如: stu1struct student1 long num; char name20; char sex; char birthday12; float score; char tel15; stu1, stu2; numname sexbirthda
10、yscoretel420112415共56字节成员成员 成员字节成员字节三、三、 结构体变量的存储结构结构体变量的存储结构各成员按定义顺序连续存储;各成员按定义顺序连续存储;如:如: struct date stu1 int m; int d; iny y; ;struct student2 long num; char name20; char sex; struct date birthday; float score; char tel15; stu1, stu2; numname sexbirthdayscoretel42016415共50字节成员成员 成员字节成员字节mdy11.3
11、结构体变量的引用结构体变量的引用 1 1 引用形式:引用形式: 结构体变量名结构体变量名. .成员名成员名规则:规则:1 1不能将一个结构体变量作为一个整体进行输入、输不能将一个结构体变量作为一个整体进行输入、输出和赋值,只能对结构体中的各个成员分别进行;但出和赋值,只能对结构体中的各个成员分别进行;但允许将一个结构体变量直接赋给另一个具有相同结构允许将一个结构体变量直接赋给另一个具有相同结构的结构体变量。的结构体变量。如:如:stu1.num=10000; stu1.num=10000; strcpy(,”zhang strcpy(,”zhang san”
12、);stu2=stu1;san”);stu2=stu1;其中:成员运算符其中:成员运算符. . 一级,自左而右;一级,自左而右;例例: stu1.num : stu1.num 引用结构体变量引用结构体变量stu1stu1的的numnum成员;成员; 引用引用stu1stu1的的namename成员成员( (字符指针字符指针) ); i i 引用引用namename成员的第成员的第i i个元素;个元素;2如果是嵌套定义,用若干个成员运算符,一级一级如果是嵌套定义,用若干个成员运算符,一级一级地找到最低地一级成员。地找到最
13、低地一级成员。stu1.num;;stu1.birthday.y;stu1.birthday.m; stu1.birthday.d;3 )结构体成员变量可以象普通变量一样使用、运算。结构体成员变量可以象普通变量一样使用、运算。(但使用的形式不同)(但使用的形式不同)stu2.score=stu1.score;sum=stu1.score+stu2.score;stu1.age+;+stu1.age;4) 4) 可以引用结构体变量成员的地址,也可以引用结构可以引用结构体变量成员的地址,也可以引用结构体变量的地址。体变量的地址。如:如:scanf(%d,&student1
14、.num); (输入输入student1num的值的值)printf(“%o”,&student1); (输出输出student1的首地址)的首地址)结构体变量各成员的输入、输出结构体变量各成员的输入、输出 应按成员类型选择输入、输出的格式符。应按成员类型选择输入、输出的格式符。例:按以上定义输入例:按以上定义输入 scanf(%ld, &stu1.num); scanf(%d,%d,%d, &stu1.birthday.m, &stu1.birthday.d, &stu1.birthday.y); 0110234 5,24,1981 例:例:gets(
15、); scanf(%s, stu1.tel); Li Feng例:按以上定义输出例:按以上定义输出 printf(munber:%ldn, stu1.num); printf(%d,%d,%d, stu1.birthday.y, stu1.birthday.m, stu1.birthday.d); printf(name:%sn, );或:或: for(i=0; i!=0; i+) printf(%c, i);说明:说明:. . 与与 运算符同为一级,自左而右运算。运算符同为一级,自左而右运算。4
16、2016415注:注:& &优先级为优先级为2 2级,低于级,低于. .和和 numname sexbirthdayscoretelmdy变量变量stu1的指针:的指针:&stu1 num成员指针:成员指针:&stu1. numname第第i个元素指针:个元素指针:&stu1. namei最低级成员最低级成员y的指针:的指针:&stu1.birthday.y成员成员tel的指针:的指针:stu1.tel 2 结构体变量的指针、结构体成员的指针结构体变量的指针、结构体成员的指针stu111.4 结构体变量的初始化结构体变量的初始化和其他类型变量一样
17、,在定义时指定初始值。和其他类型变量一样,在定义时指定初始值。例:定义结构体变量存放两位学生的基本情况,计例:定义结构体变量存放两位学生的基本情况,计算平均成绩,并以大写形式输出算平均成绩,并以大写形式输出name成员。成员。#include stdio.hstruct student long num; char name20; float score; ; 一、结构体变量的初始化一、结构体变量的初始化#include stdio.h void main( ) struct student stu1=109031,Li Feng,89.0, stu2=109032,Wang Li,71.0;
18、 float aver; int i; aver=(stu1.score+stu2.score)/2.0; printf(ntaverage=%7.2fn, aver); for(i=0; i!=0; i+) if(i=a&i=a&i=z) i-=32; printf(nt%ld,%s,%7.2f, stu1.num, , stu1.score); printf(nt%ld,%s,%7.2fn, stu2.num, , stu2.score);二、结构体
19、数组的初始化二、结构体数组的初始化一般形式:在定义数组的后面加上:一般形式:在定义数组的后面加上:=初值表列初值表列 ;例:例:struct student long num; char name20; float score; stu3=99001, Li Feng, 89.5, 99002, Wang Yi, 70.5, 99003, Zhao Hui, 92;11.5 结构体数组结构体数组结构体数组:数组中每个元素都是结构体类型。结构体数组:数组中每个元素都是结构体类型。一、结构体数组的定义一、结构体数组的定义和定义结构体变量的相仿,只需说明其为数组即可。和定义结构体变量的相仿,只需说明
20、其为数组即可。struct studentint num; char name20; char sex; int age; float score; char addr30;struct student stu3;struct student int num; char name20; char sex; int age; float score; char addr30; stu3;struct int num; char name20; char sex; int age; float score; char addr30; stu3;结构体数组在内存中连续存放结构体数组在内存中连续存放s
21、tu0stu1stu299001Li Feng089.599002Wang Yi070.599003Zhao Hui092.0420 28484 bytestu1. scorestu2. num引用形式:数组名引用形式:数组名下标下标 . 成员名成员名三、结构体数组的引用三、结构体数组的引用 结构体数组在引用时,不仅要确定是哪一个元素,还结构体数组在引用时,不仅要确定是哪一个元素,还要确定该元素的哪一个成员。要确定该元素的哪一个成员。其中:运算符其中:运算符 与与. . 同为一级,自左而右结合;同为一级,自左而右结合;表示:依据数组名及下标先定位到元素,然后再定位到成员;表示:依据数组名及下标
22、先定位到元素,然后再定位到成员;例:例:stu0.num stu0.num 访问访问stustu首元素的成员首元素的成员num;num;stu1.score stu1.score 访问以访问以1 1为下标那个元素的为下标那个元素的scorescore成员成员; ;#include stdio.h void main( ) struct long num; char name20; float score; stu3=99031, Li Lin, 89.0, 99032, Wang Fang, 71.0, 99033, Zhao Ping, 92.0 ; float maxs, sum=0; i
23、nt i, p; maxs=0; for(i=0; imaxs)maxs=stui.score; p=i; printf(ntaverage=%fn, sum/3.0); printf(tnum:%ld,name:%s,score:%7.2fn, stup.num, , stup.score); 例:编程求三位学生的平均成绩,并输出成绩最高例:编程求三位学生的平均成绩,并输出成绩最高者的学号、姓名、成果。者的学号、姓名、成果。#include stdio.h#define N 30struct person char name20; int count; led3=Li, 0
24、, Zhang, 0, Wang, 0;Li 0Zhang0Wled0.count例:例:3030张选票对三个侯选人投票选举,一票选一人;张选票对三个侯选人投票选举,一票选一人;输入得票人名字,按名字计数,最后输出选举结果。输入得票人名字,按名字计数,最后输出选举结果。#include stdio.h void main( ) char lname20; int i, j; for(i=1; i=N; i+) printf(Input %d NO.name:, i); gets(lname); for(j=0; j3; j+) if(strcm
25、p(, lname)=0) /*串比较串比较*/ ledj.count+=1; break; /*计票计票*/ for(i=0; ip-成员名成员名 等价于:结构体等价于:结构体变量变量. .成员名成员名 分析一下几种运算:分析一下几种运算: p-n pp-n p指向的结构体变量中的成员指向的结构体变量中的成员n n的值的值 p-n+ pp-n+ p指向的结构体变量中的成员指向的结构体变量中的成员n n的值加的值加1(1(后加后加) ) +p-n p +p-n p指向的结构体变量中的成员指向的结构体变量中的成员n n的值加的值加1(1(先加先加) ) main( ) stru
26、ct student long num; char name20; float score; stu1, *p; stu1.num=99001; strcpy(, Li Feng); stu1.score=89.5; p=&stu1; printf(num:%ldn, (*p).num); printf(name:%sn, (*p).name); printf(score:%7.2n, p-score); printf(%u,%u,%u,%un, & s t u 1 , & s t u 1 . n u m , , &stu1.
27、score); 9900189.5&stu1pname0name1 name19470474475 494stu1例:利用结构体指针,对一位学生基本情况赋值并输出。例:利用结构体指针,对一位学生基本情况赋值并输出。说明:说明:1当当p=&stu1; 且保持不变时,且保持不变时, (*p).num表示访问表示访问p所指向变量的所指向变量的num成员;成员; 其中:其中:*号为号为2级,括号可保证先使级,括号可保证先使p与与*结合。结合。2当当p=&stu1; 且保持不变时有如下等价表示:且保持不变时有如下等价表示: stu1.num (*p).num p-num3) -为
28、指向成员运算符;为指向成员运算符;1级,自左而右;级,自左而右; p-num中的中的-代替了代替了*和和. 看起来更直观;看起来更直观;如:如:p-score:访问:访问p所指向变量的所指向变量的score成员成员;p-namei:访问:访问p指向变量的指向变量的name成员第成员第i个元素。个元素。#include stdio.h#include math.hstruct student long num; char name20; float score; ;main( ) struct student *p, stu3; int i; float sum=0; ;stu0stu1stu2
29、99001Li Feng89.599002Wang Yi70.599003Zhao Hui92.0stup例:输入例:输入/ /输出三位学生基本情况,并计算平均成绩输出三位学生基本情况,并计算平均成绩2. 2. 指向结构体数组的指针指向结构体数组的指针p+1p+1p+2p+2注意:注意:p p定义指向结构体的指针,只能指定义指向结构体的指针,只能指向一个结构体型数据,不能指向结构体向一个结构体型数据,不能指向结构体的成员。的成员。#include stdio.h void main( ) struct student *p, stu3; int i; float sum=0; for(i=0;
30、 i3; i+) /*输入所有数据输入所有数据*/ printf(t%d number:, i+1); scanf(%ld, &stui.num); getchar( ); printf(t name:); gets(); printf(t score:); scanf(%f, &stui.score); for(p=stu; pnum, p-name, p-score); for(p=stu, i=0; iscore; printf(taverage=%-7.2fn, sum/3.0);增加字节数为所指元素类型长增加字节数为所指元素类型长2828 实参实参
31、形参形参结构体变量结构体变量. .成员成员成员成员结构体变量的指针结构体变量的指针 结构体指针结构体指针变量变量 结构体变量名结构体变量名 同类型结构同类型结构体变量体变量 基本类型变量基本类型变量数组名数组名成员的值成员的值数组成员的指针数组成员的指针与成员同类型变量与成员同类型变量同类型形参数组同类型形参数组结构体变量的指针结构体变量的指针各成员值对应传递各成员值对应传递3.3.指向结构体的指针作为函数参数指向结构体的指针作为函数参数将结构体变量的值向另一个函数传递时,实现方法有三种将结构体变量的值向另一个函数传递时,实现方法有三种struct student long num; char
32、 name20; float score4; ;numnamescore0score1score2score399001Li Feng89.076.090.0016byte例:一结构体类型,包含学号、姓名、及三门课成例:一结构体类型,包含学号、姓名、及三门课成绩,编程对两位学生的数据求个人平均分。绩,编程对两位学生的数据求个人平均分。分析:分析:定义结构体存放学生的成绩定义结构体存放学生的成绩 求平均值用函数求平均值用函数averaver实现实现, ,其参数是结构体变量的指针其参数是结构体变量的指针 结构体数据输出用函数结构体数据输出用函数pfunpfun实现实现, ,其参数是结构体变量其参数
33、是结构体变量#include stdio.h void main( ) struct student stu1=99001,Li Hong,89,76,90,0,stu2=99002,Wang Li,70.5,85.5,76,0; void aver(struct student *p); void pfun(struct student s); printf(tnumbertname ttscore1tscore2tscore3taveragen); aver(&stu1); pfun(stu1); aver(&stu2); pfun(stu2);void aver(stru
34、ct student *p) int i; float sum=0; for(i=0;iscorei; p-score3=sum/3.0; return;void pfun(struct student s) int i; printf(t%ldt%st, s.num, ); for(i=0; inum!=0,n+; head=p1;(结点数n加1,使n=1,头指针指向新结点,使 p1指向的结点成为第一个结点)2 head=NULL; n=0;头指针置空,结点数置头指针置空,结点数置03 开辟第一个结点,并使开辟第一个结点,并使p1、p2指向它,然后输入一指向它,然后输入一个学生的
35、数据给个学生的数据给p1所指向的结点;所指向的结点;9910189.5p2head4 再开辟一个结点,再开辟一个结点,p1指向它,输入结点数据;指向它,输入结点数据;p1若若p1-num!=0,n+; p2-next=p1结点数结点数n加加1,使使n=2,再将新结点链入第二个结点),然后执行,再将新结点链入第二个结点),然后执行p2=p1,使,使p2移到链表尾。移到链表尾。9910390(n=2)p29910189.5p2head5 重复重复4,开辟第三个新结点,开辟第三个新结点n=3),链入链表中。,链入链表中。p16 再开辟一个新结点,此时再开辟一个新结点,此时p1-num=0,此结点不链
36、,此结点不链入链表,入链表,p2-next =null,建链表的过程结束。,建链表的过程结束。p1指指向的结点不在链表中。向的结点不在链表中。9910390(n=3)991078500p1NULLstruct student * creat( ) struct student *head, *p1, *p2; int len; n=0;head=NULL; len=sizeof(struct student); p1=p2=(struct student *)malloc(len); printf(Enter num,score:); scanf(%ld,%f, &p1-num, &a
37、mp;p1-score); while(p1-num!=0) n+; if(n=1) head=p1; else p2-next=p1; p2=p1; p1=(struct student *)malloc(len); printf(Enter num,score:); scanf(%ld,%f, &p1-num, &p1-score); p2-next=NULL; return(head);malloc返回不指向任何数返回不指向任何数据类型指针,强制转换指据类型指针,强制转换指向向struct student类型指针类型指针void plink(struct student
38、*head) struct student *p; p=head; while(p!=NULL) printf(num=%ld, score=%5.2fn, p-num, p-score); p=p-next; 四、输出链表四、输出链表方法:先由方法:先由headhead得到链表第一个结点的地址并赋给指针变得到链表第一个结点的地址并赋给指针变量量p p,使,使p p指向第一个结点,输出指向第一个结点,输出p p所指向的结点,后将所指向的结点,后将p p后后移指向下一个结点,再输出,直到链表尾结点。移指向下一个结点,再输出,直到链表尾结点。11.8共用体共用体11.8.1共用体的概念共用体的概念共用体:使几
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 26年银发Braden量表使用培训课件
- 外墙刮砂施工工艺与质量标准
- 不等式及其性质(提高)知识讲解
- 肝病科护理工作中的团队协作
- 2026年济南市高三第五次模拟考试语文试卷含解析
- 医学26年:神经疾病随访管理要点 查房课件
- 【2025】成都双流社区工作者招考笔试试题
- 【2025】成都市新都区教科院附属幼儿园招聘考试真题
- 【2024】【新教材】人美版|二年级下册美术第六单元 第2课 好玩的手翻书 教学设计
- 医学26年:Ⅲ型心肾综合征诊疗 查房课件
- (四模)新疆2026年高三普通高考五月适应性文科综合试卷(含答案及解析)
- 《工程结构抗震设计》课件 第1章地震工程基础知识
- 生活美容卫生管理制度
- JGT526-2017 建筑电气用可弯曲金属导管
- 《中药炮制技术》课程标准
- 促进剂物质安全资料表
- 中药学电子版教材
- 王勃滕王阁序注释
- FZ/T 72016-2012针织复合服用面料
- 微生物学-第九章-传染与免疫-zh-v7
- 儿童保健三基理论考核试题题库及答案
评论
0/150
提交评论