结构体共用体和用户定义的数据类型.ppt

上传人:小飞机 文档编号:6056593 上传时间:2023-09-18 格式:PPT 页数:38 大小:405.50KB
返回 下载 相关 举报
结构体共用体和用户定义的数据类型.ppt_第1页
第1页 / 共38页
结构体共用体和用户定义的数据类型.ppt_第2页
第2页 / 共38页
结构体共用体和用户定义的数据类型.ppt_第3页
第3页 / 共38页
结构体共用体和用户定义的数据类型.ppt_第4页
第4页 / 共38页
结构体共用体和用户定义的数据类型.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《结构体共用体和用户定义的数据类型.ppt》由会员分享,可在线阅读,更多相关《结构体共用体和用户定义的数据类型.ppt(38页珍藏版)》请在三一办公上搜索。

1、全国计算机等级考试二级教程 C语言程序设计,计算中心-NEU Computing Center,敖志广,1 typedef,说明一种新的类型名,typedef int INTEGER;INTEGER m,n;int m,n;,typedef char*CHAR;CHAR p;char*p;,2 定义,在实际问题中我们常需要把不同类型的几个数据组合起来,构成一个整体。如一个公司职员的个人信息,或学校中教师和学生的信息。以学生信息为例,它可能包括学生的学号、班级、姓名、性别、年龄、成绩等。这时原有的那些数据类型就显的有点无能为力了,所以引入一种新的数据类型-结构体。,结构体是由一些逻辑相关,但数据

2、类型不同的分量组成的一组数据。,注意:用户需要先定义结构体类型,之后才能定义结构体变量,注意不要忘了分号,关键字,用户定义的标识符,一、定义结构体变量1.先定义结构体类型,再定义变量 struct student char name10;int age;float s1,s2;struct student st1,st2;,nameages1s2,nameages1s2,结构体变量st1和st2各自都需要20个字节的存储空间,2.定义结构体类型同时定义变量 struct student char name10;int age;float s1,s2;st1,st2;,3.直接定义结构体变量 s

3、truct char name10;int age;float s1,s2;st1,st2;,4.说明:(1)结构体变量具有结构体类型的一切特征 在内存中结构体变量占有一片连续的存储单元 存储单元的字节数可用sizeof 运算符算出 printf(“%dn”,sizeof(struct student);printf(“%dn”,sizeof(st1);,(2)结构体类型可以嵌套定义 例:struct date int year;int month;int day;struct stud char name10;struct date birthday;float s1,s2;,或:struc

4、t stud char name10;struct date int year;int month;int day;birthday;float s1,s2;,3 结构体变量的初始化,struct student char name10;int age;float score1,score2;st1=“Mary”,21,78,86;,struct stud char name10;struct date birthday;float score1,score2;struct stud st2=“John”,1980,11,23,89,95;,struct student char name10

5、;int age;float score1,score2;struct student st3;st3=“Mary”,21,78,86;,这是初始化,正确,错误,C不允许这样赋值,4 结构体变量的引用,1.引用结构体变量中的成员 格式:结构体变量名.成员名,struct student char name10;int age;float s1,s2;,注意:一般是对结构体变量的各个成员分别进行赋值st1=“Mary”,21,78,86;这样的赋值是不允许的,struct student st1;st1.name=“Mary”;st1.age=21;st1.s1=78;st1.s2=86;,4.

6、使用结构体,结构成员的引用结构作为若干成员的集合是一个整体可对结构整体进行操作可访问结构中的每个成员使用结构中成员的方法结构变量名.成员名称运算符“.”的含义是访问结构中的成员“.”操作的优先级最高结合性为从左到右指针变量名-成员名在结构体指针变量情况下使用运算符“-”,struct date int year;int month;int day;struct stud char name10;int age;struct date birthday;float s1,s2;,struct stud st2;int age,year;st2.name=“John”;st2.age=20;st2

7、.birthday.year=1980;st2.birthday.month=11;st2.birthday.day=23;st2.s1=89;st2.s2=95;age=24;year=2000;,可以定义与结构体变量成员名相同名字的变量 它们之间不会发生混乱,2.相同类型的结构体变量可以进行整体赋值,struct date int year;int month;int day;struct stud char name10;int age;struct date birthday;float s1,s2;,struct stud st1,st2,st3;st1.name=“John”;st

8、1.age=20;st1.birthday.year=1980;st1.birthday.month=11;st1.birthday.day=23;st1.s1=89;st1.s2=95;st2=st1;st3.name=“Mary”;st3.age=20;st3.birthday=st1.birthday;st3.s1=76;st3.s2=85;,3.结构体变量的输入 输出 C语言不允许结构体变量整体进行输入和输出,只能对结构体变量的成员进行输入和输出,gets(st1.name);scanf(“%d%d%d”,5 结构体数组,一、结构体数组的定义 1.先定义结构体类型 再定义结构体数组 s

9、truct student char name10;int age;float s1,s2;struct student st6;,2.定义结构体类型的同时定义数组 struct student char name10;int age;float s1,s2;st6;,3.直接定义结构体数组 struct char name10;int age;float s1,s2;st6;,二、结构体数组的初始化 将每个数组元素的数据用花括号 括起来,struct student char name10;int age;float s1,s2;struct student st3=“Mary”,21,78

10、,86,“Alex”,20,90,80,“Mike”,19,75,68;,2.数组元素之间可以整体赋值 也可以将一个元素赋给一个相同类型的结构体变量 struct student x,st3=“Mary”,21,78,86,“Alex”,;st2=st0;x=st1;,3.只能对数组元素的成员进行输入和输出,gets(st2.name);scanf(“%d”,三、结构体数组的引用1.引用某个数组元素的成员 例:puts(st0.name);printf(“%d,%d”,st1.age,st1.s1);,例:有30名学生,输入每个学生信息包括学号、姓名、成绩,要求找出成绩最高者,并输出他的信息,

11、#include#define N 30void main()struct student int n;char name10;int score;struct student stN;int i,m;int max;for(i=0;iN;i+)scanf(“%d%s%d”,max=st0.score;for(i=1;i max)max=sti.score;m=i;printf(“%4d”,stm.n);printf(“%10s”,stm.name);printf(“%5d”,stm.score);,例:按成绩对学生信息进行从高到底的排序,#include#define N 30,void m

12、ain()struct stud int n;char name10;int s;struct stud stN,temp;int i,j,k;for(i=0;iN;i+)scanf(“%d%s%d”,for(i=0;iN;i+)printf(“%4d%10s%4d”,ai.n,ai.name,ai.s);,6 指向结构体数据的指针,一、指向结构体变量的指针 1.定义 struct student char name20;int age;float s1,s2;struct student stu,*p;p=,2.成员的引用格式(1)结构体变量名.成员名 stu.name,gets(stu.n

13、ame);(*p).age=21;p-s1=87;p-s2=90;,(2)(*指针变量名).成员名(*p).age,(3)指针变量名-成员名 p-s1,p只能指向一个结构体变量,如:p=&stu;而不能指向结构体变量的一个成员。如:p=&stu.age;是非法的。,-运算符的优先级最高。,例如:struct char name20;int age;*p;则表达式:+p-age:表示age的值增加1。等价于+(p-age),使用结构体指针变量应注意以下几点:p不是结构体变量(是指向结构体变量的指针),因此不能写成成员引用方式p.age的形式。,二、指向结构体数组的指针1.定义 struct st

14、udent st3,*p;2.使用 for(p=st;pname);scanf(“%d%d%d”,对于指向结构体数组的指针:p只能指向一个结构体数组的一个元素(相当于变量),然后用-指向运算符取其成员的值,而不能直接指向一个数组元素的成员。(+p)-age:表示p指针指向下一个数组元素后,再访问其成员age。(p+)-age:先访问age操作,再对指针p加1。,结构体变量作为函数参数1.函数的实参和形参都用结构体变量,参数之间为值传递即:实参 结构体变量各成员的值依次传给形参结构体变量,2.返回结构体类型值的函数 函数定义格式:结构体类型名 函数名(形参表列)函数体;例:struct stud

15、ent funct(int x,float y)函数体;,注意 结构体类型是已经定义好的,三、结构体与函数,注意 结构变量作为参数传递时,其实参与形参的结构类型必须一致,传递时其实参只需指定其结构变量名即可。当实参为数组时,其形参可以定义为同类型结构的结构数组或结构指针。,与普通变量一样,结构变量在函数内部定义时为局部的,其值只在本函数范围内有效,不会影响其它函数 将结构传递给函数的方式有三种传递单个成员传递整个结构传递指向结构的指针传递结构变量的地址可以实现结构的传址调用。结构数组也可作为函数参数传递。,在调用print时,&stud做实参,将stud的地址传递给函数的形参p,这时p指向了结

16、构变量 stud的成员值。,#include#define FORMAT“%dn%sn%6.2fn”struct student int num;char name20;float score;main()void print();struct student stud;stud.num=1001;strcpy(stud.name,”michell”);stud.score=90.9;print(,例:求学生成绩的总分和平均分#include#define N 5struct stud char name10;int s3;float sum,ave;,struct stud comp(str

17、uct stud x)int j;x.sum=0;for(j=0;j3;j+)x.sum=x.sum+x.sj;x.ave=x.sum/3;return(x);,void main()struct stud aN;int j;for(j=0;jN;j+)scanf(“%s%d%d%d”,例:按成绩对学生信息进行从高到底的排序,#include#define N 30struct stud int n;char name10;int s;,void input(struct stud a)int i;for(i=0;iN;i+)scanf(“%d%s%d”,void output(struct

18、stud a)int i;for(i=0;iN;i+)printf(“%4d%10s%4d”,ai.n,ai.name,ai.s);,void sort(struct stud a)int i,j,k;struct stud temp;for(i=0;iN-1;i+)k=i;for(j=i+1;jN;j+)if(ai.saj.s)k=j;temp=ak;ak=ai;ai=temp;,void main()struct stud stN;input(st);sort(st);output(st);,7 用指针处理链表,一、基本概念1.动态存储分配:根据需要临时分配内存单元用以存放数据,当数据不用

19、时可以随时释放内存单元2.链表:是可以动态地进行存储分配的一种数据结构 它是由一组动态数据链接而成的序列3.结点:链表中的每一个动态数据称为一个结点,4.结点类型:是一个包含指针项的结构体类型 一般由两部分组成:(1)数据成员:存放数据(2)指针成员:存放下一个结点的地址,struct sd int num;int score;struct sd*next;,头指针,表头结点,表尾结点,NULL为空地址,表示链表到此结束,二、简单链表,#include struct sd int num;int score;struct sd*next;void main()struct sd a,b,c,*

20、head,*p;head=,2010,1428,1570,2010,1951428,2861570,382NULL,2010,1428,1570,NULL,说明:该程序虽然建立了一个链表,但这个链表是静态的,因为它的结点个数是固定的,不能按需要增加新的结点,也不能按需要删除结点.这样的链表并不实用,我们需要的是“动态链表”,三、处理动态链表所需的函数(需用头文件)1.malloc 函数 原型:void*malloc(unsigned int size)作用:在内存中开辟一个长度为 size 的连续存储空间,并将此存储 空间的起始地址带回,注意:(1)函数返回值是指针,但该指针是指向void类型

21、的,因此在 使用时希望这个指针指向其他类型需要用强制类型转换(2)如果内存缺少足够大的空间进行分配,则 malloc 函数 返回值为“空指针”(即NULL),例:struct sd*p;p=(struct sd*)malloc(sizeof(struct sd);,强制类型转换,结构体类型占用的字节长度,2.free函数 原型:void free(void*ptr)作用:将指针变量ptr指向的存储空间释放,注意:(1)ptr的值不是任意的地址,必须是程序中执行malloc或 calloc函数所返回的地址(2)模型中ptr是void型,但调用free函数时,参数可能是 其他类型,计算机系统会自动

22、进行转换,例:struct sd*p;p=(struct sd*)malloc(sizeof(struct sd);free(p);,4200,4200,四、链表应用举例 1.建立链表(表尾添加法)#include#include#define ST struct student ST int num;int score;ST*next;#define LEN sizeof(ST)int n;,宏定义ST,以后书写简单,求出结构体类型占用的字节数,全局量,n 表示结点的个数,ST*creat(void)ST*head,*p1,*p2;n=0;head=NULL;p1=(ST*)malloc(L

23、EN);scanf(“%d%d”,2010,1428,1570,NULL,3264,2010,2010,195,1428,1,2,3,2010,1428,286,382,00,1428,1570,NULL,1570,1570,3264,2.输出链表void list(ST*head)ST*p;p=head;while(p!=NULL)printf(“%3d%4dn”,p-num,p-score);p=p-next;,2010,1428,1570,2010,1951428,2861570,382NULL,2010,1428,1570,NULL,2010,1428,2010,1570,2,3.链表

24、的删除ST*del(ST*head,int num)ST*p1,*p2;p1=head;while(num!=p1-num),4.链表的插入 ST*insert(ST*head)ST*p0,*p1,*p2;p1=head;p0=(ST*)malloc(LEN);scanf(“%d%d”,4,2680,2010,2010,475,1428,1570,1428,2680,1570,4,2680,2010,175,插入的结点作为表头,2010,2680,4,2680,2010,875,插入的结点作为表尾,NULL,2010,1428,1428,1570,2680,5.main 函数 void main()ST*h;int delnum;h=creat();list(h);scanf(“%d”,/*建立一个链表*/,/*输出链表*/,/*输入要删除的学号*/,/*删除学号为delnum的结点*/,/*在链表中插入一个结点*/,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号