版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章结构与联合张书源C语言支持的构造类型:数组:由同种类型的数据组成。结构体:由不同类型的数据组成。共用体(联合):由不同类型的数据组成,且共享存储空间。枚举类型:由自定义的数据组成。10.1
结构体类型结构体类型是一种根据需要构建的类型集合。结构体类型属于可定制的数据类型,每个结构体类型需要先定制类型的组成,再定义结构体类型的变量。定义结构体类型:定义方法:struct结构体名
{
成员表;};成员可以是任意类型的数据。结构体名是一个标识符结尾处有分号例:用一个结构体表示日期。日期由年、月、日组成,三个成员都是整数。structdate{intyear;intmonth;intday;};例:用一个结构体表示学生信息。成员包括:学号:10位数字串姓名:字符串性别:'M'表示男,'F'表示女年龄:整数住址:字符串structstudent{charno[11];charname[20];charsex;intage;charaddr[50];};10.1.1
结构体类型变量的定义方法一:用定义的结构体类型定义变量structdate{intyear;intmonth;intday;}d1,d2;d1和d2都是这个日期结构体类型的变量。struct{intyear;intmonth;intday;}d1,d2;结构体名可省略方法二:用结构体名定义变量。structdate{intyear;intmonth;intday;};structdated1,d2;结构体名不可省略这种定义方式中,定制结构体类型和定义变量是分开的。书写时,它们可写在程序的不同位置。方法三:先为结构体类型命名,再用类型名定义变量。typedefstruct{intyear;intmonth;intday;}Date;Dated1,d2;结构体名可省略typedef用于为类型命名。用法为:typedef类型名字之后,用名字可以定义变量。说明:与简单数据类型不同,结构体没有一个统一的类型名。定义变量时,需要先定制结构体类型,再用这个类型定义变量。方法一:用定制的结构体类型直接定义变量。方法二:先定制结构体类型,再用结构体名定义变量。方法三:为定制的结构体类型命名,用类型的名字定义变量。练习:1、定制一个结构体类型:成员为一个整型量x和一个实型量y。2、定义一个结构体变量a。struct
{intx;doubley;
}a;structkk
{intx;doubley;
};structkka;typedefstruct
{intx;doubley;
}KK;KKa;成员运算符:用于获取结构体变量的成员。用法:10.1.2
结构体变量的使用结构体变量.成员圆点“.”是成员运算符。每个结构体变量由多个成员组成,使用时需分别访问它的各个成员。如:structdate{intyear;intmonth;intday;}d1,d2;d1.year=2012;d1.month=12;d1.day=20;d2.year=2000;d2.month=5;d2.day=10;d1和d2各自有三个成员,用“变量名.成员”可引用它们。结构体变量的初始化:初始化就是为结构体变量设置初值。结构体类型变量={初值表};structdate
{
intyear;intmonth;intday;
}d1={2012,12,20},d2={2000,5,10};structstudent{charno[11];charname[20];charsex;intage;charaddr[50];};structstudents={"12345678","张三",'M',20,"包头市"};注:初始化时需按成员顺序依次进行。structdate
{
intyear;intmonth;intday;
};structstudent
{
charno[11];charname[20];charsex;structdatebirthday;//嵌套的结构体
charaddr[50];
};structstudents={"12345678","张三",'M',{1990,5,8},"包头市"};结构体变量的输入/输出:应根据成员的类型进行输入/输出,当数据较复杂时应给出适当的提示。例1:#include<stdio.h>structdate
{
intyear;intmonth;intday;
};intmain()
{structdated;scanf("%d%d%d",d.year,d.month,d.day);printf("%d年%d月%d日\n",d.year,d.month,d.day);
}例2:#include<stdio.h>typedefstruct
{
charno[11];charname[20];charsex;intage;charaddr[50];
}STU;intmain()
{
STUs;printf("学号:");gets(s.no);printf("姓名:");gets();printf("性别(M/F):");s.sex=getchar();printf("年龄:");scanf("%d",&s.age);printf("住址:");gets(s.addr);
printf("学号:%s\n",s.no);printf("姓名:%s\n",);printf("性别:");if(s.sex=='M')printf("男\n")elseprintf("女\n");printf("年龄:%d\n",s.age);printf("住址:%s\n",s.addr);}姓名:年龄:性别:生日:语种:系别:练习:10.1structstudents1={"李明",20,'M',{5,6,1976},'c',"计算机系"};printf("%s%d%c%d%d%d%c%s",,s1.age,s1.sex,s1.date_birthday.month,s1.date_birthday.day,s1.date_birthday.year,s1.Language,s1.department);字符串整型字符结构体字符字符串charintcharstructdatecharchar10.2
结构体数组的定义和引用如果数组的每个元素都是结构体,这样的数组就是结构体数组。结构体数组的定义方法:结构体类型数组名[长度];例:structstudent
{charno[11];charname[20];intage;
};structstudents[60];数组s可存放60个结构体,下标为0~59。使用时用s[下标].no、s[下标].name、s[下标].age引用各元素的成员。例:成绩单学号(no[6])、姓名(name[20])、三门课成绩(score[3])、总成绩(total)学号姓名C语言英语高数总成绩10001张三70757210002李四82728010003王五628366总分由程序计算,其它数据用初始化方式给出。输出成绩单。定制结构体:structstu{charno[6];//学号
charname[20];//姓名
intscore[3];//三门课成绩
inttotal;//总成绩};定义结构体数组并初始化:structstua[N]={{"10001","张三",{70,75,72},0},{"10002","李四",{82,72,80},0},{"10003","王五",{62,83,66},0}};计算每个学生的总成绩:for(i=0;i<N;i++)for(j=0;j<3;j++)a[i].total+=a[i].score[j];打印成绩单:printf("学号\t姓名\tC语言\t英语\t高数\t总成绩\n");for(i=0;i<N;i++)printf("%s\t%s\t%d\t%d\t%d\t%d\n",a[i].no,a[i].name,a[i].score[0],a[i].score[1],a[i].score[2],a[i].total);10.3
结构体指针的定义和引用结构体指针的定义:structdate
{
intyear;intmonth;intday;
};structdated,*p=&d;pyearmonthdayd用指针访问结构体成员:1、用*运算符和.运算符。2、用->运算符。pyearmonthdayd(*p).yearp->year(*p).month(*p).dayp->monthp->day由于*和.优先级相同且都是右结合,使用时需使用括号。->是一个结构体指针的专用运算符,用于通过指针获取结构体的成员。用指针生成动态结构体:structdate
{
intyear;intmonth;intday;
};structdate*p;p=(structdate*)malloc(sizeof(structdate));pyearmonthdayp->yearp->monthp->day动态结构体用完后应释放其存储空间。p->year=2012;p->month=12;p->day=10;printf("%d年%d月%d日\n",p->year,p->month,p->day);free(p);10.4
链表由于数组的大小需预先指定,且不能更改,所以数组不适合那些数据量变化很大的场合。链表是一种动态数据结构,它在程序执行过程中按需要生成存储空间,且可随时调整大小,提高了内存的利用率。链表的每个结点都是结构体,数据域中存放结点的数据,指针域中存放下一个结点的地址。head称为头指针,它存放了头结点的地址。头结点是一个不存放数据的结点,它可以简化链表的某些操作。最后一个结点的指针域存放NULL,表示没有后续结点。每个结点都是用malloc()函数动态生成的。单链表:a1a2a3^head头结点链表结点的定义:structunit
{
charname[20];
chartel[15];
charemail[40];
structunit*next;
};假设有一个通讯录,则可定义以下结构体作为链表结点:数据域指针域指针域必须是一个指向同类结构体的指针,用于指向下一个结构体。a1a2^head小李123456789111@163.com小王987654321ttt@126.com10.4.2
链表的建立1、定义结点:typedefstructnode
{
intdata;structnode*next;
}NODE;2、定义头指针:NODE*head;这时的链表称为空表。3、生成头结点:head=(NODE*)malloc(sizeof(NODE));head->next=NULL;^head4、根据需要生成其它结点:假设我们输入了4个整数,把它们存入链表,每个结点存一个。102030head40^NODE*p;p=head;for(i=1;i<=4;i++)
{
scanf("%d",&x);p->next=(NODE*)malloc(sizeof(NODE));p=p->next;p->data=x;
}p->next=NULL;headxp10datanextp20p20……p40^^1010.4.3
输出链表链表是一种只能顺序访问的数据结构,每个结点都需要通过前一个结点才能访问。通常的访问方法是用一个指针沿着链表进行移动,逐个访问各个结点。注意:不要移动头指针,否则将导致链表结点再也无法找到。102030head40^p=head->next;while(p!=NULL)
{
printf("%d",p->data);p=p->next;}102030head40^pppppNULL10.4.4
回收链表当链表使用结束后,应该用free()函数回收各个结点所占的存储空间。回收时只能一个结点一个结点的回收。102030head40^ppppp=head;while(p!=NULL)
{
head=head->next;free(p);p=head;
}ppNULLheadheadheadheadheadNULL10.5
联合联合又称共用体,也是C语言中的一种构造类型。与结构体相似,联合也可由不同类型的数据组成,只是一个联合的所有成员会共享存储空间。定义联合类型:定义方法:union联合名
{
成员表;};联合的定义方法与结构体相同,只是使用union定义,联合的成员可以是任意类型的数据。如:unionun
{
intx;inty;
};联合变量的定义:与结构体变量定义的方法相同。unionun{intx;inty;}u;u是一个联合类型的变量,它有两个成员x和y。unionun{intx;inty;};unionunu;typedefunion{intx;inty;}UN;UNu;联合变量成员的访问:与访问结构体成员的方法相同。联合变量名.成员名unionun{intx;inty;};unionunu;u.x=10;联合的特点:在一个联合变量中,所有成员共享一个存储空间,如果修改了一个成员的值,所有成员的值都被修改。unionun{intx;inty;};unionunu;u.x=10;u.xu.yu.x和u.y共享了一个整型空间,当u.x被赋值为10时,u.y也被赋值为10。如果一个联合中有不同类型的成员,则一个变量的长度等于最长成员的长度。unionun{intx;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年高空作业协议样本大全
- 养护承包合同
- 齐鲁工业大学《Java面向对象程序设计》2022-2023学年期末试卷
- 2024年度劳务派遣协议范本
- 南京信息工程大学《智能传感与检测技术》2022-2023学年第一学期期末试卷
- 齐鲁工业大学《产品工程设计基础》2023-2024学年期末试卷
- 2024年期机动车使用安全保证协议
- 智能化装配式建筑金属结构制造项目可行性研究报告写作模板-备案审批
- 建筑施工事故分析与整改措施考核试卷
- 搪瓷制品的设计美学与消费者需求考核试卷
- 护理不良事件-PPT课件
- 商业银行两地三中心数据容灾备份方案建议书
- 体育运动中的二次函数
- 修改留言条(课堂PPT)
- 铜排载流量表
- 2014121085852风力发电机组出质保期验收标准
- 中南大学湘雅医院特色专病门诊和多学科联合门诊管理办法
- 乒乓球比赛分组对阵表(8人、16人、32人)
- 消防控制室记录表
- 小学三年级下册道德与法治课件-8.大家的朋友-部编版(15张)课件
- 南昌市南京路医药谷工程勘察报告资料
评论
0/150
提交评论