结构体与共用体.ppt_第1页
结构体与共用体.ppt_第2页
结构体与共用体.ppt_第3页
结构体与共用体.ppt_第4页
结构体与共用体.ppt_第5页
免费预览已结束,剩余58页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,2020/6/10,第8章结构体与共用体,主要内容结构体链表共用体枚举类型自定义类型,2,2020/6/10,本章要点,结构体数组结构体指针用指针处理链表共用体和枚举类型用户自定义类型的定义方法,3,2020/6/10,8.1结构体,8.1.1结构体类型与结构体变量如果程序中用到图8.1所表示的数据结构,可以在程序中自己建立一个结构体类型。例如:structStudentintnum;charname20;charsex;intage;floatscore;charaddr30;,4,2020/6/10,8.1结构体,8.1.1结构体类型与结构体变量定义一个结构体类型的一般形式为:struct结构体名成员表列;有两点读者需要理解:(1)可定义多种结构体类型,例如除了建立上面的structStudent结构体类型外,还可以根据需要建立名为structTeacher,structWorker等结构体类型,各自包含不同的成员。,5,2020/6/10,(2)成员可以为某一个结构体类型。例如:structDate/声明一个结构体类型structDateintmonth;/月intday;/日intyear;/年;structStudentintnum;charname20;charsex;floatscore;charaddr30;structDatebirthday;,8.1结构体,6,2020/6/10,8.1结构体,8.1.1结构体类型与结构体变量2.定义结构体变量说明结构变量有以下三种方法。(1)先定义结构体类型,再说明结构变量。structStudentlongnum;charname30;charsex;intage;floatscore;charaddr20;structStudentstudent1,student2;,7,2020/6/10,8.1结构体,8.1.1结构体类型与结构体变量(2)在定义结构类型的同时说明结构体变量。structStudentlongnum;charname30;charsex;intage;floatscore;charaddr20;student1,student2;,8,2020/6/10,8.1结构体,8.1.1结构体类型与结构体变量(3)直接定义结构体类型变量。structlongnum;charname20;charsex;intage;floatscore;charaddr;student1,student2;,9,2020/6/10,8.1结构体,8.1.1结构体类型与结构体变量3.结构体变量的初始化和引用例8.1把一个学生的信息(学号、姓名、性别、住址)放在一个结构体变量中,然后输出这个学生的信息。算法描述:首先声明一个结构体类型,然后定义一个结构体变量,最后通过printf函数输出到屏幕上。,10,2020/6/10,8.1结构体,#includeintmain()structStudentintnum;charname20;charsex;charaddr20;a=10001,“LiMing”,M,”BeiJing”;/定义结构体变量a并初始化printf(Number:%dnName:%snsex:%cnaddress:%sn,a.num,,a.sex,a.addr);return0;,11,2020/6/10,8.1结构体,程序分析:程序中声明了一个名为Student的结构体类型,有4个成员。在声明类型的同时定义了结构体变量a并进行初始化。提供了a各成员的值,num,name数组,sex及addr数组的值为10001,“LiMing”,M,”BeiJing”。最后用printf函数输出变量中各成员的值。注意:(1)在定义结构体变量时可以对它的成员初始化。初始化列表是用花括号括起来的一些常量。如:structStudenta=10001,LiMing,M,BeiJing;(2)可以引用结构体变量中成员的值,引用方式为结构体变量.成员名(3)如果成员本身又属于一个结构体类型,则要输出若干个成员运算符,一级一级的找到最低的一级的成员。student1.birthday.month,12,2020/6/10,8.1结构体,(4)结构体变量成员间可以像普通变量一样进行各种运算。(5)同类结构体变量可以互相赋值,如:student1=student2;(6)可以引用结构体变量成员的地址和结构体变量的地址。例如:scanf(“%d”,例8.2输入两个学生的学号、姓名和成绩,输出成绩较高学生的学号、姓名和成绩。算法描述:(1)定义两个结构相同的结构体变量(2)输入两个学生的学号、姓名和成绩;(3)比较两个学生的成绩,13,2020/6/10,8.1结构体,#includeintmain()structStudentintnum;charname20;floatscore;student1,student2;scanf(%d%s%f,14,2020/6/10,printf(Thehigherscoreis:n);if(student1.scorestudent2.score)printf(%d%s%6.2fn,student1.num,,student1.score);elseif(student1.scorescore);return0;,24,2020/6/10,8.1结构体,程序分析:在上面的例子中,指针变量p的起始值是stu0的地址,即p指向stu0。在第一次进入循环后,通过p输出stu0各成员的值;执行p+后,p中的地址变为stu1的地址,即此时,p指向stu1,再次进入循环。这样,就可以输出每个数组元素各成员的值了。,25,2020/6/10,8.1结构体,8.1.3结构体指针指向结构体数据的指针作函数参数函数间传递结构体类型的数据,有两种方法:(1)直接传结构体变量。(2)传结构体变量的地址。例8.6利用指向结构体数据的指针作函数参数存储和显示三个学生的信息。算法描述:首先定义一个被调函数output,形参为结构体变量指针。然后在main函数中定义并初始化一个结构体数组,在main函数中调用output函数输出到屏幕上即可。,26,2020/6/10,8.1结构体,#includestructstudentintnum;charname10;floatscore;voidoutput(structstudent*p)printf(%dt%st%5.1fn,p-num,p-name,p-score);intmain()structstudentstu3=1,Zhao,90.0,2,Qian,89.5,3,Sun,85.0;inti;printf(NotNametScoren);for(i=0;inum,p-score);p=p-next;/指针p后移一个结点,35,2020/6/10,8.2链表,structstudent*create(intn)structstudent*head=NULL,*p1,*p2;inti;for(i=1;inum,36,2020/6/10,8.2链表,intmain()structstudent*head;intn;printf(请输入学生个数:n);scanf(%d,37,2020/6/10,8.2链表,程序分析:在程序中首先定义了结构体structstudent类型作为链表基本类型;接着建立了具有n个结点的动态链表的函数create,并将结点个数作为函数的形参,并返回链表头指针;然后编写了print函数输出动态链表。最后通过主函数调用create及print函数显示动态链表的建立及输出过程。,38,2020/6/10,8.2链表,(3)动态链表结点的删除(4)动态链表结点的插入,39,2020/6/10,8.2链表,8.2.1链表的结构例8.8设链表中各结点按学号由小到大排列,编写函数,删除指定学号的学生结点,以头指针和学号作参数。然后编写函数插入一个新结点,使链表仍按原顺序排列。算法描述:本例对链表的操作涉及的内容包括:1.动态链表的创建;2.动态链表的输出;3.动态链表中结点的删除;4.动态链表中结点的插入。其中1和2部分可参考例8.7实现,需要定义链表的基本类型,并定义链表的建立及输出函数。3和4部分操作涉及的是链表中结点的删除及插入操作,可分别编写函数实现。,40,2020/6/10,structstudent*del(structstudent*head,intnum)structstudent*p1,*p2;if(head=NULL)/若链表为空printf(原表为空!n);return(NULL);elsep1=head;while(p1-num!=num,41,2020/6/10,8.2链表,structstudent*insert(structstudent*head,structstudent*stud)structstudent*p0,*p1,*p2;p1=head;p0=stud;if(head=NULL)/若原链表为空,则将新结点作为头结点处理head=p0;p0-next=NULL;,42,2020/6/10,elseWhile(p0-nump1-num),43,2020/6/10,8.2链表,intmain()structstudent*head,*stud;intn,k;printf(请输入学生人数:n);scanf(%d,44,2020/6/10,8.2链表,printf(请输入要删除的学生学号:n);scanf(%d,45,2020/6/10,8.2链表,程序分析:在程序中首先声明了结构体structstudent类型作为链表基本类型;接着定义了创建n个结点链表的函数create和输出链表的函数print。然后定义了链表中结点删除及插入的函数del和insert,其中del的形参为指向链表的头指针和需要删除的学生学号信息,insert函数的形参为指向链表的头指针和需要插入的结点信息。最后通过主函数调用上述函数显示链表的建立、输出、插入及删除结果。,46,2020/6/10,8.3共用体,8.2.1链表的结构共用体类型的定义的一般形式为:union共用体名成员列表;例:unionuntpinti;charch;floatf;,47,2020/6/10,8.3共用体,共用体类型变量的定义也可以用以下三种方法来定义:(1)先定义类型、再定义变量,例如:unionuntpinti;charch;floatf;/定义共用体类型unionuntpun1,un2;/定义变量,48,2020/6/10,8.3共用体,(2)定义类型的同时定义变量,例如:unionuntpinti;charch;floatf;un1,un2;(3)直接定义变量,例如:unioninti;charch;floatf;un1,un2;,49,2020/6/10,8.3共用体,8.3.1共用体的特点(1)在某一时刻,存放的和起作用的是最后一次存入的成员。例如,执行un1.i=1;un1.ch=c;un1.f=3.14;后,un1.f才是有效的成员。(2)由于所有成员共享同一内存空间,故共用体类型变量与其各成员的地址相同。例如,charname20;charsex;charjob;unionintclasses;charposition10;category;person2;intmain()intn,i;,52,2020/6/10,for(i=0;itue),56,2020/6/10,8.4枚举类型,例8.10枚举类型举例#includeintmain()enumbodyJ,F,M,A;/声明枚举类型bodyenumbodymonth31,j;/定义枚举

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论