C语言第9章结构体、共用体、枚举.ppt

上传人:max****ui 文档编号:10964131 上传时间:2020-04-16 格式:PPT 页数:69 大小:4.83MB
返回 下载 相关 举报
C语言第9章结构体、共用体、枚举.ppt_第1页
第1页 / 共69页
C语言第9章结构体、共用体、枚举.ppt_第2页
第2页 / 共69页
C语言第9章结构体、共用体、枚举.ppt_第3页
第3页 / 共69页
点击查看更多>>
资源描述
第九章结构体 共用体 枚举 湖南工业大学计算机与通信学院 湖南省普通高等学校省级精品课程 C语言程序设计 目录 什么是结构 结构与数组有什么差别 有几种结构的定义形式 它们之间有什么不同 什么是结构的嵌套 什么是结构变量和结构成员变量 如何引用结构成员变量 结构变量如何作为函数参数使用 什么是结构数组 如何定义和使用结构数组 什么是结构指针 它如何实现对结构分量的操作 结构指针是如何作为函数的参数的 如何建立单向链表并实现插入 删除以及查找操作 什么是共用体 共用体与结构体有什么区别 什么是枚举类型 枚举类型数据如何引用 学习目标 重点 难点 9 1问题的提出 在程序里表示一个人 学号 姓名 各科成绩 想表示多个人呢 解决方案 charstudentId 30 10 01 02 03 04 charstudentName 30 20 张三 李四 王五 刘娟 floatscoreComputer 30 88 5 86 5 75 68 5 floatscoreEnglish 30 78 75 5 65 5 82 floatscoreMath 30 78 75 5 65 82 5 1 使用数组 分配内存不集中 寻址效率不高不能建立数组间的关系对数组进行赋初值时 容易发生错位 2 使用多维数组 C语言不允许一个数组包含多种数据类型 怎么解决呢 希望的内存分配图 人们设想找到一种数据类型 把学生的信息当一个整体来存储 即这个整体中元素的数据类型可以不同 这个数据类型即结构体 可以将不同类型的数据组合成一个整体 用来表示简单类型无法描述的复杂对象 同时可以用结构体来定义用户自己的数据类型 扩展开来 在现实中 几个数据之间有着密切联系 它们用来描述事物的几个方面 但它们不属于同一类型 这时可以用结构体数据类型 也就是说结构体为程序员提供了一种封装一组相关数据元素的简便方法 9 1问题的提出 又如 在学生信息管理系统中填加个属性 是否是中共党员 如果不是属性的值为0 int 如果是属性的值为入党的时间 char 在某一时间 属性只有一种值 而且数据类型不同 这种情况用什么数据类型描述呢 对于这种应用 C语言引入了共用体类型 共用体是一种同一存储区域由不同类型变量共享的数据类型 它提供 种方法能在同一存储区中操作不同类型的数据 也就是说共用体采用的是覆盖存储技术 准许不同类型数据互相覆盖 9 1问题的提出 此时用整型数来表示这些变量的取值 其直观性很差 如在程序中使用1 对于非编程者来说 它是代表星期一呢 还是一月份 很难区分 为提高程序的可读性 引入非数值量 即一些有意义的符号是非常必要的 另外 在实际应用中 有些变量的取值范围是有限的 仅可能只有几个值 一个星期7天 一年12个月 一副扑克有4种花色 每一花色有13张牌 对于这种应用 C语言引入枚举类型 所谓 枚举 就是将变量可取的值一一列举出来 从基本数据类型 复合数据类型到抽象数据类型 计算机本身是没有数据类型的概念的内存里存储的内容 你认为它代表什么 它就代表什么高级语言设计了基本数据类型 整型 浮点型 字符型等 不同的语言也会定义不同的基本类型基本数据类型并不能方便地解决所有问题复合数据类型是基本数据类型迭代派生而来典型的代表就是 结构 数组 指针也可算作此类抽象数据类型 ADT 在复合数据类型的基础上增加了对数据的操作抽象数据类型进而进化为 类 这是一个跨时代的进步 结构成员 结构名 struct node charid 20 charname 20 floatscore 3 C语言中的有效数据类型 9 2结构体 9 2 1结构体类型 上述学生基本信息 学号 姓名 各科成绩 的例子 C语言程序可用结构体定义为 9 2 1结构体类型 结构体类型的定义 struct结构体名 类型标识符成员名1 类型标识符成员名2 struct是关键字 不能省略 合法标识符可省略 无名结构体 成员类型可以是基本类型或构造类型 必须有分号 structnode charid 20 charname 20 floatscore 3 id name node 结构定义并不预留内存 结构定义放置在程序的开始部分 位于头文件声明之后 score 结构定义仅描述了一个结构的形式 如果要在程序里使用结构 需要声明结构变量 9 2 1结构体类型 structaddress charcity 10 charstreet 20 intcode intzip 嵌套结构 structnest friendslist charname 10 intage structaddressaddr chartelephone 13 在定义嵌套的结构类型时 必须先定义成员的结构类型 再定义主结构类型 9 2 2结构体类型变量 1 结构体类型变量的定义结构体变量的定义有以下几种形式 单独定义 先定义结构体类型 后定义结构体变量 structnode charid 20 charname 15 intscore 3 structnodestudent1 student2 直接定义 在定义结构体类型同时定义结构体变量 structnode charid 20 charname 15 intscore 3 student1 student2 结构体类型名node可以不写 structnodestudent1 01 YaoMing 80 90 5 结构体类型变量的初始化 01 YaoMing 80 注意 赋值的顺序应与成员声明时的顺序一样允许初始化语句中的值的数目比结构成员数目少 90 5 初始化一般形式 结构体类型名结构体变量 初值表 结构体变量的引用 结构体变量的引用原则结构体变量不能整体输入输出 要通过成员运算符 逐个访问其成员 且访问的格式为 structdate intyear intmonth intday structdatebirth printf d d d birth printf d d d birth year birth month birth day 结构体变量 成员 是成员运算符 优先级最高 如果某成员本身又是一个结构类型 则只能通过多级的分量运算 对最低一级的成员进行引用 引用结构变量student中的birthday成员的格式分别为 student birthday yearstudent birthday monthstudent birthday day 结构体变量的引用 structstd info intnum charname 20 charsex floatscore structdatebirthday student structdate intyear intmonth intday numnamesexscorebirthday student 对最低一级成员 可像同类型的普通变量一样 进行相应的各种运算 结构变量 成员 子成员 最低级子成员 student2 id 02 student2 name ZhangZiLiang student2 score 1 88 printf 请输入成绩 n scanf f 结构变量赋值 02 ZhangZiLiang 88 用输入语句或赋值语句来给结构变量的各个成员赋值 78 78 student3 student2 02 ZhangZiLiang 88 78 结构变量的整体赋值 例9 1学生的基本信息包括学号 姓名 3门成绩 平均分 总分 输入一个学生的前3项基本信息 计算平均分和总分并输出 printf 请输入姓名 gets stu1 name for inti 0 i 3 i printf 请输入 s成绩 CLASSNAME i scanf f 分析 定义一个结构体类型对应于学生的基本信息 输入学生信息 即对结构体变量的各成员项逐个赋值 总分我们利用循环结构进行计算 输出学生信息 我们用printf 格式控制输出 include defineCLASS3structnode charid 10 学号charname 15 姓名floatscore 3 成绩floatsum 总分floatave 平均分 charCLASSNAME CLASS 30 计算机 英语 数学 voidmain structnodestu1 floatsum 0 printf 请输入学号 gets stu1 id 思考题9 1 在上面的程序中 考虑如果把gets stu1 name 语句改为scanf s stu1 name 有什么不同 什么是结构体类型 什么是结构体变量 结构体类型与数组类型有什么区别和联系 一个结构变量只能表示一个实体的信息 如果有许多相同类型的实体 就需要使用结构数组 结构数组是结构与数组的结合 与普通数组的不同之处在于每个数组元素都是一个结构类型的数据 包括各个成员项 9 2 3结构数组 1 结构体数组的定义 stu 0 stu 1 stu 2 结构数组的定义方法与结构变量相同 单独定义 先定义结构体类型 后定义结构体数组 structnode charid 20 charname 15 intscore 3 structnodestu 30 直接定义 在定义结构体类型同时定义结构体数组 structnode charid 20 charname 15 intscore 3 stu 30 结构体类型名node可以不写 structnode charid 20 charname 15 intscore 3 structnodestudent 10 01 Wangli 78 5 98 5 86 5 02 ZhangFun 88 5 78 5 81 5 03 LiLing 76 5 68 5 76 5 2 结构体数组的初始化 结构体类型名结构体数组名 n 初值表1 初值表2 初值表n 思考 结构体数组初始化时 红色的括号能去掉吗 上面的例子中只给了前三个结构数组元素的初始化 对于其它元素 编译器会预分配内存空间吗 3 结构数组元素成员的引用 结构数组元素的成员引用结构体数组名 下标 结构体成员名使用方法与同类型的变量完全相同stu 5 id 26 strcpy stu 5 name ZhangSan stu 6 stu 5 例9 2学生的基本信息包括学号 姓名 3门成绩 平均分 总分 输入三个学生的基本信息 计算总分和平均分 并按平均分从高分到低分输出 for i 0 i 3 i floatsum 0 printf 请输入学号 gets stu1 i id printf 请输入姓名 gets stu1 i name for j 0 j CLASS j printf 请输入 s成绩 CLASSNAME j scanf f 分析 排序需要内存中同时存在3个学生的信息 因此 此题考虑定义结构体数组存储所有学生信息 存储所有学生信息后 用前面学习的选择法排序 include defineCLASS3structnode charid 10 学号charname 15 姓名floatscore 3 成绩floatsum 总分floatave 平均分 charCLASSNAME CLASS 30 计算机 英语 数学 voidmain structnodestu1 3 temp inti j for i 0 i 2 i for j i 1 j 3 j if stu1 j ave stu1 i ave temp stu1 i stu1 i stu1 j stu1 j temp for i 2 i 0 i printf 学号 s姓名 s总成绩 f平均成绩 2f n stu1 i id stu1 i name stu1 i sum stu1 i ave for j 0 j CLASS j printf s成绩 2f n CLASSNAME i stu1 i score j 定义阶段 数据输入 数据排序 数据输出 思考题9 2 结构体数组元素是否相当于结构体变量 结构体数组元素是如何输入输出的 如果结构体中再包含数组成员 此时结构体数组元素如何输入输出 9 2 4结构体指针 structpoint intx inty structpointpt 定义结构体变量 structpoint ppt 定义结构体指针 ppt 指向运算符 第二种更常用 ppt pt 结构指针 指向结构类型变量的指针 structstudent intnum charname 20 charsex intage structstudentstu 3 101 Lilin M 18 102 Zhanghua M 18 103 Wuli F 19 structstudent p stu main for pnum p name p sex 说明 如果指针变量p指向结构体数组 则p 1指向结构体数组的下一个元素 而不是当前元素的下一个成员 如果指针变量p指向一个结构变量 或结构数组 就不能再使之指向结构体变量 或结构数组元素 的某一成员 p stu p stu name p num p num 指向结构体数组的指针 思考题9 3 指向结构体变量的指针定义后就可以直接使用吗 用结构指针的方法如何处理例9 1和例9 2 用结构体类型数据作为函数参数有以下三种形式 用结构体变量的成员作参数用法与普通变量作参数相同 值传递用结构体变量作参数函数的实参和形参必须都是结构体变量 程序效率低 开销大 不主张用用结构体指针或结构体数组作参数提高运行效率 还可以修改结构体指针所指向的结构体的内容 9 2 5结构变量 结构指针作为函数参数 include defineCLASS3structnode charid 10 学号charname 15 姓名floatscore 3 成绩 charCLASSNAME CLASS 30 计算机 英语 数学 voidmain structnodestu1 3 inti j voidoutputinfo structnodem for i 0 i 3 i floatsum 0 printf 请输入学号 gets stu1 i id printf 请输入姓名 gets stu1 i name for j 0 j CLASS j printf 请输入 s成绩 CLASSNAME j scanf f 结构变量作为函数参数 例9 3学生的基本信息包括学号 姓名 3门成绩 输入3个学生信息 并输出显示 定义个输出功能的函数 要求用结构体变量作函数参数 voidoutputinfo structnodem printf 学号 s姓名 s n m id m name for intj 0 j CLASS j printf s成绩 2f n CLASSNAME j m score j 传递结构时不使用 所以实际上是传值调用 即 将结构变量的每个成员值逐个传送 include defineCLASS3structnode charid 10 学号charname 15 姓名floatscore 3 成绩 charCLASSNAME CLASS 30 计算机 英语 数学 voidmain structnodestu1 3 inti j voidoutputinfo structnodem for i 0 i 3 i floatsum 0 printf 请输入学号 gets stu1 i id printf 请输入姓名 gets stu1 i name for j 0 j CLASS j printf 请输入 s成绩 CLASSNAME j scanf f 结构指针作为函数参数 例9 4改写例9 3 学生的基本信息包括学号 姓名 3门成绩 输入3个学生信息 并输出显示 要求用结构体指针作函数参数 定义输出功能的函数 voidoutputinfo structnode p for inti 0 iid p name for intj 0 jscore j 用指针变量作函数参数进行传送时由实参传向形参的只是结构的地址 思考 在例9 3中 主函数要调用outputinfo structnodem 函数三次输出3个结构数组元素 为什么在例9 4中 主函数只需要调用outputinfo structnode p 一次 例9 4中实参为结构数组的首地址 与第七章向函数传递数组的知识进行类比 用形参voidoutputinfo structnodestu1 改写例9 4 结构变量作为参数时 数据传递是 值传递方式 如果结构参数包含的成员有很多 那么在参数的传递过程中就需要花费很多时间和空间 如果需要对主函数中定义的结构体数组成员赋值 即修改结构指针所指向的内容 根据前面所学知识 在这里也只能用传递地址的方式 结构指针作为函数参数 可以通过被调函数中结构指针的移动 如p 来完成对主函数中多个结构数组元素的操作 而结构变量作为函数参数 只能完成对主函数中某一个结构数组元素的操作 要完成对多个结构数组元素的操作 需要在主函数中循环调用以结构变量作为参数的函数 综上所述 用结构指针作为参数的效率更高 是更佳的选择 结构变量与结构指针作为函数参数的区别 结构指针作为返回值的函数定义 调用方法与其他函数一样如在学生系统中 对某学生信息的查询 对某学生信息的修改 对某学生信息的删除 可以通过函数返回的结构指针值进行对这个学生定位 结构指针作为函数的返回值 学以致用 你如何解决以下问题 思考题9 5 编写程序自定义一函数 实现学生信息输入的功能 用结构指针作为函数参数的方法 编写程序自定义一函数 实现计算平均分和总分的功能 用结构指针作为函数参数的方法 9 2 6链表 数组在内存中是顺序存储的 进行插入 删除操作时需要移动大量数据 程序的执行效率降低 在用数组存放数据时 一般需要事先定义好固定长度的数组 如果事先不能确定最终人数 就要定义数组足够大 以容纳下学生的数据 这样处理问题 缺乏灵活性 往往会浪费许多内存 前面我们学习了用结构体数组静态地存储和处理学生信息的方法 现在我们分析下这种方法的弊端 怎么解决呢 可以考虑逻辑上相邻的数据元素物理上可以随意存放 逻辑相邻元素用指针联系 按此设想 数据所占存储空间分为两个部分 一个部分存放结点值 一个部分存放表示结点关系的指针 这样的结构即链表 链表是结构体的一种应用 这样 进行插入 删除操作时不需要移动数据 只需要修改指针 程序效率提高 链表是一种动态存储分配的数据结构 不需要预先占用足够大的内存空间 链表的概念 一种动态存储分布的数据结构若干个同一结构类型的 结点 依次串接而成 头指针 结点 尾结点 链表的概念 结点定义 structstud node intnum charname 20 intscore structstud node next 结构的递归定义 指针的值 实际单元地址空值 即为 无值或随机值 举例 structstudentstu1 stu2 stu1 link 指针变量在引用前 必须有一个确定值 head stu1 stu2 null 链表与空指针 1 在链表中易于插入一个新节点 null head 2 在链表中易于删除一个节点 null head 3 在链表中不易于检索一个节点 4 在链表中易于出现断链 链表的操作原理 structstudent charname 20 longnum structstudent link rp lp p null lp rp p structstudent malloc sizeof student null strcpy p name zhangsan p num 9901012 p link null rp link p rp p 各域值 rp p 链表的建立 尾部插入新结点 lp lp null rp p lp lp lp link free p Head p 系统 注意 删除节点就是将该节点从链表中分离出来 删除后 一定将该节点归还给系统 以便于再分配 否则 链表将永久丢失 链表的删除 前端删除 intdelete front structlink head structlink p if head NULL return 0 else p head head head next free p return 1 p null head null intdelete rear structlink head structlink p if head NULL return 0 else if head next null free head head null else p head while p next next null p p next free p next p next null return 1 链表的删除 后端删除 p null q head intdelete mid structlink head intx structlink p q if head NULL return 0 elseif head data x delete front head return 1 else p head while p next data x 链表的删除 中间删除 head null p intinsert front structlink head intx structlink p p structlink malloc sizeof structlink p data x p next head head p return 1 链表的前端插入 head null p voidinsert rear structlink head intx structlink p q p structlink malloc sizeof structlink p data x p next null if head null head p else for q head q next null q q next q next p null 链表的后端插入 head null p voidinsert mid structlink head intx inty structlink p q p structlink malloc sizeof structlink p data x if head null head p p next null elseif head data y insert front head x else for q head q next data y 链表的中间插入 9 3共用体 联合Union unionnumber shortx charch floaty 共用体变量的定义 引用基本上和struct一样x ch和y处于同样的地址sizeof unionnumber 取决于占空间最多的那个成员变量 同一内存单元在每一瞬时只能存放其中一种类型的成员 起作用的成员是最后一次存放的成员 不能作为函数参数 structperson charname 20 charsex intage union intsingle struct charspouseName 20 intchild married structdatedivorcedDay marital intmarryFlag 共用体的应用 union intsingle struct charspouseName 20 intchild married structdatedivorcedDay marital struct charspouseName 20 intchild married voidmain unionint char inti charch 2 x x i 24897 printf i d ni o n x i x i printf ch0 o ch1 o nch0 c ch1 c n x ch 0 x ch 1 x ch 0 x ch 1 例9 5运行下面的程序 分析运行结果 97 65 二进制 八进制 十进制 高字节 低字节 ch 0 ch 1 01000001 01100001 i 24897 i 60501 ch0 101 ch1 141 ch0 A ch1 a 可以直接定义枚举常量 enum sun mon tue wed thu fri sat 其中 sun mon sat等称为枚举元素或枚举常量 它们是用户定义的标识符 枚举常量本身不具有任何含义 就是标识符 是人为地赋以内在含义 在c编译中 对枚举元素是按符号常量处理 它们不是变量 不能对它们赋值 例如 sun 0 mon 1 枚举元素作为常量 它们是有值的 C语言编译时按定义时的顺序使它们的值为0 1 2 例如 sun为0mon为1tue为2Wed为3thu为4fri为5sat为6printf d workday 当workday为fri时 输出5 枚举元素作为常量 也可以在定义时改变枚举常量的值 例如 enumweekday sun 7 mon 1 tue wed thu fri sat workday work end 枚举值可以用来做判断比较 它是通过枚举值来比较的 if workday mon if workday sun 一个整形数不能直接赋值给一个枚举变量 workday 3 而应先进行类型强制转化 workday enumweek 2 workday enumweek 5 3 或workday tue 9 4枚举类型 9 5定义自己的类型名 允许由用户自已定义类型说明符 也就是说允许由用户为数据类型取 别名 吗 C语言中提供了类型定义符typedef来完成此功能 typedef定义的一般形式为 typedef原类型名新类型名 structtagPerson typedefstructtagPersonperson personstudent typedef为一种类型定义一个同义词 思考 typedef和 define的区别是什么 9 6应用程序举例 1 使用结构数组存储学生成绩信息 包括学号 姓名 成绩 平均分 总分 要求实现对成绩信息的新建 查询 删除的操作 假定最多输入50个学生的信息 查询 删除都按姓名这一个条件进行操作 分析 模块化程序设计思想 把题目要求的各种功能做成相应的函数 主函数进行调用完成程序的总体控制 这样的设计使得main 函数中的代码非常简洁 即循环接收用户输入的功能选项 分别调用功能函数 结构数组名作为函数参数 或函数参数之一 调用时实参为结构数组名 它与普通数组名作为函数实参是一样的 就是将数组首地址传递给函数形参 9 6应用程序举例 1 定义结构类型 变量及函数申明 include include include defineNUM SUBJECT3 定义学生课程的数目为3科 structstudent info charnumber 15 学号 charname 20 姓名 floatscore NUM SUBJECT 分别为该学生3门课的成绩 floatsum 总分 floataverage 平均分 char subject 语文 数学 英语 定义一维指针数组 intCount 0 定义全局变量Count 记录当前学生总数 voidnew student structstudent infostudents intsearch student structstudent infostudents char name voidremoverecord structstudent infostudents voidcopyrecord structstudent info src structstudent info dest voidmain void charname 10 structstudent infostudents 50 最多包含50个人 9 6应用程序举例 要求菜单循环显示 2 编写主菜单 intchoice do printf 学生管理系统功能选项 1 新建2 查询3 删除0 退出 n printf 请选择功能 scanf d 9 6应用程序举例 在主函数中把结构数组名students传递给形参 即把结构数组的首地址传递给形参 对结构数组元素students Count 的各成员进行赋值操作 由于Count是全局变量 因此可以在new student 函数中直接使用 Count的值加1 3 新建学生信息函数voidnew student structstudent infostudents voidnew student structstudent infostudents if Count 50 printf 学生存储已满 n return printf 请输入学号 gets students Count number printf 请输入姓名 gets students Count name floatsum 0 for intj 0 j NUM SUBJECT j printf 请输入 s成绩 subject j scanf f 9 6应用程序举例 在主函数中把结构数组名students和存储从键盘输入姓名的数组名name传递给形参 即把结构数组的首地址和存储要查询学生姓名的数组name的首地址传递给形参 通过函数strcmp name students i name 0来定位结构数组元素 也就是说如果上式成立 那么students i 即为我们要查询的结构数组元素 输出结构数组元素students i 中的各成员变量 并且返回i的值 为按姓名删除函数提供定位功能 4 按姓名查询某学生信息函数intsearch student structstudent infostudents char name intsearch student structstudent infostudents char name inti flag 0 if Count 0 printf 没有学生记录 n return 1 for i 0 i Count i if strcmp name students i name 0 flag 1 找到欲查询的学生 if flag printf 学号 s姓名 s总成绩 f平均成绩 2f n students i number students i name students i sum students i average for intj 0 j NUM SUBJECT j printf s成绩 2f n subject j students i score j returni printf 没有此学生记录 return 1 9 6应用程序举例 通过intsearch student函数进行定位 即找到结构数组元素students i 中的i students i 为需要删除的结构数组元素 Count变量减1 从i开始 循环做 把后一个结构数组元素覆盖前一个结构数组元素 student i student i 1 循环条件为i Count 由于覆盖结构数组元素是一个独立的功能 其它地方也可能用到 比如说插入结构数组元素 因此我们把覆盖结构数组元素的功能单独做了一个函数copyrecord 5 删除某学生信息函数removerecord structstudent infostudents voidremoverecord structstudent infostudents charstr 5 chartarget 20 inti j if Count 0 printf 没有可供删除的记录 return while 1 printf 请输入欲删除的学生的姓名 printf 直接输入回车则结束删除操作 n gets target if strlen target 0 break i search student students target if i 1 return else Count for j i j Count j copyrecord 复制学生信息 voidcopyrecord structstudent info src structstudent info dest intj strcpy dest number src number strcpy dest name src name for j 0 jscore j src score j dest sum src sum dest average src average 9 6应用程序举例 2 建立一个学生成绩信息 包括学号 姓名 成绩 的单向链表 学生记录号由小到大顺序排列 要求实现对成绩信息的插入 修改 删除和遍历操作 分析 采用模块化的程序结构 程序的每一个功能的实现都是通过函数来完成 这些函数在main 函数中被统一调用 其中 函数Creat Stu Doc 用于建立链表 它又调用了函数InsertDoc 函数 InsertDoc 的作用是在链表中插入一个结点 函数DeleteDoc 的功能是在链表中删除一个结点 函数Print Stu Doc 的功能是遍历显示链表中所有的信息 程序的数据类型变量定义阶段 include include includestructstud node intnum charname 20 intscore structstud node next structstud node Create Stu Doc 新建链表 structstud node InsertDoc structstud node head structstud node stud 插入 structstud node DeleteDoc structstud node head intnum 删除 voidPrint Stu Doc structstud node head 遍历 intmain void structstud node head p intchoice num score charname 20 intsize sizeof structstud node 循环菜单 do printf 1 Create2 Insert3 Delete4 Print0 Exit n scanf d 新建链表 structstud node Create Stu Doc structstud node head p intnum score charname 20 intsize sizeof structstud node head NULL printf Inputnum nameandscore n scanf d s d 插入操作 structstud node InsertDoc structstud node head structstud node stud structstud node ptr ptr1 ptr2 ptr2 head ptr stud ptr指向待插入的新的学生记录结点 原链表为空时的插入 if head NULL 新插入结点成为头结点 head ptr head next NULL else 原链表不为空时的插入 while ptr num ptr2 num 删除操作 structstud node DeleteDoc structstud node head intnum structstud node ptr1 ptr2 要被删除结点为表头结点 while head NULL 遍历操作 voidPrint Stu Doc structstud node head structstud node ptr if head NULL printf nNoRecords n return printf nTheStudents RecordsAre n printf NumNameScore n for ptr head ptr ptr ptr next printf 8d 20s 6d n ptr num ptr name ptr score 9 7本章小结 1 结构体与共用体有很多相似的地方类型定义的形式相同 通过定义类型说明了结构体或共用体所包含的不同数据类型的的成员项 同时确定了结构体或共用体类型的名称 变量说明的方法相同 都有三种方法说明变量 结构体与共用体的引用方式相同 除了同类型的变量之间可赋值外 均不能对变量整体赋常数值 输入 输出和运算等 都只能通过引用其成员项进行 9 7本章小结 2 结构体与共用体的主要区别在结构体变量中 各成员均拥有自己的内存空间 它们是同时存在的 一个结构变量的长度等于所有成员项长度之和 在共用体变量中 所有成员只能先后占用该共用体变量的内存空间 它们不能同时存在 一个共用体变量的长度等于最长的成员项的长度 在说明结构体变量或数组时可以对变量或数组元素的所有成员赋初值 共用体变量同时只能存储一个成员 因此只能对一个成员赋初值 9 7本章小结 3 链表对于结构体类型 如果其中的一个成员项是一个指向自身结构的指针 则该类型可用作链表的结点类型 链表的操作有建立 输出链表 插入 删除结点等 当预先知道元素数量或元素数量变化不大 主要操作是查找这样的静态操作时宜采用结构数组结构 当元素的数量变化较大 且主要操作是插入 删除这样的动态操作时 宜于采用链表结构 9 7本章小结 4 枚举类型枚举类型的数据就是用户定义的一组标识符 枚举常量 的序列 其存储的是整型数值 因此枚举类型是基本数据类型 枚举常量对应整数值 因此枚举类型数据与整数之间可以比较大小 枚举变量还可以进行 等运算 枚举类型不能直接输入输出 只能通过赋值取得枚举常量值 输出也只能间接进行 9 7本章小结 5 typedef用户可以通过typedef给系统数据类型以及构造类型重新命名 注意这并没有定义新的类型 定义构造类型名的作用是 简化
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!