结构体和其他构造类型.ppt_第1页
结构体和其他构造类型.ppt_第2页
结构体和其他构造类型.ppt_第3页
结构体和其他构造类型.ppt_第4页
结构体和其他构造类型.ppt_第5页
已阅读5页,还剩114页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章结构体和其他构造类型 8 1结构体类型变量的定义和使用8 2结构体和函数调用8 3提高部分 例题链接 例题链接 例8 1 例8 2 例8 3 例8 4 例8 5 例8 6 例8 7 例8 8 例8 9 例8 10 例8 11 例8 12 例8 13 8 1结构体类型变量的定义和使用 8 1 1结构体类型的概念和声明8 1 2结构体类型变量的定义和使用 P250 8 1 1结构体类型的概念和声明 1 结构体类型的概念把不同类型的数据组合在一个类型中 作为一个整体进行处理 结构体类型 P250 要表示日期structdate intyear month day 要表示学生情况structstudent charname 20 number 9 floats1 s2 s3 结构体类型 2 结构体类型的声明结构体类型声明 struct结构体名 类型名1成员名表1 类型名2成员名表2 类型名n成员名表n 关键字 也称 域 8 1 2结构体类型变量的定义和使用 例8 1 假设学生基本情况包括学号和两门课成绩 编写程序计算某学生两门课的平均成绩 并输出该学生的有关信息 P251 声明结构体类型structex1 longintnum floats1 floats2 等价于floats1 s2 编程点拨 在主函数中定义 structex1 类型变量wang和 float 类型变量ave main floatave 0 structex1wang 就象float int型一样使用 计算平均成绩并通过变量wang输出有关信息 main floatave 0 structex1wang wang num 1000101 wang s1 89 5 wang s2 90 ave wang s1 wang s2 2 printf 10ld 8 1f 8 1f 8 1f n wang num wang s1 wang s2 ave ave占4个字节 wang占多少字节 main floatave 0 structex1wang wang num 1000101 wang s1 89 5 wang s2 90 ave wang s1 wang s2 2 printf 10ld 8 1f 8 1f 8 1f n wang num wang s1 wang s2 ave wang num s1 s2 4字节 4字节 4字节 1000101 89 5 90 0 12字节 main floatave 0 structex1wang wang num 1000101 wang s1 89 5 wang s2 90 ave wang s1 wang s2 2 printf 10ld 8 1f 8 1f 8 1f n wang num wang s1 wang s2 ave wang num s1 s2 1000101 89 5 90 0 等价于 structex1wang 1000101 89 5 90 0 main floatave 0 structex1wang wang num 1000101 wang s1 89 5 wang s2 90 ave wang s1 wang s2 2 printf 10ld 8 1f 8 1f 8 1f n wang num wang s1 wang s2 ave ld f f 例8 2 假设学生基本情况包括学号和多门课成绩 计算某学生的平均成绩 defineN3structex2 longintnum floats N 要处理的成绩较多时 main structex2wang p floatave 0 sum 0 x 0 inti 0 p 等价于wang num printf 学号 ld n p num for i 0 is i printf 8 1f p s i printf n ave sum N printf 平均成绩 1f ave 等价于 p num wang num s 0 s 1 s 2 p p 结构体变量名 成员名 指针变量名 成员名指针变量名 成员名 例8 3 设有5名学生 而且每位学生基本情况都包括学号和多门课成绩 计算各学生3门课平均成绩 defineN3structex2 longintnum floats N main structex2stu 5 floatave 0 sum 0 k 0 inti 0 j 0 for i 0 i 5 i scanf ld for i 0 i 5 i printf 10ld stu i num sum 0 for j 0 j N j printf 8 1f stu i s j sum sum stu i s j ave sum N printf 8 1f n ave 注此行的位置 stu 0 stu 1 stu 2 stu 3 stu 4 num s 0 s 1 s 2 各学生平均分 86 2 67 7 64 2 81 0 91 5 例8 4 假设学生基本情况包括学号和五门课成绩 找出某学生五门课成绩中的最高成绩 structex3 charn 10 floats 5 将学号定义为字符串 main structex3wang 1000101 89 5 90 0 79 0 99 0 69 0 floatmax 0 inti 0 for i 0 i 5 i if max wang s i max wang s i printf s号学生 5 1f wang n max scanf s wang n 功能 gets wang n 功能 strcpy wang n 1000101 功能 puts wang n 功能 能否用wang n 1000101 例8 5 假设学生基本情况包括学号和英语 C程序设计 数学三门课成绩 输出五个学生中 数学成绩最高的学生所有信息 structex4 charn 10 floats 3 main structex4stu 5 1000101 89 5 90 0 79 0 1000102 68 0 80 0 55 0 1000103 56 5 59 0 77 0 1000104 81 0 88 0 74 0 1000105 90 5 95 0 89 0 inti 0 k 0 for i 1 i 5 i if stu k s 2 stu i s 2 k i printf s号学生 n stu k n for i 0 i 3 i printf 5 1f stu k s i 1000105号学生90 595 089 0 8 2结构体和函数调用 结构体类型变量的成员作实参 例8 6 结构体类型变量的成员作实参示例 structex2 longintnum floats 3 P257 long型 实型数组名 voidmyfun1 longintnum float p wang num s p num p p 1 p 2 1000101 printf 学号 ld 成绩 num for i 0 i 3 i printf 5 1f p i printf n 100010189 590 079 0 wang num s p num p p 1 p 2 1000101 voidmyfun1 longintnum float p inti 0 将 wang num作实参 如何修改 结构体类型变量作实参 例8 7 结构体变量作实参的示例 structex2 longintnum floats 3 voidmyfun2 structex2xiaowang xiaowang num 1000105 xiaowang s 2 95 5 main structex2wang 1000101 89 5 90 0 79 0 inti 0 myfun2 wang printf 学号 ld 成绩 wang num for i 0 i 3 i printf 5 1f wang s i printf n num s 100010189 590 079 0 wang xiaowang num s xiaowang num 1000105 1000105 xiaowang s 2 95 5 95 5 结构体类型变量地址作实参 例8 8 结构体变量地址作实参的示例 structex2 longintnum floats 3 voidmyfun3 structex2 p p num 1000105 p s 2 95 5 main structex2wang 1000101 89 5 90 0 79 0 inti 0 myfun3 printf 学号 ld 成绩 wang num for i 0 i 3 i printf 5 1f wang s i printf n myfun3 voidmyfun3 structex2 p 1000105 95 5 结构体类型数组名作实参 例8 9 结构体类型数组名作实参的示例 structex2 longintnum floats 3 voidmyfun4 structex2 p inti 0 floatk 0 structex2 q NULL for q p qnum for i 0 is i k main inti 0 j 0 structex2stu 5 0 myfun4 stu for i 0 i 5 i printf ld号学生成绩是 stu i num for j 0 j 3 j printf 5 1f stu i s j printf n 8 3提高部分 8 3 1结构体的进一步讨论8 3 2链表 P261 8 3 1结构体的进一步讨论 在一个结构体类型中可以含有另一个结构体类型 P261 例8 10 内嵌结构体类型的示例 structdate inty intm intd structstudent charname 10 structdatebirthday floats 3 main structstudentLi LiLan 1982 12 25 88 75 85 5 printf s n Li name printf d d d n Li birthday y Li birthday m Li birthday d printf f f f n Li s 0 Li s 1 Li s 2 LiLan 1982 12 25 88 000000 75 000000 85 500000 y m d s 0 s 1 s 2 name birthday s 要改为1985 Li birthday y 1985 y m d s 0 s 1 s 2 name birthday s 要改为10 Li birthday m 10 y m d s 0 s 1 s 2 name birthday s 要输入值 scanf d y m d s 0 s 1 s 2 name birthday s 要改为5 p birthday d 5 p p birthday d 5 y m d s 0 s 1 s 2 name birthday s 要输入值 p scanf d scanf d 声明可改为 structstudent charname 10 struct inty intm intd birthday floats 3 例8 11 内嵌结构体类型为本结构体类型的示例 includestructlst intnum structlst next 能指向structlst类型变量 a num 1 a next b num 2 b next c num 3 c next NULL p printf 4d p num main structlsta b c p 1 2 3 0 p 1 a b c num next num next num next a num 1 a next b num 2 b next c num 3 c next NULL p printf 4d p num main p p next printf 4d p num 1 2 3 0 p 1 2 structlsta b c p a b c num next num next num next a num 1 a next b num 2 b next c num 3 c next NULL p printf 4d p num p p next printf 4d p num main p p next printf 4d p num 1 2 3 0 p 1 2 3 structlsta b c p 8 3 2链表 链表的概念 P264 非空链表结构 head 头结点 结点1 结点2 尾结点 0 8 3 2链表 链表的概念 P264 链表特点 所有结点为相同结构体类型 至少一个成员为指针 该指针基类型与链表结点的类型相同 需解决问题 1 建立链表 2 输出链表中各结点的值 3 在链表中插入一个结点 4 删除链表中的一个结点 动态开辟和释放函数 malloc calloc realloc 动态开辟函数 释放函数 free include 例8 12 动态开辟和释放存储单元的示例 include include main int p NULL p int malloc 2 if p NULL printf 4d p free p p p 6 p 6 6 例8 12 动态开辟和释放存储单元的示例 include include main int p NULL p int malloc 2 if p NULL printf 4d p free p p int malloc sizeof int if p NULL printf 4d n p free p p 38 p 6 6 p 38 38 p int sizeof 动态链表 例8 13 调用函数完成链表的建立 输出各结点的值 插入和删除一个结点的功能 具体要求 调用mycreat函数 建立链表调用myinsert函数 插入一个结点调用mydelete函数 删除值为m的结点调用myprint函数 输出各结点 1 声明结构体类型 structlst intnum structlst next typedefstructlstLST 可用LST代替structlst 2 编写主函数 并先用空函数占被调函数的位置后测试 include includetypedefstructlst intnum structlst next LST LST mycreat voidmyprint voidmyinsert intmydelete main LST head NULL intk 0 m 0 choose 0 head mycreat printf 新建链表为 myprint head printf 请选择 1 插入2 删除 scanf d switch choose case1 printf 插入点 scanf d myinsert head m break case2 printf 删除点 scanf d k mydelete head m if k 1 printf 删除点后 myprint head elseprintf 不存在 n break 3 编写mycreat 函数 并用此函数代替对应的空函数后运行程序 开辟头结点 并用头指针head指向它 head LST malloc sizeof LST head head 头结点 q num next 使指针变量q也指向该头结点 q head 3 编写mycreat 函数 并用此函数代替对应的空函数后运行程序 head 头结点 q p num next 开辟新的结点 并使指针变量p指向它 p LST malloc sizeof LST 3 编写mycreat 函数 并用此函数代替对应的空函数后运行程序 head 头结点 q num next 结点1 num next 连接新结点和当前链表的最后结点 q next p p 3 编写mycreat 函数 并用此函数代替对应的空函数后运行程序 head 头结点 q num next 结点1 num next 将数据赋予新结点的num成员 p num m 101 p 3 编写mycreat 函数 并用此函数代替对应的空函数后运行程序 head 头结点 q num next 结点1 num next 使q指向新链表的最后一个结点 101 p 3 编写mycreat 函数 并用此函数代替对应的空函数后运行程序 head 头结点 q num next 结点1 num next 使q指向新链表的最后一个结点 q p 101 p 3 编写mycreat 函数 并用此函数代替对应的空函数后运行程序 head 头结点 num next 结点1 num next 开辟新的结点 并使指针变量p指向它 101 p q 3 编写mycreat 函数 并用此函数代替对应的空函数后运行程序 head 头结点 num next 结点1 num next 新结点 num next 开辟新的结点 并使指针变量p指向它 101 p q p LST malloc sizeof LST 3 编写mycreat 函数 并用此函数代替对应的空函数后运行程序 head 头结点 num next 结点1 num next 新结点 num next 连接新结点和当前链表的最后结点 q next p 101 p 3 编写mycreat 函数 并用此函数代替对应的空函数后运行程序 head 头结点 num next 结点1 num next 新结点 num next 将数据赋予新结点的num成员 p num m 101 103 3 编写mycreat 函数 并用此函数代替对应的空函数后运行程序 head 头结点 num next 结点1 num next 新结点 num next 使q指向新链表的最后一个结点 101 103 3 编写mycreat 函数 并用此函数代替对应的空函数后运行程序 head 头结点 num next 结点1 num next 新结点 num next 使q指向新链表的最后一个结点 q p 101 103 3 编写mycreat 函数 并用此函数代替对应的空函数后运行程序 head 头结点 num next 结点1 num next 新结点 num next 链表的最后一个结点设为尾结点 q next NULL 101 103 0 3 编写mycreat 函数 并用此函数代替对应的空函数后运行程序 返回链表头结点的地址 returnhead head 头结点 num next 结点1 num next 新结点 num next 101 103 0 3 编写mycreat 函数 并用此函数代替对应的空函数后运行程序 LST mycreat intm 0 LST head NULL p NULL q NULL head LST malloc sizeof LST q head printf 建立链表 请输入数值 n printf Inputm scanf d while m 1 p LST malloc sizeof LST q next p p num m q p printf Inputm scanf d q next NULL returnhead 4 编写myprint 函数 并用此函数代替对应的空函数后运行程序 head 头结点 结点1 结点2 尾结点 0 101 103 105 使指针p指向链表中结点1 p p head next head 头结点 结点1 结点2 尾结点 0 101 103 105 输出p所指结点的num成员值 p printf 5d p num 101 head 头结点 结点1 结点2 尾结点 0 101 103 105 移动p 即使p指向下一个结点 p head 头结点 结点1 结点2 尾结点 0 101 103 105 移动p 即使p指向下一个结点 p head 头结点 结点1 结点2 尾结点 0 101 103 105 输出p所指结点的num成员值 p printf 5d p num 103 head 头结点 结点1 结点2 尾结点 0 101 103 105 移动p 即使p指向下一个结点 p head 头结点 结点1 结点2 尾结点 0 101 103 105 移动p 即使p指向下一个结点 p p next head 头结点 结点1 结点2 尾结点 0 101 103 105 输出p所指结点的num成员值 p printf 5d p num 105 移动p 即使p指向下一个结点 head 头结点 结点1 结点2 尾结点 0 101 103 105 p head 头结点 结点1 结点2 尾结点 0 101 103 105 移动p 即使p指向下一个结点 不存在 所以p NULL p p next voidmyprint LST head LST p NULL p head next if p NULL printf 链表为空表 elsedo printf 5d p num p p next while p NULL printf n 5 编写myinsert 函数 并用此函数代替对应的空函数后运行程序 head 头结点 结点1 尾结点 结点2 新结点 s 101 103 105 0 指针s去开辟需插入的结点 s LST malloc sizeof LST head 头结点 结点1 尾结点 结点2 新结点 s 101 103 105 0 104 需插入的数值赋予新结点的num成员 s num m head 头结点 结点1 尾结点 结点2 新结点 s 101 103 105 0 104 q指向头结点 q head p指向结点1 p head next head 头结点 结点1 尾结点 结点2 新结点 s 101 103 105 0 104 q p 判断是否找到插入点 if p num m head 头结点 结点1 尾结点 结点2 新结点 s 101 103 105 0 104 q p q p都移到下一个结点 head 头结点 结点1 尾结点 结点2 新结点 s 101 103 105 0 104 q p都移到下一个结点 q q next p head 头结点 结点1 尾结点 结点2 新结点 s 101 103 105 0 104 q q p都移到下一个结点 q q next p p next head 头结点 结点1 尾结点 新结点 s 101 103 105 0 104 q 判断是否找到插入点 if p num m p 结点2 head 头结点 结点1 尾结点 结点2 新结点 s 101 103 105 0 104 q p q p都移到下一个结点 head 头结点 结点1 尾结点 结点2 新结点

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论