版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言程序段计第 9 章结构体及其应用:学习目标e 掌握构造类型一结构体类型及其使用学习内容e 结构体类型及其定义结构体变量的定义及使用e 结构体数组的使用结构体指针的使用c 链表及其基本操作9.1一个程序实例【例9-1】一个学生的信息包括学号、姓名、平时成绩、期末 成绩和总评成绩,其中总评成绩的计算公式为:总评成绩二 平时成绩X30%+期末成绩X70%o根据给定的平时成绩和期 末成绩计算总评成绩,并输出学生的信息。 根据本题的情况,用以下形式构造名为student的结构体 类型。struct student/ *st udent为结构体类型名*/ int num;/*学号为“代型*/char
2、 name| 10|/*姓名用字符数组*/float si, s2, score;/*3个成绩为片“丸型*/; struct student是一种结构体类型,它由 5 个数据 项组成,此处的数据项称为结构体成员或者域。接 下來可以用 struct student这个数据类型定义变量, 只有变量才能存储数据。例如,下面语句定义了 一个结构体变量:struct student wang;:彎构怦量中成员的引用形式为:结构体变 量成员名。 比女口: wang.num、 wang name wang. si等。结构体成员在程序中的作用和用 法与普通变量相同。【程序代码】【程序代码】#include s
3、tdio.hinclude string.h”struct student广定义结构体类空*/int num;char name(10;float s1ts2.score:;main()struct student wang;/定义结构体变广以卜给变赧名为wang的学生賦值Vwan g.num=101;strcpy(,*wanghaiH):wang.s1=92.0;wang.s2=87.5;wang.score-wang.sV0.3+wang.s2*0.7;广计林总评成纟/ 广以卜输出该学生信息/printfCNO.:%dnw,wang.num); printf(MNAME:
4、%snM,);printf(Ms1-%7.2f,s2-%7.2f.score-%7.2fnn,wang.s1,wang.s2.wang.score); 程序输出结果为:o.:ieiA HE: zngha 11-87.5D八c。88 859.2结构体类型的使用一组相关的数据可能是相同类型的, 也可能是不同类型的。为了封装相关的 数据,就需要采用可以包含不同类型成 员的类型来定义这样的数据,这种类型 就是结构体类型。9.2.1结构体类型的定义定义结构体类型的一般形式为: struct 结构体类型名类型名 1 成员名 1;类熨名 2 成员名 2;类型名 1 成员名 1;例如:str
5、uct stud int num; char name20; char sex; int age; float score3; char address30;;注意事项:(1 ) struct是关键字,标志结构体类型。struct后 面是所定义的结构体类型的名字,结构体名应符 合标识符的命名规则。这里结构体名可以省略, 省略后将成为无名结构体。(2)结构体的各个成员用花括号括起来,结构体 成员的定义方式和变量的定义方式一样,成员名 的命名规则和变量相同;各成员之间用分号分隔; 结构体类型的定义以分号结束。(3)结构体成员的数据类型可以是基本类型的, 也可以是构造类型,如数组或其他结构体类型。9
6、.2.2结构体变量的定义及引用:结构体变量的定义(1)先声明结构体类型再定义变量名j 列如struct stud广定义结构体类型*/ int num;char name20;char sex;int age;float score3;char address30;;struct stud student1,student2;广怎义结构体变虽/结构体变最 student 和 student2 屮各成员的賦值宿况如图所示。numnamesexscotepscotep)eddxess101皆13乃.4893P25z”102M11695 19992 疋义结构体类空的同时怎义结构体变怎这种方法定义的一般
7、形式为:struct结构体名成员表列变疑名表列;例如,I.面的结构体类型struct stud也口J以采取以下形式定义:struct stud int num;char name20;char sex;int age;float score3);char address30; student1=101 /,ghzn,M,18,75.4,;,xianH,student2;这里只对变Mstudentl进行了赋初值操作。霜酪结构体类型的同时定义结构体变量即不出现般定义形式为:struct成员表列变量名表列; 例如:structint num;char name20;char sex
8、; int age;float score3; char address30; student1,student2;:结构体变量中成员的引用结构体变量本身不能代表一个特定的值,只 有它的成员才会有特定的值。因此使用结构体变 量时,要引用其成员。结构体变量中成员的引用 形式是:结构体变量成员名例如, 结构体变量studentl中各个成员引用形式 如下:studentl.num、student 1.name、student 1.sex、studentl .age、studentl .addressstudent1score0、studentl .score1 、studentlscore2结构体类
9、型嵌套以上给出的例/中,结构体成员的类型都足基本类型和数组类 型。实际上,成员的类型可以足任何数据类些。下而给出成员类型 是另-个结构体类型的例子。例如:struct date/* 日期结构*7int year;int month;int day;struct studentint num;char name20;char sex;int age;struct date birthday; /* struct date为结构体类型*7char address30);stu=102;,xhy,;M,16,1977,5,8,HbeijingH;9.2.3结构体数组:*在例中一个结构体变量只能处理一
10、个人的信息(如一个 学生的学号、姓名、成绩等数据)。但在实际应用中经常需 要处理一批人的信息,这时应该使用结构体类型的数组。定 义结构体数组与定义结构体变量的方法相同。例如:struct studentint num;char name20;char sex;int age;float score;char address30; stu3J;【例92】候选人得票统计程序。设冇3个候选人,10个投票人,输入得票人的名字并进行统 计,谥后输出各人得票结果。【程序代码】include string.hinclude stdio.hstruct personcharname20;广候选人姓名/int
11、count;广候选人票数/leader(3=wstar-.O.Mmeryn.O. sunM.O):广定义结构体数细井初始化/main()int i.j;char leadername20;for(i=1 ;iv=10;i+)scanf(R%sw,leader_name);for(j0;jv3;j+)if(strcmp(leader_name,)-0)广比较输入的劣字与仗选人的名字,leaderj.count+;/*相为于leaderj.count= leaderj.count +1 ;*/printf(W);for(i=0;i3;i+)prin tf(%5s:%dnM,
12、leaderi. nameleaderi.count);9.2.4结构体指针结构体指针是指基类型为结构体类型的指针 变量。通过结构体指针可以间接访问结构体 中的成员。【例 93】使用结构体指针输出学生基本信息。 【程序代码】#include string.h”include stdio.h” main()struct student/*定义一个结构体类空/long num;char namc20;char sex;float score;;struct student stu/p;r定义结构体变ftslu和结构体指针p 7p=&stu;/*结构体指针pJ旨向结构体变量stu */stu
13、.num=101;strcpy(,MXuhuayuM);stu.sex=,M,;stu.score=90.0;printf(HNo.:%ldn name:%s nsex:%c nscore:%frr,stunum,stuname,stusex,stuscore);pnntf(HNo.:%ldnname:%snsex:%cnscore:%fnM,(*p).num,(*p).name,(*p).sex,(*p).score);:程序分析:程序中将结构体变量Stu的地址赋给指针变量p,也就是便p指向Stu,然后对Stu的容成员赋值, 第一个printf(j函薮输出stu葩畧个戒员舸值
14、,第 二个printf譎数也是用乗输出stu各成员的值,彳旦 使由俯是Cp).num这梓的形衣。:通过结构体指针引用成员的方式有两种:1CP)成员名2p成员名(。为指向运算符)指针变量可以指向结构体变量,当然也可以指向 结构体数组,其使用方法与指向数组的指针的使 用方法类似,只不过把普通数组换成了结构体数 组。【例94】 使川指向结构体数组的指针实现多名学生信息的输出。 【程序代码】#includeHstdio.htfstruct student int num;char name20;char sex;int age;struct studentstu3=101 ,”Xuhy;M;18,10
15、2/Liuhm,M194103/LpH;F,20;main()struct student *p;厂定义结构体指针*/printf(HNo. Name sex agenM);for(p=stu;pnum,p-name,p-sex,p-age);9.3链表 9.3.1链表的基本结构链表是一种动态数据结构,可根据需要动态 地开辟存储空间,随时释放不再需要的存储空间。 这样可以有效利用存储空间,提高存储空间利用率。 下图是一种单向链表结构示意图。head1658254610241236:链表中的每个元素称为链表的结点,每个结 点中包括两部分内容,即用户需要的数据和 下一个结点的地址,也就是说,链表中
16、的每 个结点是由数据域和指针域组成。在链表中通常用一个指针指向链奏开头的结 点,该指轩祿为头指针。囱9-3卸h ead即気 头指针,它指向第一个结点。:单向链表中前一个结点的指针域指向后一个 结点,这梅苛以通过前一个结点引用洁一个 结点。最后一个结点不再指向其他结点,称 为尾结点(即表尾),卫的指针域的值是NULL(空指针),表示整个链表到此结束。【例9-5】建立一个简单链表,它由3个存放学欝囂杲夢翥f姓名)的结点组成10510577.577.5NULLNULL【程序代码】include stdio.h” struct nodeint num;r存储学生学号/float score;/*存储学
17、生成绩7struct node next;/*圧义结构体指指向卜个绊点;main()struct node a,b,c,*head/p;a. num=101:a.score=85.4;r给结点a的num和score域赋ftV/b. num=103;b.score=96.1;r给结点b的num和score域赋值Vc. num=105;c.score=77.5;/* 给结点c的num和score域奴值 */head=&a;/头指针head指向结点aTa. next=&b;/*链接结点b和a结点/b. next=&c;/*链接结点c和b结点c. next=NULL; /*结点
18、c为尾结点 Tp=head; /S 史P指针指向第1个结点/do/依次输出丼结点数据/printf(M学巧二滋成纟贞:%5.2fn,p-num,p-score);p-p-ext; /指针p后移.指向卜一结点/Jwhile (p!NULL); 9.3.2链表的基本操作1.动态分配和释放存储区动态开辟存储空间需要使用malloc()函数,释 放存储空间使用free()函数。这些函数包含在头文 件”stdlib.h”中。(1) malloc()函数函数调用的一般形式为:malloc(size)功能:在内存申请分配一个size字节的存储区。调 用结果为新分配的存储区的首地址,是一个void*类型指针,
19、若申请失败,则返回NULL。例如:struct node *p;p=(struct node *)malloc(sizeof(struct no de);上面语句中sizeofMC语言的运算符,功能是计算数据类型 或变量所占的字节数,sizeof(struct node)是计算struct node类型所占的字节数,那么malloc(sizeof(struct node)的功能是申请分配一个struct node类型所需大小的存储区。 由于malloc()的返回值是无类型指针,而指针p的基类型是struct node类型,因此需要进行强制类型转换,将malloc()函数的返回值转换为指向str
20、uct node类型的指针。(2) free()函数函数调用的一般形式为:free(p)功能: 释放指针p所指向的动态存储区。2.建立单向链表建立动态链表是指在程序执行过程中从无到有地 建立起一个链表,即一个一个地开辟结点和输入 结点数据,并建立起前后链接关系。【例9-6】建立链表函数。建立一个有若干名学 生数据的单向动态链表,当输入的学生学号 为0时结束操作。int num; float score; struct node 5ext;:struct node *create()struct node *head/s/p;int c:float x;head(struct nodett)ma
21、lloc(sizeof(struct node);/I成头結点/p=head;向第个结点/print-, glj输入结来:E);scanf(-%d%r.&c.&x);/输入学生数抵 */while (c?=0)s=(struct node#)malloc(sizeof(struct node); /生成新结点s*/ s-num=c;/将读入的孚生学号存放到新结点s的数撫域中s-score-x;广将渎入的学生成细仔放到新給点s的数抄;域中丿p-next=s;广将新給点s插入到駁兀/p=s;/修改尽折针p抵向为询的用结点/scanf(R%d%r.&c.&x);rE入
22、新的学生数据/p-nexUNULL;广轲册肩个结点的指什域?为空return(head);广返冋头【程序代码】#include stdio.hinclude ” stdlib.h”struct nodehead3.输出链表【例97】输出链表函数。【程序代码】void print(struct node *head)struct node *p;printfCM输出学生结点信息n”);p=head-next;广指针p指向第1个结点*/while (p!=NULL)printf(”学号:d成绩:%5.1fn,p-num,p-score);p=p-next;广指针p后移,指向下一结点74删除链表中的
23、结点从链表中删去一个结点,首先要找到这个结点,然后把它从链表中分 离开來,撤销原*的链接关系,同时保证原有链衣的链接关系。【例9-8】删除结点函数,删除链表中学号为num的结点。【编程思路】(1)删除结点操作分两步完成。第一步查找要删除的结点,第二步进 行删除。(2)查找结点时,从p指向的第一个结点幵始,检查该结点中的num值足否等于输入的要求删除的那个学号,如果相等,就找到了要删 除的结点,如不和等,就将p后移一个结点,直到找到要删除的结点 或者遇到链尾为止。在移动p的同时移动6 使用q记录P的前驱结点, 如图9-6(a)所示。(3)找到待删除结点后,使q指向要删除结点p的后继结点,如图96
24、(b)所示,然后释放结点p的内存空间,如图96(c)所示。【程序代码】struct node *del(struct node *head,int num) struct node *p,*q;q=head;p=head-next;while(num!=p-num&p!=NULL)q=p;p=p-n ext;if(num=p-num)q-next=p-next;free(p);elseprintfC 没有找到学号为d 的结点! nnum); return(head);5.在链表中插入结点对链表的插入是指将一个结点插入到一个已 有的链表中,为了能做到正确插入,必须解 决两个问题:如何找到
25、插入的位置;如何实 现插入。【例9-9】插入结点函数。假定原链表结点已经按学号从小到大排列。struct node *ins(struct node *head,int c,float x)struct node *p,*q,*s;s=(struct node *)malloc(sizeof(struct node);广生成新结点 s*/ s-num=c;广将耍插入的学牛学号存放到新结点 s 的数据域中/ s-score=x;广将耍插入的学生成绩存放到新结点 s 的数据域中/ q=head;p=head-An ext;while (p!=NULL&cp-num)q=p; p=p-nex
26、t;q-next=s; if(p!=NULL) sn ext=p;elses-n ext=NULL; return(head);程序分析:首先定义一个新结点存储待插入的结点信息(如 图97中的结点s),从指针p指向第一个结点开 始, 将p-nu【程序代码】口与时目比较,如果cp-num,将p后移,并使q始终指向p的前驱结点,如图9-7(a)所示,直到p-num-c为止,这时找到新结点的 插入位置。如果插入位置是链表的尾部,将新结点插到链尾 即可。如果插入位置在链表中间, 则让s-next指向p结点, 如图9-7(b)所示,然后让qnext指向s结点,如 图9-7(c)所示。9.3.3链表综合应
27、用【例910】编制主函数.调用链表建立函数,输出函数,删除函数及插入函数,完 成链农的基木操作。【程序代码】main()struct nodo *h;int del_num,in_num;float in score;h=create();广建立链表/print(h);/*输出链农7printfC*n输入要删除的学生结点的学号:rT); scanf(M%dK,&del num);h=del(h,deLnum);广删除链表结点/print(h);广输出链0/printf(Mn输入耍插入的学生结点信息:iT);scanf(%d%fH,&in_num&n_score);h=i
28、ns(h,in_num,in_score);/插入结点/print(h);/嘯出链表*/程序运行过程为:.学号为p时揄入结宏,镐岀*住纟吉点佶息 2 人应巒8S.0,嚴臺缠.12匕成堪,3说绩.95.088.DGS. A输出学些结点信息I,1.比逸*S5-0 a 95.0I 1”成纽h 65.U9.4结构体应用实例【例910】 某班有45名学生, 现在对他们的期末考试 成绩进行统计。假定期末考3门课,分别为物理、 数学和化学,要求计算每个学生的平均成绩和总成 绩,最后计算本班每门课的平均成绩。【编程思路】(1)木程序分成三部分: 学生数拯输入 (包扌舌计算学生平 均成绩和总成绩)、学生成绩单输
29、出、本班每门课总成 绒和平均成绩的计算和输出,分别由三个函数來实现, 在主程序中调用这三个函数。(2)定义结构体来存储学生数据,包括学生基木信息,学 生三门课成绩(利用数组),平均成绩,总成绩。(3)将结构体数组地址作为实参传递给函数,以便在函数 中使用结构体指针对学生数据进行操作。(W代码】律include stdio.h*#include conio.h*#include string.h常define NU 3/*以3名学牛为例*/struct studentlong num;/定义成员变敏.存储学生学号/char name(10;广定义成员变f乙 储学生姓名/float score3;广定义成员变仃储学门课的成绒/float aver_person;/疋义成员变爪储学生平均成绩/float sum_person;/定义成 8 变仔储学生总成绒/;void print(structstudent *p)/输出个人成纟列I/int i;for(i0;inum); printfOtirt:幺x %sn*.p-name); printfCVt数学4 %5.1f | p-score0);printf(物理:%5.1f p s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 校本课程国际课程设计
- 2025年山东淄博市市属事业单位综合类岗位招聘工作人员65人历年管理单位笔试遴选500模拟题附带答案详解
- 2025年山东济宁市属事业单位“优才”选聘历年管理单位笔试遴选500模拟题附带答案详解
- 年会董事长致辞
- 2025年山东济南市槐荫区所属事业单位招聘51人历年管理单位笔试遴选500模拟题附带答案详解
- 2025年山东济南信息工程学校招聘人员17人管理单位笔试遴选500模拟题附带答案详解
- 2025年山东枣庄工程技师学院招聘备案制工作人员30人管理单位笔试遴选500模拟题附带答案详解
- 2025年山东文化厅所属事业单位招考工作人员管理单位笔试遴选500模拟题附带答案详解
- 机械原理课程设计网球
- 微课程设计花钟
- 个人租房合同协议书(5篇)
- 新修订中华人民共和国行政许可法全文解读学习
- 广东省广州市花都区2024年七年级上学期期末数学试题【附答案】
- 期末测试模拟练习 (含答案) 江苏省苏州市2024-2025学年统编版语文七年级上册
- 上海市徐汇区2024-2025学年高一语文下学期期末试题含解析
- 品质年度总结及来年计划
- 学生体质健康存在的主要问题及改进措施
- 2024年执业药师资格继续教育定期考试题库(附含答案)
- 建筑幕墙工程检测知识考试题库500题(含答案)
- 钢棚钢结构施工方案
- 新版第三类医疗器械分类目录
评论
0/150
提交评论