![北京邮电大学C语言课件第9章-结构体与链表_第1页](http://file4.renrendoc.com/view/c9cebd697ddd057ff72ba10219a83474/c9cebd697ddd057ff72ba10219a834741.gif)
![北京邮电大学C语言课件第9章-结构体与链表_第2页](http://file4.renrendoc.com/view/c9cebd697ddd057ff72ba10219a83474/c9cebd697ddd057ff72ba10219a834742.gif)
![北京邮电大学C语言课件第9章-结构体与链表_第3页](http://file4.renrendoc.com/view/c9cebd697ddd057ff72ba10219a83474/c9cebd697ddd057ff72ba10219a834743.gif)
![北京邮电大学C语言课件第9章-结构体与链表_第4页](http://file4.renrendoc.com/view/c9cebd697ddd057ff72ba10219a83474/c9cebd697ddd057ff72ba10219a834744.gif)
![北京邮电大学C语言课件第9章-结构体与链表_第5页](http://file4.renrendoc.com/view/c9cebd697ddd057ff72ba10219a83474/c9cebd697ddd057ff72ba10219a834745.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第九章结构体与链表内容提要结构体类型的定义结构体类型变量结构体类型数组结构体类型指针结构体与函数链表结构体概述(1)结构体1.什么叫结构体:把不同类型的数据组合成一个整体的自定义数据类型,是一种构造数据类型。2.结构体类型定义struct
[结构体名]{
类型标识符成员名1;类型标识符成员名2;
…………….};成员类型可以是基本型或构造型struct是关键字,不能省略合法标识符可省:无名结构体结构体概述(2)定义结构体类型,描述下列数据
(1)学生情况:包含学生的学号、姓名、性别、年龄、C语言课程成绩:structstudent{intno;/*学号*/
charname[10];/*姓名*/
charsex;
/*性别*/
intage;
/*年龄*/
floatscore;
/*C成绩*/};注:‘;’不能省结构体类型定义描述结构的组织形式,不分配内存如考虑10门课程成绩,加上总成绩与平均成绩,可作如下定义:
structstudent{intno;/*学号*/
charname[10];/*姓名*/
charsex;
/*性别*/
intage;
/*年龄*/
floatscore[10];/*10门课程成绩*/
floattcj,acj;
/*总成绩,平均成绩*/};定义结构体类型,描述下列数据(2)个人数据:包含姓名、性别、年龄、身高、体重、住址:structperson{charname[20];/*姓名*/charsex;/*性别*/intage;/*年龄*/floatheight;/*身高*/floatweight;/*体重*/charaddr[50];/*住址*/};
(3)日期结构体类型包括年、月、日:structdate{intyear;/*年*/month;/*月*/day;/*日*/};(4)如职工信息结构体类型:structperson{charname[20];/*姓名*/charaddress[40];/*地址*/floatsalary;/*工资*/floatcost;/*扣款*/structdatehiredate;/*聘任日期*/};
结构体类型可以嵌套定义即一个结构体类型中的某些成员又是其他结构体类型结构体类型变量的定义(1)先定义结构体类型,再定义结构体变量一般形式:例structstudent{intnum;charname[20];charsex;
intage;floatscore;charaddr[30];};
structstudentstu1,stu2;struct结构体名{
类型标识符成员名;类型标识符成员名;
…………….};struct结构体名
变量名表列;例#defineSTUDENT
structstudent
STUDENT{intnum;charname[20];charsex;
intage;floatscore;charaddr[30];};
STUDENTstu1,stu2;结构体类型变量的定义(2)定义结构体类型的同时定义结构体变量一般形式:struct结构体名{
类型标识符成员名;类型标识符成员名;
…………….}变量名表列;例structstudent{intnum;charname[20];charsex;
intage;floatscore;charaddr[30];}stu1,stu2;结构体类型变量的定义(3)直接定义结构体变量(匿名定义)一般形式:struct{
类型标识符成员名;类型标识符成员名;
…………….}变量名表列;例struct
{intnum;charname[20];charsex;
intage;floatscore;charaddr[30];}stu1,stu2;用无名结构体直接定义变量只能一次结构体类型声明的说明说明结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存类型:不能赋值、存取、运算;变量:可以结构体可嵌套结构体成员名与程序中变量名可相同,不会混淆结构体类型及变量的作用域与生存期例
structdate{intmonth;
intday;
intyear;};
structstudent{intnum;charname[20];
structdatebirthday;}stu;numnamebirthdaymonthdayyear例
structstudent{intnum;charname[20];
structdate{intmonth;
intday;
intyear;}birthday;}stu;numnamebirthdaymonthdayyear结构体变量的使用(1)由结构体变量名引用其成员结构体变量不能整体引用,只能引用变量成员可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用引用方式:结构体变量名.成员名成员(分量)运算符优先级:1结合性:从左向右例structstudent{intnum;charname[20];charsex;
intage;floatscore;charaddr[30];}stu1,stu2;stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age++;例structstudent{intnum;charname[20];charsex;
intage;floatscore;charaddr[30];}stu1,stu2;printf(“%d,%s,%c,%d,%f,%s\n”,stu1);()stu1={101,“WanLin”,‘M’,19,87.5,“DaLian”};()例structstudent{intnum;charname[20];charsex;
intage;floatscore;charaddr[30];}stu1,stu2;stu2=stu1;()例structstudent{intnum;charname[20];
structdate{intmonth;
intday;
intyear;}birthday;}stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;例structstudent{intnum;charname[20];charsex;
intage;floatscore;charaddr[30];}stu1,stu2;if(stu1==stu2)……..()结构体变量的初始化(1)形式一:struct结构体名{
类型标识符成员名;类型标识符成员名;
…………….};struct结构体名
结构体变量={初始数据};例structstudent{intnum;charname[20];charsex;
intage;charaddr[30];};structstudentstu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};结构体变量的初始化(2)形式二:struct结构体名{
类型标识符成员名;类型标识符成员名;
…………….}结构体变量={初始数据};例structstudent{intnum;charname[20];charsex;
intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};结构体变量的初始化(3)形式三:struct{
类型标识符成员名;类型标识符成员名;
…………….}结构体变量={初始数据};例struct
{intnum;charname[20];charsex;
intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};结构体变量存储分配示意图stru110001020100110231026name[20]sexagescore例9.1求某同学上学期8门课程的总成绩与平均成绩。程序如下:main(){inti;
structst
{charxm[8];
floatcj[9];
floattcj,acj;}stu;
scanf(″%s″,stu.xm);/*输入*/for(i=1;i<=8;i++)scan(″%f″,&stu.cj[i]);stu.tcj=0.0;
/*求总成绩*/for(i=1;i<=8;i++)
stu.tcj+=stu.cj[i];stu.acj=stu.tcj[i]/8;
/*求平均成绩*/printf(″%s的总成绩=%6.2f,平均成绩=%6.2f″,stu.xm,stu.tcj,stu.acj);}输入数据:CHEN8086799888729666运行结果:CHEN的总成绩=577.00,平均成绩=72.13结构体类型数组结构体数组的定义三种形式:形式一:
structstudent{intnum;charname[20];charsex;
intage;};structstudentstu[2];形式二:
structstudent{intnum;charname[20];charsex;
intage;}stu[2];形式三:
struct
{intnum;charname[20];charsex;
intage;}stu[2];numnamesexagenumnamesexagestu[0]stu[1]25B结构体数组初始化与引用结构体数组初始化例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[20];charsex;
intage;};structstudentstu[]={{100,“WangLin”,‘M’,20},{101,“LiGang”,‘M’,19},{110,“LiuYan”,‘F’,19}};全部初始化时维数可省结构体数组引用引用方式:结构体数组名[下标].成员名
structstudent{intnum;charname[20];charsex;
intage;}str[3];stu[1].age++;strcpy(stu[0].name,”ZhaoDa”);例统计候选人选票structperson{charname[20];
intcount;}leader[3]={“Li”,0,“Zhang”,0,”Wang“,0};main(){inti,j;charleader_name[20];
for(i=1;i<=10;i++){scanf("%s",leader_name);
for(j=0;j<3;j++) if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;}for(i=0;i<3;i++)printf("%5s:%d\n",leader[i].name,leader[i].count);}namecountLiZhangWang000指向结构体变量的指针
指向结构体变量的指针定义形式:struct结构体名*结构体指针名;例structstudent*p;使用结构体指针变量引用成员形式存放结构体变量在内存的起始地址numnamesexagestupstructstudent{intnum;charname[20];charsex;
intage;}stu;structstudent*p=&stu;(*结构体指针名).成员名结构体指针名->成员名结构体变量名.成员名指向运算符优先级:1结合方向:从左向右例指向结构体的指针变量main(){structstudent{longintnum; charname[20]; charsex; floatscore;}stu_1,*p;p=&stu_1;stu_1.num=89101;strcpy(stu_1.name,"LiLin");
p->sex='M';p->score=89.5;
printf("\nNo:%ld\nname:%s\nsex:%c\nscore:%f\n",
(*p).num,p->name,stu_1.sex,p->score);}例intn;
int*p=&n;
*p=10;n=10structstudentstu1;structstudent*p=&stu1;stu1.num=101;(*p).num=101总结:结构体成员变量引用方式①结构体变量.成员名②(*p).成员名③p->成员名其中,->称为指向运算符请分析下列几种运算:①p->n②p->n++③++p->n指向结构体数组元素的指针例指向结构体数组的指针structstudent{intnum;charname[20];charsex;
intage;}stu[3]={{10101,"LiLin",'M',18},{10102,"ZhangFun",'M',19}, {10104,"WangMin",'F',20}};main(){structstudent*p;for(p=stu;p<stu+3;p++)
printf("%d%s%c%d\n",p->num,p->name,p->sex,p->age);}numnamesexagestu[0]pstu[1]stu[2]p+1结构体变量作为函数参数
用结构体变量的成员作参数----值传递用指向结构体变量或数组的指针作参数----地址传递用结构体变量作参数----多值传递,效率低链表概述(1)所谓链表是指若干个数据项按一定的原则连接起来。每个数据项都包含有若干个数据和一个指向下一个数据项的指针,依靠这些指针将所有的数据项连接成一个链表。每个数据项称为一个“结点”。链表概述(2)a1
a2
a3
...an^headstructstudentdatanextaistructstudent{longnum;floatscore;
sturctstudent*next};structstudent*head;1620head李为2004101850586数据项A数据项C刘娜2004102933818数据项B张三2004125950162005863818一个简单链表示例:链表的基本操作
链表的建立从链尾到链头:新结点插入到链头从链头到链尾:新结点插入到链尾链表的插入操作根据一定的条件,把新结点插入到指定位置链表的删除操作根据一定的条件,删除一个或多个结点链表的输出操作链表的查找操作建立链表操作(从链尾到链头)headai-1...④
head=p;②
p=malloc(sizeof(structnode));p->data=a[i];
①for(i=0;i<n;i++)pai③
p->next=head;建立链表操作(从链头到链尾)ai-1^...④p->next=q;②
q=malloc(sizeof(structnode));q->data=a[i];①for(i=0;i<n;i++)ai^q③q->next=NULL;p⑤p=q;链表的插入操作...aiai+1...④
p->next=q;②
q=malloc(sizeof(structnode));q->data=x;
p①
if(p满足插入条件)qx③
q->next=p->next;链表的删除操作...ai-1aiai+1...③p->next=q->next;④
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年互联网电路租赁合同(三篇)
- 2025年个人租房合租合同常用版(4篇)
- 保龄球馆装修合同范本
- 主题餐厅装修免租合同
- 专卖店吊顶装修合同
- 机场建设渣土运输协议范本
- 辽宁雕花板岗亭施工方案
- 临时承接合同范本
- 伪造员工劳动合同范本案例
- 基金托管合同范例
- GB/T 308.1-2013滚动轴承球第1部分:钢球
- 中药炮制学-第五、六章
- 中国风军令状誓师大会PPT模板
- 小儿高热惊厥精品课件
- 2023机械工程师考试试题及答案
- 2022年电拖实验报告伍宏淳
- 丰田汽车战略规划与战略管理体系研究(2021)
- 即兴口语(姜燕)-课件-即兴口语第一章PPT-中国传媒大学
- 公共政策学(第三版)-课件
- 冷却塔是利用水和空气的接触
- 我的家乡--安徽亳州.PPT
评论
0/150
提交评论