已阅读5页,还剩46页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章结构与联合 构造类型二 例7 1 将10个学生的数学成绩由高到低排序输出 example7 1 a 排序 includevoidmain void inti j k floatscore 10 temp printf pleaseenterdata for i 0 i 10 i 循环 scanf f 输出成绩 example7 1 b 排序 includevoidmain void inti j k longnum 5 temp1 定义学号一维数组 floatscore 5 temp2 定义成绩一维数组 printf pleaseenterdata for i 0 i 5 i 循环 scanf ld f 输出成绩 结构和联合的概念 在数据中 经常有一些既有联系 类型又不同的数据 并且它们之间又有一定的相关性 需要一起处理 如 学生基本档案的数据 字段 学号姓名性别地址分数类型 longchar charchar float C语言允许用户按自己的需要将不同的基本类型构造成一种特殊类型 即结构和联合 结构和联合的操作分为三个步骤 根据需要定义结构或联合类型 通过定义的类型说明变量 数组 指针 引用变量 数组元素和指针指向的对象 7 1结构变量 结构类型的定义 格式 struct结构名 type成员项1 type成员项2 type成员项n 结构标志 用标识符命名的结构类型名 结构类型中所含的成员项及其类型 structstudent longnum charname 20 intage charadd 30 floatscore 结构的定义确定了如下两点 定义结构类型 确定结构中的成员项的名称及类型 指明该结构类型的变量在内存中的组织形式 结构变量的定义 定义结构只是确定该结构类型的名称及其成员项的组成及成员项的类型 必须由定义的结构类型说明结构变量 才开辟相应的内存空间以供使用 结构变量的说明方式 定义后说明 structstudent longnum charname 20 intage charadd 30 floatscore structstudentwang zhang liu 用structstudent类型说明三个变量 定义结构类型时说明变量 wang zhang liu 无名结构方式说明变量 struct longnum charname 20 intage charadd 30 floatscore wang zhang liu 说明 注意类型和变量的区别 成员项可单独使用 wang age 20 结构变量的嵌套定义结构的成员项也可以是结构变量 structdoc charname 20 structbirthage floatsal structbirth intyear intmon intday 结构doc中的成员项是一个birth的结构变量 结构变量的使用 结构变量都是以成员项作为引用单位 引用方式 结构变量名 成员项名 wang score 100 说明 结构变量的成员项与普通变量有相同的性质 结构变量可以相互赋值 如 zhang wang 则wang的所有成员项的值赋给了zhang的对应成员项 例7 2 已知2个学生的信息 其中含有学号 姓名 出生日期 数学成绩 将数学成绩高的学生信息输出 example7 2输出数学成绩高的学生信息 includevoidmain void structdate 定义结构类型 intmonth intday intyear structstud longnum charname 20 structdatebirth floatmath 定义结构变量并初始化 structstudwang 20071234l wangjun 10 27 1990 94 structstudzhao 20074321l zhaogang 12 18 1991 85 if wang math zhao math printf ld s 2d 2d 4d 6 2f wang num wang name wang birth month wang birth day wang birth year wang math elseprintf ld s 2d 2d 4d 6 2f zhao num zhao name zhao birth month zhao birth day zhao birth year zhao math 结构体变量的初始化 结构变量可以在说明时赋初值 称为初始化 structstudent longnum charname 20 intage floatscore charaddr 30 wang 99010101L 王五 20 90 5 上海 7 3结构数组 结构变量也可以构造成数组 称为结构数组 每个数组元素都是一个结构变量 都含有结构成员项 它们在内存中的地址是连续的 数组的定义和初始化 struct结构名结构数组名 常量表达式 structstudent longnum charname 20 floatscore stud 3 说明 三个结构数组元素都含有student的成员项 结构数组名stud 代表结构数组的首地址 外部和静态结构数组在说明时可以初始化 99010101 Wang 67 5 99010102 Zhao 78 5 99010103 Fang 98 5 举例 统计三个候选人的票数 include defineNUMBER10structEle intnum charname 20 intcount lead 3 1 Zhang 0 2 Tan 0 3 Wang 0 voidmain void inti j numb for i 0 i0 lead numb 1 count elseprintf Selectionerror n printf n for i 0 i 3 i printf 5s d n lead i name lead i count 定义结构说明数组并初始化 循环输入统计票数 输出结果 example7 3将学生信息按总分成绩排序 includevoidmain void structstud 定义结构类型 charname 20 longnum floatmath floatphys floatchem floatsum structstudclass 4 temp 定义结构数组 inti j k for i 0 i 4 i 输入结构数组 例7 3 已知4个学生的信息 其中含有学号 姓名 数学成绩 物理成绩 化学成绩 求出每个学生的总分 将学生信息按总分成绩排序输出 printf enter dname i gets class i name printf enter dnum math phys chem i scanf ld f f f 7 4结构与指针 概念 指向结构变量首地址的指针称为结构指针 结构指针加一 地址加一个结构变量所占的字节 结构指针的应用 先说明结构指针structstudent p stu1 指向结构的指针 指针指向同类型的结构变量或数组 p 通过指针引用指针指向变量的成员项 引用方式为 方式一 p 成员项名方式二 p 成员项名 结构指针主要用于对结构数组操作 structstudoc intiNum char name p wang 2001 wangli p 举例 includestructsam intnum charname 20 char addr ws 101 Fang Shanghai 102 Tan Bejing 103 Wang Hefei voidmain void inti structsam pws pws ws for i 0 inum pws name pws addr 定义结构 说明数组并初始化 说明结构指针 指针指向结构数组 通过指针引用成员项 example7 4结构体的指针的利用 includevoidmain void structstud 定义结构类型 charname 20 longnum floatmath floatphys floatchem floataver structstudwang p 定义结构指针 p 例7 4 利用结构体的指针求一个学生的3门课程的平均成绩 example7 5用指针处理学生信息 includevoidmain void structstud 定义结构类型 charname 20 longnum floatmath floatphys floatchem floatave structstudclass 4 p 定义结构数组和结构指针 for p class p class 4 p 输入结构数组 例7 5 已知4个学生的信息 其中含有学号 姓名 数学成绩 物理成绩 化学成绩 求出每个学生的平均成绩 要求用结构体的指针实现 printf entername gets p name printf enternum math phys chem scanf ld f f f 5结构与函数 以下介绍 1 结构体变量作为函数参数 用结构体变量作为函数参数时 形参和实参必须具有相同的结构 即必须保持数据类型的一致性 这种传递方式属于 值传递 即将实参结构变量各成员项的值一一对应赋给形参结构变量的各成员项 实参结构变量和形参结构变量分别占有各自的存储空间 2 指向结构体变量的指针作为函数参数 用结构体指针作为函数参数时 形参和实参必须是具有相同的结构的指针 这种传递方式属于 地址传递 即实参结构的地址和形参结构的地址占有相同的存储空间 通过共享的方式实现数据的传递 具体可以利用指向结构体的指针或结构数组实现 例 includevoidmprintp structstudent structstudent longnum char name floatscore voidmain structstudents1 s1 num 99010101 s1 name wanghai s1 score 99 mprintp 指向结构的指针 voidmprintp structstudent s1 structstudentsv sv num sv name sv score 结构变量 example7 6用结构变量作为函数参数 includestructstud 定义结构类型 charname 20 longnum floatmath floatphys floatchem floatave voidoutput structstud 函数的原型声明 voidmain void 例7 6 已知1个学生的信息 其中含有学号 姓名 数学成绩 物理成绩 化学成绩 由主函数实现数据的建立 再用子函数实现数据的打印 要求用结构体变量实现数据的传递 structstudss 定义结构变量 printf entername 输入结构变量 gets ss name printf enternum math phys chem scanf ld f f f example7 7用结构指针作为函数参数 includestructstud 定义结构类型 charname 20 longnum floatmath floatphys floatchem floatave voidoutput structstud 函数的原型声明 voidmain void 例7 7 将例7 6程序的数据传递方式改为用结构体指针实现 structstudss p 定义结构指针 p 返回结构变量的函数 当函数的返回值为一个结构变量时 称该函数为一个结构型函数 structstusv void structstut returnt 函数的类型 即返回值是结构变量 例题返回结构的函数 includestructstu longnum charname 10 floatscore structstusv void voidmain void structstuws ws sv printf ld n s n f n ws num ws name ws score structstusv void structstustemp charstr 20 gets stemp name gets str stemp num atol str gets str stemp score atof str return stemp 返回结构指针的函数 当函数的返回值为一个结构指针时 称该函数为一个结构指针型函数 includestructstu longnum char name floatscore sa 99010101 fun 89 99010102 zhang 99 99010103 wang 78 0 0 0 structstu findp long voidmain longlsanum inti structstu sap printf Enterthenumber scanf ld structstu findp longnumber inti for i 0 sa i num 0 i if sa i num number break return example7 8查找学生的信息 include include includestructstud 定义结构类型 charname 20 longnum floatmath floatphys floatchem 例7 8 已知4个学生的信息 存放在结构数组中 每个学生的信息含有学号 姓名 数学成绩 物理成绩 化学成绩 编写3个子函数 1 生成子函数 负责结构数组的建立 2 查找子函数 负责查找学生信息 如果有则返回其结构指针 没有则返回空地址 3 打印子函数 负责打印学生信息 structstudclass 4 定义结构数组 voidcreat void 函数原型声明 structstud search char voidoutput structstud voidmain void 主函数 charnn 20 structstud temp printf pleaseentername gets nn 输入查找的姓名 creat 调用生成子函数 temp search nn 调用查找子函数 if temp NULL output temp 找到调用输出子函数打印 elseprintf notfound voidcreat void 生成子函数 inti for i 0 i 4 i 输入结构数组 printf enter dname i gets class i name printf enter dnum math phys chem i scanf ld f f f structstud search char mm 查找子函数 structstud p for p class pname 0 return p 找到返回结构指针 returnNULL 没找到返回空指针 voidoutput structstud q 输出子函数 printf 10s ld 6 1f 6 1f 6 1f n q name q num q math q phys q chem 6动态内存与链表 在前面的各章节中 介绍的各种数据类型 如整型 实型 字符型 数组 指针 一经说明 系统则为此变量开辟相应字节的内存单元 用以存放此变量的数值 在变量的生存期内此变量都将占有此内存单元 直至生存期结束后 系统回收相应的内存单元 在这种方式中内存的分配和回收工作由系统进行 用户无权参与 因此用结构数组表示全班每个学生的基本信息时 如果事先难以确定班级人数 编程人员都会适当放一些余量 将结构数组定义的足够长 否则如果使用中出现了超出长度的情况就无法存储和处理 显然这将浪费存储空间 另一方面数组在内存中需要开辟大片地址连续的存储空间 当数组较长或结构数组中的信息较多时 需要的连续的存储空间则较长 这势必增加内存的压力 同时造成内存中一些离散的较小的存储空间的浪费 1 内存分配函数 链表的操作需要开辟内存单元以便插入或追加节点 删除节点后需要释放节点占用的内存单元 C语言提供了相应的函数 malloc函数 使用方法 ptr malloc size 分配内存的字节数 返回空类型的指针 成功 返回内存的地址 失败 返回NULL void ptr ptr malloc sizeof int ptr voidfree ptr 作用 释放ptr指向的由malloc分配的内存空间 2 动态内存与链表的基本概念 引用自身的结构和链表的概念 结构中的某个成员项 为指向该结构类型自身的指针 则称为引用自身的结构 structstudent intnum floatscore char name structstudent next 指向自身的结构 相同类型的结构指针 链表是一种动态存储分配结构 通过指针相连 数据可以不连续存放 head 结构变量 NULL 链表 head 2000H 2000H 2400H 2400H NULL tail 链表的操作 建立链表 步骤 定义引用自身的结构 说明指向结构的指针 head 头指针 tail 尾指针 iinclude includestructslist charinfo structslist nextp voidmain void structslist head tail find charc d head tail structslist malloc sizeof structslist head nextp NULL headtail NULL while c getchar n tail append tail c 在尾部追加节点 步骤 为新节点分配内存 建立新节点的成员项 建立链接关系 structslist append structslist ptr charc structslist p p structslist malloc sizeof structslist p info c p nextp NULL ptr nextp p return p headtail NULL p NULL tail tail 删除节点函数 voidcdelete structslist pcdel structslist p p pcdel nextp pcdel nextp pcdel nextp nextp free p p 思考题 编写一个函数 在当前指针位置插入节点 example7 9链表的操作 include include defineLENsizeof structstud structstud 定义链表结构类型 longnum floatscore 定义链表结构数据域 structstud next 定义链表结构指针域 structstud head head为链表的头指针 voidcreat 函数的原型声明 voidinsert voidsearch voiddelete voidoutput 例7 9 以上简单介绍了链表的几个常用的操作 采用主函数将它们合理的组织起来 共同实现对链表的综合处理 voidmain void 主函数 intk do printf 0 exit n 打印菜单项 printf 1 creat n printf 2 search n printf 3 insert n printf 4 delete n printf 5 output n printf pleaseselect scanf d 7 7联合 union 概念 不同数据类型的集合 每个成员项共用一段内存空间 某一时刻只能对一个 活的active 成员项操作 联合类型的定义 格式 union联合名 type成员项1 type成员项2 type成员项n unionexam inta floatb charc 联合变量的说明和使用 可以用联合类型说明 联合变量 联合数组 指向联合指针 unionexamx px y 10 引用 引用变量的成员项 通过变量引用 变量名 成员项名通过指针引用 指针 成员项名 联合与结构的区别 structexam inta floatb charc x x a b c unionexam inta floatb charc x x b a c 结构变量的每个成员项有独立的内存单元 而联合变量的成员项以最大的成员项开辟单元后 所有成员项共用单元 sizeof structexam 举例 includevoidmain void unionexam inti charch 2 x x i 24897 i 0 x6141 printf i xH n x i printf ch 0 xH ch 1 xH n x ch 0 x ch 1 printf ch 0 c ch 1 c n x ch 0 x ch 1 0 x41 0 x61 ch 0 ch 1 i x example7 10联合体变量的利用 include includestructmess 定义结构体类型 charname 10 intage charjob union 定义联合体类型 intiClassId charposition 10 cate person 2 定义结构数组 例7 10 建立学生和教师信息库 其中含有 姓名 年龄 职业 单位 如果职业为教师 则单位为其所在的单位名 如果职业为学生 则单位为其所在的班级名 可用联合体实现 voidmain void inti charchTempBuff 10 for i 0 i 2 i printf pleaseentername message gets person i name 输入姓名 printf pleaseenterage message gets chTempBuff 输入年龄 person i age atoi chTempBuff printf pleaseenterjob message gets chTempBuff 输入职业 person i job chTempBuff if person i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年甘肃省陇南市武都区四校联考高三上学期9月月考语文试题
- 2025-2026年江苏省部编版高二地理第5章自然地理练习题
- 2025-2026年法学本科宪法学课后练习题
- 2026年江苏省人教版三年级英语第9课Colors词汇巩固习题课件
- 八年级语文上册期中试卷真题
- 坚守初心-勇担使命-凝心聚力建设全面一流的教师队伍-在“我和我的农大”教授恳谈会上的讲话
- 2026年大象版五年级科学上册 5.5传染病与生命安全(课件)
- Unit 8 Let's Communicate Section A (1a~1d) 同步练习人教版英语八年级上册
- 外贸笔试题翻译题及答案
- 危险化学品从业人员安全培训考核试卷答案及答案
- T∕CEC 212-2019 电动汽车交直流充电桩低压元件技术要求
- 初一英语补习资料(一)
- 无神论宣讲少先队活动
- 购销合同范本预付款
- 既有建筑混凝土结构改造设计规范DBJ-T 15-182-2020
- 2024年全国高考体育单招考试语文试卷试题(含答案详解)
- IE方法实戢精解
- 幼儿园小班音乐游戏《大猫小猫》课件
- 手电筒看见了什么
- 换电重卡行业深度报告
- LY/T 2010-2012自然保护区生态旅游设施建设通则
评论
0/150
提交评论