第12章-结构体和数据结构基础课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第12章-结构体和数据结构基础课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 12 结构 数据结构 基础 课件
- 资源描述:
-
1、版权所有,违者必究哈尔滨工业大学哈尔滨工业大学计算机科学与技术学院计算机科学与技术学院苏小红苏小红第12章 结构体和数据结构基础C语言程序设计第12章 结构体和共用体第12章 学习内容n结构体,共用体,枚举类型n结构体变量、数组、指针的定义n结构体成员的引用n向函数传递结构体n动态数据结构:链表、栈、队列、二叉树2/65C语言程序设计第12章 结构体和共用体n对计算机系统和硬件,类型的概念不存在因为在冯.诺依曼体系结构中,程序中的数据和代码都是以二进制存储的机器指令及汇编语言中,数据对象均用二进制数表示内存里存的内容都是二进制数,你将它解释成什么,它就是什么12.1从基本数据类型到抽象数据类型
2、3/65C语言程序设计第12章 结构体和共用体n在高级语言引入基本数据类型的目的有效地组织数据,规范数据的使用,提高程序的可读性不同语言会定义不同的基本类型高级语言中预先定义的类型是远远不够的l有些语言(如PL/1)中试图规定较多的类型,如数组、树、栈等,但实践证明不是个好办法12.1从基本数据类型到抽象数据类型4/65C语言程序设计第12章 结构体和共用体n有没有一种类型能很好地定义学生(包括姓名、学号、性别、年龄等信息)呢?n有没有一种类型能很好地定义纸牌(包括花色和牌面)呢?nC语言允许用户自定义数据类型典型的代表就是“结构体”一种构造数据类型12.1从基本数据类型到抽象数据类型5/65
3、C语言程序设计第12章 结构体和共用体n有没有一种类型能定义车呢?除车的属性,还包括对车的操作(启动、加速、减速、刹车等)n抽象数据类型(Abstract Data Type,ADT)不单纯是数据的集合,增加了对数据的操作类型的表示和操作的实现细节对外是不可见的能达到更好的信息隐藏效果12.1从基本数据类型到抽象数据类型6/65C语言程序设计第12章 结构体和共用体nC+中的类(Class)结构体可看成是所有成员都是public的类但不能将C+看成是带类的C,是思考问题角度的转变面向过程(Process Oriented)分析问题的处理步骤,通过函数(过程)调用处理问题以功能为中心来设计功能模
4、块面向对象(Object Oriented)将问题分解为对象,而不是步骤建立对象的目的不是为了完成一个步骤,数据为中心以对象为基础,以事件或消息来驱动对象执行操作12.1从基本数据类型到抽象数据类型7/65C语言程序设计第12章 结构体和共用体12.2.1为什么要定义结构体类型n在程序里表示一个人(姓名、性别、年龄),怎么表示?n想表示多个人呢?n如何用计算机程序实现下述表格的管理?8/65C语言程序设计第12章 结构体和共用体数组的解决方法12.2.1为什么要定义结构体类型9/65C语言程序设计第12章 结构体和共用体12.2.1为什么要定义结构体类型10/65C语言程序设计第12章 结构体
5、和共用体数组的解决方法分配内存不集中,寻址效率不高 对数组赋初值时,易发生错位 结构零散,内存管理困难12.2.1为什么要定义结构体类型11/65C语言程序设计第12章 结构体和共用体希望的内存分配图 12.2.1为什么要定义结构体类型12/65C语言程序设计第12章 结构体和共用体结构体类型的声明声明了一个结构体类型声明了一个结构体类型构成结构体的变量称为构成结构体的变量称为结构体的成员结构体的成员(Structure Member)结构体的名字称为结结构体的名字称为结构体标签构体标签(Structure Tag)13/65C语言程序设计第12章 结构体和共用体结构体类型的声明结构体模板结构
6、体模板(Structure Template)14/65C语言程序设计第12章 结构体和共用体结构体类型的声明定义为何种类型更好?定义为何种类型更好?15/65C语言程序设计第12章 结构体和共用体(1)先定义结构体类型再定义变量名)先定义结构体类型再定义变量名(2)在定义结构体类型的同时定义变量)在定义结构体类型的同时定义变量(3)直接定义结构体变量(不指定结构体标签)直接定义结构体变量(不指定结构体标签)12.2.2 结构体变量的定义16/65C语言程序设计第12章 结构体和共用体12.2.3 用typedef定义数据类型名struct student stu1,stu2;/*It wor
7、ks*/STUDENT stu1,stu2;/*It works!*/student stu1,stu2;/*Can this work?*/struct stu1,stu2;/*Can this work?*/关键字关键字typedef为一种为一种已存在的已存在的类型定义一个类型定义一个别名别名,并未定义新,并未定义新类型类型struct student与与STUDENT类型是类型是同义词同义词17/65C语言程序设计第12章 结构体和共用体等价于等价于12.2.4 结构体变量的初始化18/65C语言程序设计第12章 结构体和共用体n结构体定义可嵌套嵌套的结构体(Nested Structu
8、re)在一个结构体内包含了另一个结构体作为其成员 12.2.5 嵌套的结构体19/65C语言程序设计第12章 结构体和共用体n访问结构体变量的成员成员选择运算符(也称圆点运算符)12.2.6 结构体变量的引用n对嵌套的结构体成员,必须以级联方式访问STUDENT stu1;20/65C语言程序设计第12章 结构体和共用体等价于等价于12.2.6 结构体变量的引用21/65C语言程序设计第12章 结构体和共用体【例12.1】演示结构体变量的赋值和引用方法按结构体的成员顺序逐一对相应成员进行赋值格式符%02d中2d前面的前导符0表示输出数据时,若左边有多余位,则补012.2.6 结构体变量的引用2
9、2/65C语言程序设计第12章 结构体和共用体 若不用初始化的方法,而用从键盘输入的方法输入结构体变量stu1的内容,那么程序如何修改?两个地址有何不同?23/65C语言程序设计第12章 结构体和共用体结构体成员的地址与该成员在结构体中所处的位置及其所占内存的字节数相关结构体变量的地址&stu2是该变量所占内存空间的首地址24/65C语言程序设计第12章 结构体和共用体12.2.7 结构体所占内存的字节数nstruct 类型用内存字节数=?n是所有成员占内存的总和吗?n用获得结构体大小 【例12.2】typedef struct sample char m1;int m2;char m3;SA
10、MPLE;25/65C语言程序设计第12章 结构体和共用体结构体实际所占的内存空间一般是按照机器字长对齐的结构体实际所占的内存空间一般是按照机器字长对齐的不同的系统和编译器,内存对齐不同的系统和编译器,内存对齐(Memory-alignment)方式不同方式不同为了满足处理器的对齐要求,可能会在较小的成员后加入补位为了满足处理器的对齐要求,可能会在较小的成员后加入补位结构体变量的成员的内存对齐方式是与机器相关的结构体变量的成员的内存对齐方式是与机器相关的所以结构体在内存中所占的字节数也是与机器相关的所以结构体在内存中所占的字节数也是与机器相关的12.2.7 结构体所占内存的字节数26/65C语
11、言程序设计第12章 结构体和共用体32位体系结构中,位体系结构中,int值被对齐在值被对齐在4字节地址边界,字节地址边界,保证了一个保证了一个int型数总能通过一次内存操作被访问到,型数总能通过一次内存操作被访问到,每次内存访问是在每次内存访问是在4字节对齐的地址处读取或存入字节对齐的地址处读取或存入32位整数位整数读取存储在没有对齐的地址处的读取存储在没有对齐的地址处的32位整数,需两次内存访问,且从取到的位整数,需两次内存访问,且从取到的64位中位中提取相关的提取相关的32位需额外的操作,性能下降位需额外的操作,性能下降12.2.7 结构体所占内存的字节数n为什么要满足内存对齐的要求呢?2
12、7/65C语言程序设计第12章 结构体和共用体typedef struct sample char m1;int m2;char m3;SAMPLE;typedef struct sample char m1;char m3;int m2;SAMPLE;12.2.7 结构体所占内存的字节数28/65C语言程序设计第12章 结构体和共用体12.3 结构体数组的定义和初始化29/65C语言程序设计第12章 结构体和共用体建立了数据库中的多条记录,每条对应一个学生信息建立了数据库中的多条记录,每条对应一个学生信息12.3 结构体数组的定义和初始化30/65C语言程序设计第12章 结构体和共用体 【例
13、12.3】利用结构体数组,计算每个学生的平均分31/65C语言程序设计第12章 结构体和共用体12.4结构体指针的定义和初始化ptstu1 STUDENT stu1;STUDENT *pt;pt=&stu1;成员成员1成员成员2成员成员3成员成员4成成员员5n如何定义指向结构体变量的指针?等价于等价于32/65C语言程序设计第12章 结构体和共用体n如何访问结构体指针变量指向的结构体成员呢?ptstu1成员成员1成员成员2成员成员3成员成员4成成员员5n通过成员选择运算符访问n通过指向运算符访问12.4结构体指针的定义和初始化33/65C语言程序设计第12章 结构体和共用体ptstu1成员成员
14、1成员成员2成员成员3成员成员4成成员员5n当结构体嵌套时,如何访问结构体指针变量所指向的结构体成员?12.4结构体指针的定义和初始化34/65C语言程序设计第12章 结构体和共用体 STUDENT stu30;STUDENT *pt;pt=stu;n如何定义指向结构体数组的指针?等价于等价于等价于等价于ptstu30stu0stu1stu2stu3stu4stu5.stu2912.4结构体指针的定义和初始化35/65C语言程序设计第12章 结构体和共用体使用使指向 ptn如何访问结构体指针指向的结构体数组成员?stu30stu0stu1stu2stu3stu4stu5.stu2912.4结构
15、体指针的定义和初始化36/65C语言程序设计第12章 结构体和共用体12.5 向函数传递结构体n向函数传递结构体的单个成员复制单个成员的内容n向函数传递结构体的完整结构复制结构体的所有成员n向函数传递结构体的首地址仅复制一个地址值37/65C语言程序设计第12章 结构体和共用体结构体变量作函数参数int main(void)struct date d;d.year=1999;d.month=4;d.day=23;printf(Before function call:%d/%02d/%02dn,d.year,d.month,d.day);Func(d);/*结构体变量作函数实参,传值调用结构体
16、变量作函数实参,传值调用*/printf(After function call:%d/%02d/%02dn,d.year,d.month,d.day);return 0;struct date int year;int month;int day;void Func(struct date p)p.year=2000;p.month=5;p.day=22;【例12.4】函数对结构体内容的修改不影响原结构体38/65C语言程序设计第12章 结构体和共用体int main(void)struct date d;d.year=1999;d.month=4;d.day=23;printf(Befor
17、e function call:%d/%02d/%02dn,d.year,d.month,d.day);Func(&d);/*结构体变量结构体变量的地址的地址作函数实参,传地址调用作函数实参,传地址调用*/printf(After function call:%d/%02d/%02dn,d.year,d.month,d.day);return 0;结构体指针作函数参数【例12.5】结构体指针作函数形参实参必须为地址值struct date int year;int month;int day;void Func(struct date*p)p-year=2000;p-month=5;p-day
18、=22;39/65C语言程序设计第12章 结构体和共用体结构体变量做函数返回值int main(void)struct date d;d.year=1999;d.month=4;d.day=23;printf(Before function call:%d/%02d/%02dn,d.year,d.month,d.day);d=Func(d);/*结构体变量作函数实参,传值调用结构体变量作函数实参,传值调用*/printf(After function call:%d/%02d/%02dn,d.year,d.month,d.day);return 0;struct date int year;i
19、nt month;int day;struct date Func(struct date p)p.year=2000;p.month=5;p.day=22;return p;【例12.6】返回结构体变量的值也可以得到修改的结构体内容,但效率低40/65C语言程序设计第12章 结构体和共用体 【例12.7】修改例12.3程序,用结构体数组作函数参数编程计算并输出学生的平均分 aver放到结构体成员中精简参数传递个数使函数接口更简洁 结构体作函数参数的好处?typedef struct student long studentID;char studentName10;char studentS
20、ex;DATE birthday;int score4;float aver;STUDENT;41/65C语言程序设计第12章 结构体和共用体用户自定义的数据类型n结构体(struct)把关系紧密且逻辑相关的多种不同类型的变量,组织到统一的名字之下n共用体,也称联合(union)把情形互斥但逻辑相关的多种不同类型的变量,组织到统一的名字之下42/65C语言程序设计第12章 结构体和共用体12.6 共用体struct sample short i;char ch;float f;0 x0037b00union sampleshort i;char ch;float f;【例12.8】43/65C
21、语言程序设计第12章 结构体和共用体nsizeof(union number)取决于占空间最多占空间最多的那个成员变量0 x0037b00n同一内存在每一瞬时只能存放其中一种类型的成员n起作用的成员是最后一次存放的成员12.6 共用体44/65C语言程序设计第12章 结构体和共用体12.6 共用体45/65C语言程序设计第12章 结构体和共用体12.6 共用体46/65C语言程序设计第12章 结构体和共用体12.7 枚举数据类型n枚举(Enumeration)数据类型描述一组有限个数据值组成的整型值的集合基本数据类型enum weeks SUN,MON,TUE,WED,THU,FRI,SAT;
22、enum weeks today;today =TUE;/值为值为2 enum response no,yes,none;enum response answer;answer=no;/值为值为0 enum response no=-1,yes=1,none=0;47/65C语言程序设计第12章 结构体和共用体n下面的结构是什么意思?struct temp int data;struct temp pt;nCB下的错误提示:field pt has incomplete typenVC下的错误提示:pt uses undefined struct temp结构体声明时不能包含本结构体类型的成员
23、系统无法预知这样的结构体需要占据多少内存 12.8 动态数据结构单向链表48/65C语言程序设计第12章 结构体和共用体n下面的结构是什么意思?struct temp int data;struct temp pt;n下面的结构是什么意思呢?struct temp int data;struct temp*pt;这样的结构体类型有什么用呢?12.8 动态数据结构单向链表可包含指向本结构体类型的指针变量49/65C语言程序设计第12章 结构体和共用体struct link int data;struct link*next;n动态数据结构的典型代表链表(Linked Table)特点:用一组任意
展开阅读全文