结构体共用体1.ppt_第1页
结构体共用体1.ppt_第2页
结构体共用体1.ppt_第3页
结构体共用体1.ppt_第4页
结构体共用体1.ppt_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

第十四章 结构体 共用体和用户定义类型 14 1用typedef定义类型功能 用自定义名字为已有数据类型命名类型定义简单形式 typedeftypename 例typedefintINTEGER 类型定义语句关键字 已有数据类型名 用户定义的类型名 例typedeffloatREAL 类型定义后 与已有类型一样使用 例INTEGERa b c REALf1 f2 说明 1 typedef没有创造新数据类型2 typedef是定义类型 不能定义变量3 typedef与define不同 definetypedef预编译时处理编译时处理简单字符置换为已有类型命名 typedef定义类型步骤按定义变量方法先写出定义体 如 inti 将变量名换成新类型名 如 intINTEGER 最前面加typedef如 typedefintINTEGER 用新类型名定义变量如 INTEGERi j 一个学生的信息有学号 姓名 性别 年龄 住址 成绩等 一本图书的信息有分类编号 书名 作者 出版社 出版日期 价格 库存量等 如何描述这些类型不同的相关数据 结构体 一种构造类型数据结构体由若干不同类型的数据项组成 构成结构体的各个数据项称为结构体成员 信息管理 14 2结构体结构体是一种构造数据类型用途 把不同类型的数据组合成一个整体 自定义数据类型结构体类型定义 struct结构体名 数据类型1成员名1 数据类型2成员名2 数据类型n成员名n struct为关键字 结构体名是用户定义的类型标识 中是组成该结构体的成员 成员的数据类型可以是C语言所允许的任何数据类型 例如学生类型的定义 structstudent intnum 学号 charname 20 姓名 charsex 性别 intage 年龄 floatscore 成绩 charaddr 30 住址 14 2 1结构体变量的说明先定义结构体类型 再定义结构体变量一般形式 struct结构体名 类型标识符成员名 类型标识符成员名 struct结构体名变量名表列 例structstudent intnum charname 20 charsex intage floatscore charaddr 30 structstudentstu1 stu2 定义结构体类型的同时定义结构体变量一般形式 struct结构体名 类型标识符成员名 类型标识符成员名 变量名表列 例structstudent intnum charname 20 charsex intage floatscore charaddr 30 stu1 stu2 直接定义结构体变量一般形式 struct 类型标识符成员名 类型标识符成员名 变量名表列 例struct intnum charname 20 charsex intage floatscore charaddr 30 stu1 stu2 说明结构体类型与结构体变量概念不同类型 不分配内存 变量 分配内存类型 不能赋值 存取 运算 变量 可以结构体可嵌套结构体成员名与程序中变量名可相同 不会混淆 14 2 3结构体变量的初始化形式一 struct结构体名 类型标识符成员名 类型标识符成员名 struct结构体名结构体变量 初始数据 例structstudent intnum charname 20 charsex intage charaddr 30 structstudentstu1 112 WangLin M 19 200BeijingRoad 形式二 struct结构体名 类型标识符成员名 类型标识符成员名 结构体变量 初始数据 例structstudent intnum charname 20 charsex intage charaddr 30 stu1 112 WangLin M 19 200BeijingRoad 结构体变量的引用引用规则结构体变量不能整体引用 只能引用变量成员 结构体嵌套时逐级引用 成员 分量 运算符优先级 1结合性 从左向右 引用方式 结构体变量名 成员名 结构体和指针指向结构体变量的指针定义形式 struct结构体名 结构体指针名 例structstudent p 使用结构体指针变量引用成员形式 存放结构体变量在内存的起始地址 指向运算符优先级 1结合方向 从左向右 例指向结构体的指针变量 main structstudent longintnum charname 20 charsex floatscore stu 1 p p 例intn int p n 10 structstudentstu1 structstudent p p num 101 14 2 3结构体数组结构体数组的定义三种形式 形式一 structstudent intnum charname 20 charsex intage structstudentstu 2 形式二 structstudent intnum charname 20 charsex intage stu 2 形式三 struct intnum charname 20 charsex intage stu 2 结构体数组初始化 例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 结构体数组引用 引用方式 结构体数组名 下标 成员名 例统计候选人选票 structperson charname 20 intcount leader 3 Li 0 Zhang 0 Wang 0 main inti j charname 20 for i 1 i 10 i scanf s name for j 0 j 3 j if strcmp name leader j name 0 leader j count for i 0 i 3 i printf 5s d n leader i name leader i count 结构体类型命名例如 structnode charc structnode next typedefstructnodeCHNODE CHNODE p 相当于structnode p 14 2 6链表 概述链表是一种动态数据结构 可根据需要动态地分配存储单元 链表不要求逻辑上相邻的元素在物理位置上也相邻在数组中 插入或删除一个元素都比较繁琐 而用链表则相对容易 数组元素的引用比较简单 对于链表中结点数据的存取操作则相对复杂 1 链表结构 1 链表中每个元素称为一个结点2 每个结点由2个域组成 1 数据域 存储结点本身的信息 2 指针域 指向后继结点的指针 3 构成链表的结点必须是结构体类型数据 4 相邻结点的地址不一定是连续的 依靠指针将它们连接起来 链表结构的定义 structnode charname 10 structnode next next为structnode类型指针变量 指向下一个结点 结点的变量或指针变量的定义 structnodestudent head student可以存放一个学生结点指针head可以存放学生结点的地址 动态分配存储空间库函数 1 void malloc unsignedintsize malloc在内存的动态存储区中分配一个size长度的连续存储空间 返回值 返回一个指向分配域地址的指针 类型为void 若未成功 则返回空指 NULL int p p int malloc 8 p指示系统分配的4个整型存储单元的起始地址 2 void calloc unsignedn unsignedsize 函数作用 在内存的动态存储区中分配n个长度为size的连续空间 返回值 一个指向分配域起始地址的指针 不成功返回NULL 用calloc函数可以为一维数组开辟动态存储空间 n为数组元素个数 每个元素长度为size int ip ip int calloc 10 sizeof int 动态分配了10个存放整型数据的存储单元 3 voidfree void p 函数free释放由指针变量p所指示的内存区域 例如 free p 通过函数free将已分配的内存区域交还系统 使系统可以重新对其进行分配 int ip ip int calloc 10 sizeof int free ip 例 动态定义数组 includevoidmain intn i p scanf d 输入 10程序运行结果 0149162536496481 对链表的基本操作 创建链表 从无到有地建立起一个链表 查找 按给定的结点索引号或检索条件 查找某个结点 如果找到指定的结点 则称为检索成功 否则 称为检索失败 插入 在结点ki 1与ki之间插入一个新的结点k 使表的长度增1 且逻辑关系发生如下变化 插入前 ki 1是ki的前驱 ki是ki 1的后继 插入后 新插入的结点k 成为ki 1的后继 ki的前驱 4 删除操作 删除结点ki 使链表的长度减1 且ki 1 ki和ki 1结点之间的逻辑关系发生如下变化 删除前 ki是ki 1的前驱 ki 1的后继 删除后 ki 1成为ki 1的前驱 ki 1成为ki 1的后继 if h NULL h为空 表示新结点为第一个结点 h p 头指针指向第一个结点 else h不为空 q next p 新结点与尾结点相连接 q p 使q指向新的尾结点 例11 8 建立一个学生电话簿的单向链表函数 链表的建立操作 structstudent charname 20 chartel 10 structstudent next typedefstructstudentSTU STU creat STU p q h p STU malloc sizeof STU scanf s p name while strlen p name 0 scanf s p tel p next NULL if h NULL h p elseq next p q p p STU malloc sizeof STU gets p name returnh 例14 1 在学生电话簿链表中插入一个学生的信息 要求将新的信息插入在指定学生信息之前 如果未找到指定学生 则追加在链表尾部 a 在表头插入结点 head p0 p0 next p 链表的插入操作 b 在表中间插入结点 q next p0 p0 next p 例14 1 在学生电话簿链表中插入一个学生的信息 要求将新的信息插入在指定学生信息之前 如果未找到指定学生 则追加在链表尾部 例14 1 在学生电话簿链表中插入一个学生的信息 要求将新的信息插入在指定学生信息之前 如果未找到指定学生 则追加在链表尾部 c 在表尾追加结点 p next p0 p0 next NULL structnode p q if head NULL head p0 p0 next NULL else p head while strcmp x p name 0 if strcmp x p name 0 if p head head p0 elseq next p0 p0 next p else p next p0 p0 next NULL returnhead structnode insert structnode head structnode p0 char x a 删除第一个结点 head p next 例14 1 删除学生电话簿链表中指定学生的信息 链表的删除操作 b 删除中间结点或尾结点 q next p next 例14 1 删除学生电话簿链表中指定学生的信息 structnode p q if head NULL printf Thisisaemptylist returnhead p head while strcmp x p name 0 if strcmp x p name 0 if p head head p next elseq next p next free p elseprintf Notfound returnhead structnode delnode structnode head char x 14 3共用体构造数据类型 也叫联合体用途 使几个不同类型的变量共占一段内存 相互覆盖 共

温馨提示

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

评论

0/150

提交评论