




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
结构体与共同体第1页,课件共45页,创作于2023年2月学习目标学会建立和使用结构体、共同体。能够为数据对象动态分配和释放内存。能够建立和操作链表。理解链式数据结构的应用。第2页,课件共45页,创作于2023年2月11.1引言数组是一组同类型的数据集合。结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体-------自定义数据类型第3页,课件共45页,创作于2023年2月11.2结构体类型及其变量的定义和初始化11.2.1结构体类型定义struct[结构体名]{
类型标识符成员名;类型标识符成员名;
…………….};成员类型可以是基本型或构造型struct是关键字,不能省略合法标识符可省:无名结构体第4页,课件共45页,创作于2023年2月例
struct
student{intnumber;charname[20];charsex;intage;
};namenumbersexage2字节2字节20字节1字节……..结构体类型定义描述结构的组织形式,不分配内存第5页,课件共45页,创作于2023年2月定义结构体类型时要注意以下几点:1)结构体成员可以是任何基本数据类型,也可以是数组、指针类型。如上例中的name成员为字符数组类型,sex成员为字符指针成员。2)结构体类型可以嵌套定义,结构体中的成员可以是其它结构体类型。3)定义的结构体类型,在编译时系统不对类型分配内存空间。structDATE{intyear;//年
intmonth;//月
intday;//日};structstudent{longintnumber;//学号
charname[8];//姓名
intage;//年龄
char*sex;//性别
structDATEbirthday;//出生日期结构体嵌套定义};第6页,课件共45页,创作于2023年2月例structstudent{intnumber;charname[8];charsex;intage;structDATEbirthday;};
structstudentstu1,stu2;11.2.2
结构体变量的定义先定义结构体类型,再定义结构体变量一般形式:struct结构体名{
类型标识符成员名;类型标识符成员名;…………….};struct结构体名
变量名表列;例#defineSTUDENTstructstudent
STUDENT{intnumber;charname[8];charsex;intage;structDATEbirthday;};
STUDENTstu1,stu2;第7页,课件共45页,创作于2023年2月定义结构体类型的同时定义结构体变量一般形式:struct结构体名{
类型标识符成员名;类型标识符成员名;…………….}变量名表列;例structstudent{intnumber;charname[8];charsex;intage;structDATEbirthday;}stu1,stu2;第8页,课件共45页,创作于2023年2月直接定义结构体变量一般形式:struct{
类型标识符成员名;类型标识符成员名;
…………….}变量名表列;例struct{intnumber;charname[8];charsex;intage;structDATEbirthday;}stu1,stu2;用无名结构体直接定义变量只能一次第9页,课件共45页,创作于2023年2月11.2.3
结构体变量的引用和初始化1)对结构体变量中成员的引用例如:stu1.numer相当于一个长整型的变量
相当于一个数组名如果一个结构体类型中又嵌套一个结构体类型,访问该类型的变量时应采取逐级访问的方法,直到得到所需访问的成员为止。例如:stu1.birthday.yearstu1.birthday.month第10页,课件共45页,创作于2023年2月2)对整个结构体变量的引用相同类型的结构体变量可以整体赋值例如:structstudentstu1,stu2;stu1=stu2;第11页,课件共45页,创作于2023年2月【例11-1】结构体类型变量的引用示例。#include<stdio.h>structDATE{intyear;//年
intmonth;//月
intday;//日};structstudent{longintnumber;//学号
charname[8];//姓名
intage;//年龄
charsex[2];//性别
structDATEbirthday;//出生日期结构体嵌套定义};第12页,课件共45页,创作于2023年2月voidmain(){structstudentst1;//声明结构体变量scanf("%ld",&st1.number);//输入学号scanf("%s",);//输入姓名scanf("%d",&st1.age);//输入年龄scanf("%s",st1.sex);//输入性别scanf("%d%d%d",&st1.birthday.year,&st1.birthday.month,&st1.birthday.day);//出生日期printf("学号:%ld姓名:%s年龄:%d性别:%s",st1.number,,st1.age,st1.sex);printf("出生日期:%d-%d-%d\n",st1.birthday.year,st1.birthday.month,st1.birthday.day);}第13页,课件共45页,创作于2023年2月11.2.3
结构体变量的引用和初始化形式一:struct结构体名{
类型标识符成员名;类型标识符成员名;…………….};struct结构体名
结构体变量={初始数据};例structstudent{intnumber;charname[8];charsex;};structstudentstu1={110,“LinPing”,‘F’};第14页,课件共45页,创作于2023年2月形式二:struct结构体名{
类型标识符成员名;类型标识符成员名;…………….}结构体变量={初始数据};例structstudent{intnum;charname[8];charsex;}stu1={110,“LinPing”,‘F’};第15页,课件共45页,创作于2023年2月形式三:struct{
类型标识符成员名;类型标识符成员名;…………….}结构体变量={初始数据};例struct{intnum;charname[8];charsex;}stu1={112,“LinPing”,‘F’};第16页,课件共45页,创作于2023年2月11.3
结构体数组结构体数组的定义structstudent{intnum;charname[8];charsex;intage;};structstudentstu[2];structstudent{intnum;charname[8];charsex;intage;}stu[2];第17页,课件共45页,创作于2023年2月结构体数组初始化例struct{intnum;charname[20];charsex;intage;}stu[]={{……},{……},{……}};顺序初始化:structstudent{intnum;charname[20];charsex;intage;};structstudentstu[]={100,“WangLin”,‘M’,20,101,“LiGang”,‘M’,19,110,“LiuYan”,‘F’,19};例structstudent{intnum;charname[20];charsex;intage;}stu[]={{……},{……},{……}};分行初始化:structstudent{intnum;charname[10];charsex;intage;};structstudentstu[]={{100,“Linping”,‘M’,22},{111,“Linhong”,‘M’,29},{120,“Liqiang”,‘F’,16}};全部初始化时维数可缺省结构体数组引用引用方式:结构体数组名[下标].成员名
structstudent{intnum;charname[10];charsex;intage;}str[3];stu[1].age++;strcpy(stu[0].name,”LiSan”);第18页,课件共45页,创作于2023年2月11.4结构体指针指向结构体变量的指针定义形式:struct结构体名*结构体指针名;例structstudent*p;使用结构体指针变量引用成员形式(*结构体指针名).成员名结构体指针名->成员名结构体变量名.成员名第19页,课件共45页,创作于2023年2月用指向结构体的指针作函数参数用结构体变量的成员作参数----值传递用指向结构体变量或数组的指针作参数----地址传递用结构体变量作参数----多值传递,效率低第20页,课件共45页,创作于2023年2月11.5用结构体变量作函数参数【例11-5】将例11-2中输出功能用函数print实现。#include<stdio.h>structstudent{//定义结构体类型
longintnumber;//学号
charname[8];//姓名
floatscore[2];//2门课程的成绩};voidprint(structstudentstud)//定义输出函数print{intj;printf("%ld%7s",stud.number,);for(j=0;j<2;j++)printf("%7.1f",stud.score[j]);printf("\n");}第21页,课件共45页,创作于2023年2月voidmain(){structstudentstud[3];//定义结构体数组
inti,j;//输入
for(i=0;i<2;i++){scanf("%ld",&stud[i].number);scanf("%s",stud[i].name); for(j=0;j<2;j++)scanf("%f",&stud[i].score[j]);}printf("\n学号姓名数学英语\n");for(i=0;i<3;i++)print(stud[i]);//调用输出函数print}第22页,课件共45页,创作于2023年2月例结构体指针变量作为函数参数
【例11-6】将例11-4中输出功能用函数print实现。#include<stdio.h>structstudent{//定义结构体类型
longintnumber;//学号
charname[8];//姓名
floatscore[2];//2门课程的成绩};voidprint(structstudent*sp)//定义print函数{intj;printf("%ld%7s",sp->number,sp->name);for(j=0;j<2;j++)printf("%7.1f",sp->score[j]);printf("\n");}第23页,课件共45页,创作于2023年2月voidmain(){structstudentstud[3]={{230401,“李立”,{80,89}}, {230402,"王平",{79,87}}, {230403,"赵宏",{88,86}}};inti;printf("\n学号姓名数学英语\n");for(i=0;i<3;i++)print(&stud[i]);//调print函数}第24页,课件共45页,创作于2023年2月11.7
链表
x1
1222头指针1876
x2
1556
x3
1066
x4
0structnode{ intx;structnode*next};利用指针和结构体建立链表
122215561066结点1结点2结点3结点4第25页,课件共45页,创作于2023年2月1.malloc函数malloc函数的原型为:void*malloc(unsignedintsize)其作用是在内存的动态存储区(堆)中分配一个长度为size的连续空间。2.free函数由于内存空间总是有限的,不可能无限分配下去,而且一个程序应该尽量节约系统资源,因此,用完后应及时释放它,以便其它的变量或者程序能够使用。这时我们就要用到free函数。其函数原型是:voidfree(void*p)作用是释放由指针p所指向的内存空间。第26页,课件共45页,创作于2023年2月静态链表静态链表的结点不是动态开辟的动态链表11.7.2
链表的定义和特点1)不需要预先分配内存空间;2)分配的空间可以根据程序的需要扩大或缩小。第27页,课件共45页,创作于2023年2月【例11-10】单链表的建立。#include<stdio.h>#include<malloc.h>/*包含动态内存分配函数的头文件*/#defineN10/*N为人数*/typedefstructnode{charname[20];structnode*link;}stud;第28页,课件共45页,创作于2023年2月stud*create(intn)/*建立单链表的函数,形参n为人数*/{stud*p,*h,*s;/**h保存表头结点的指针,*p指向当前结点的前一个结点,*s指向当前结点*/inti;/*计数器*/if((h=(stud*)malloc(sizeof(stud)))==NULL)/*分配空间并检测*/{printf("分配内存空间失败!");exit(0);}h->name[0]=’’;/*把表头结点的数据域置空*/h->link=NULL;/*把表头结点的链域置空*/p=h;/*p指向表头结点*/第29页,课件共45页,创作于2023年2月for(i=0;i<n;i++){if((s=(stud*)malloc(sizeof(stud)))==NULL)/*分配空间并检测*/{printf("分配内存空间失败!");exit(0);}p->link=s;/*把s的地址赋给p所指向的结点的链域,这样就把p和s所指向的结点连接起来了*/printf("请输入第%d个人的姓名",i+1);scanf("%s",s->name);/*在当前结点s的数据域中保存姓名*/s->link=NULL;p=s;}return(h);}第30页,课件共45页,创作于2023年2月voidmain(){intnumber;/*保存人数*/stud*head;/*head是保存单链表表头结点地址的指针*/number=N;head=create(number);/*把新建单链表表头地址赋给head指针*/}以上为建立包含N个人姓名的单链表。建好一个单链表之后,可进行一些如插入、删除等操作。下面先介绍查找算法,再来讨论插入和删除操作,第31页,课件共45页,创作于2023年2月stud*search(stud*h,char*x)/*查链表函数,其中h是链表头指针,x指针是要查找人的姓名*/{stud*p;/*当前指针,指向要与所查找的姓名进行比较的结点*/char*y;/*保存结点数据域内姓名的指针*/p=h->link;while(p!=NULL){y=p->name;if(strcmp(y,x)==0)/*把数据域里的姓名与所要查找的姓名比较,若相同则返回0,即条件成立*/return(p);/*返回与所要查找结点的地址*/elsep=p->link;}if(p==NULL)printf("未能查找到该数据!");}第32页,课件共45页,创作于2023年2月动态链表的插入操作假设在一个单链表中存在2个连续结点p、q(其中p为q的直接前驱),现在需要在p、q之间插入一个新结点s,那么我们必须先为s分配空间并赋值,然后使p的指针域存储s的地址,s的指针域存储q的地址即可。(p->link=s;s->link=q),这样就完成了插入操作。第33页,课件共45页,创作于2023年2月voidinsert(stud*p)/*插入函数,在指针p后插入*/{charstuname[20];stud*s;/*指针s是保存新结点地址的*/if((s=(stud*)malloc(sizeof(stud)))==NULL){printf("不能分配内存空间!");exit(0);}printf("请输入你要插入的人的姓名:");scanf("%s",stuname);strcpy(s->name,stuname);/*把指针stuname所指向的数组元素拷贝给新结点的数据域*/s->link=p->link;/*把新结点的链域指向原来p结点的后继结点*/p->link=s;/*p结点的链域指向新结点*/}第34页,课件共45页,创作于2023年2月动态链表的删除操作假如我们已经知道了要删除的结点p的位置,那么要删除p结点时只要令p结点的前驱结点的指针域由存储p结点的地址改为存储p的后继结点的地址,并释放p结点即可。第35页,课件共45页,创作于2023年2月voiddelete(stud*x,stud*y)/*删除函数,其中y为要删除的结点的指针,x为要删除的结点的前一个结点的指针*/{stud*s;s=y;x->link=y->link;free(s);}第36页,课件共45页,创作于2023年2月11.8
共同体用户自定义数据类型,也叫联合体用途:将不同类型的数据项组织为一个整体,占有同一段内存共用体类型定义定义形式:union共同体名{
成员表;};
例
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 南通师范高等专科学校《风景写生》2023-2024学年第二学期期末试卷
- 河南交通职业技术学院《微纪录片创作实践》2023-2024学年第二学期期末试卷
- 桂林师范高等专科学校《量子力学(一)》2023-2024学年第二学期期末试卷
- 广西民族大学相思湖学院《俄罗斯文化》2023-2024学年第二学期期末试卷
- 江西工程学院《产品设计报告书制作》2023-2024学年第二学期期末试卷
- 中国地质大学(北京)《民族民间工艺传承创新专题》2023-2024学年第二学期期末试卷
- 上海工商职业技术学院《中药养护学》2023-2024学年第二学期期末试卷
- 湖南司法警官职业学院《仪器分析》2023-2024学年第二学期期末试卷
- 兰州大学《金融投资技术分析与技巧》2023-2024学年第二学期期末试卷
- 打桩考试试题及答案
- 石油工业与环境保护概论智慧树知到答案章节测试2023年中国石油大学(华东)
- 警用无人机考试题库(全真题库)
- 医保业务知识题库
- 等级医院评审中应注意的迎评礼仪
- 吉林省长春市东北师大附中明珠学校2023年物理八年级第二学期期末统考模拟试题含解析
- 【小升初】贵州省遵义市2022-2023学年人教版小学六年级下学期数学升学分班考测试卷(含解析)
- LD 52-1994气瓶防震圈
- GB/T 35351-2017增材制造术语
- GB/T 18268.1-2010测量、控制和实验室用的电设备电磁兼容性要求第1部分:通用要求
- FZ/T 93074-2011熔喷法非织造布生产联合机
- 牵引供电系统课件
评论
0/150
提交评论