编译技术DS02实现基础.ppt
《编译技术DS02实现基础.ppt》由会员分享,可在线阅读,更多相关《编译技术DS02实现基础.ppt(30页珍藏版)》请在三一文库上搜索。
1、第2章 实现基础,2.1 引子, 还是为每个具体应用都编一个程序?,类型名称:数据集合的基本统计 数据对象集:集合S= , , 操作集: ElementType Average(S):求S中元素的平均值; ElementType Max(S):求S中元素的最大值; ElementType Min(S):求S中元素的最小值; ElementType Median(S):求S中元素的中位数。, 从不同的应用中抽象出共性的数据组织与操作方法?,例2.1 在日常数据处理中经常碰到的问题是需要对一组数据进行基本的统计分析。比如,分析一个课程班学生的平均成绩、最高成绩、最低成绩、中位数、标准差等。同样的统
2、计要求也可能发生在其他领域。,1/25, 如何利用程序设计语言实现上述抽象类型?,第2章 实现基础,2.1 引子,1. 数据存储, C语言(包括其他高级语言)提供了数组、结构、链表等。 数据结构的存储实现跟所需要的操作密切相关。 在数据结构里,是利用数组和链表方式来实现的,包括很复杂的数据结构,如图、树等。,2. 操作实现,流程控制语句,即分支控制语句(如if-else、switch语句)、循环控制语句(如for、while、do-while语句)。 此外,还有模块化的程序设计方法函数,2/25,第2章 实现基础,2 数据存储基础, 变量是数据存储的基本单位。变量的类型决定了存储和操作。 几种
3、基本的数据类型:整型、实型(浮点型)、字符型等。 提供了构造数据类型:数组、结构、指针等。,数组 数组是最基本的构造类型,它是一组相同类型数据的有序集合。数组中的元素在内存中连续存放,用数组名和下标可以唯一地确定数组元素。,5/25,(1)一维数组,(2)二维数组,(3)数组作为形参和实参,第2章 实现基础,2 数据存储基础,例2.3 求集合元素的最大值。集合元素存放在数组A中,数组大小为N。,5/25,指针,第2章 实现基础,2 数据存储基础,指针是C语言中一个非常重要的概念。使用指针可以对复杂数据进行处理,能对计算机的内存进行分配控制,在函数调用中使用指针还可以返回多个值。, 指针的基本运
4、算,取地址运算符 & 间接访问运算符 * 指针的加 、减操作。,6/25,第2章 实现基础,2 数据存储基础,(2) 指针与数组,数组名是数组中第1个元素(下标为0)的地址,可以看作是常量指针,不能改变指针常量(数组名)的值。,(3)用指针实现内存动态分配,分配函数 void *malloc(unsigned size) 。 该函数分配了size个字节,并返回了指向这块内存的指针。 如果分配失败,则返回一个空指针(NULL)。 关于分配失败的原因,应该有多种,比如说空间不足就是一种。 释放函数void free(void *ptr) 。 该函数是将之前用malloc分配的空间还给程序或者是操作
5、系统,也就是释放了这块内存,让它重新得到自由。,6/25,注意事项: A、申请了内存空间后,必须检查是否分配成功。 B、当不需要再使用申请的内存时,记得释放;释放后应该把原本指向这块内存的指针变量 指向NULL,防止程序后面不小心使用了该指针。(释放的是内存,不是指针变量) C、这两个函数应该是配对使用。如果申请后不释放就是内存泄露;如果无故释放(还未使用就释放)那就是什么也没有做。释放只能一次,如果释放两次及两次以上会出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。 D、虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成
6、(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一些编译器的检查。,第2章 实现基础,2 数据存储基础,(4) 用指针实现动态顺序存储结构 int * p; p=(int *) malloc(10*sizeof(int); if(p=NULL) return; int p10;,第2章 实现基础,2 数据存储基础,结构,结构类型定义的一般形式为: struct 结构名 类型名 结构成员名1; 类型名 结构成员名2; 类型名 结构成员名n; ;,第2章 实现基础,2 数据存储基础,【定义】结构类型把一些可以是不同类型的数据分量聚合成一个整体。同时,结构又是一个变量的集合,可
7、以单独使用其变量成员。,7/25,struct student /学生信息结构体 int num; /学号 char name20; /姓名 char gender; /性别 int age; /年龄 stu=97001,“Lin Lin“,F,19;,typedef struct student /学生信息结构体 int num; /学号 int age; /年龄 Student;,第2章 实现基础,2 数据存储基础,结构数组:结构与数组的结合,结构指针:指向结构的指针,(1)用*方式访问,形式:(*结构指针变量名 ).结构成员名 (2)用指向运算符“-”访问指针指向的结构成员,形式: 结构
8、指针变量名-结构成员名,对结构数组元素成员的引用是通过使用数组下标与结构成员操作符“.”相结合的方式来完成的,其一般格式为: 结构数组名下标.结构成员名,7/25,结构变量的使用,使用结构变量就是对其成员进行操作。格式为:结构变量名.结构成员名。此外,结构变量不仅可以作为函数参数,也可以作为函数的返回值。,共用体 【定义】共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。,第2章 实现基础,2 数据存储基础,共用体类型定义的一般形式为: union共用体名 类型名 成员名1; 类型名 成员名2; 类型名 成员名n; ;, 各个成员变量在内存中都使用同一段存储空间,因此
9、共用体变量的长度等于最长的成员的长度。 共用体的访问方式同结构体类似。, u.k=258的二进制表示:,u.ch0 = 2,u.ch1 = 1,8/25,枚举类型的声明形式如下: enum 枚举类型名 变量值列表;, 枚举类型 【定义】将需要的变量值一一列举出来,便构成了一个枚举类型,例如: enum weekday sun,mon,tue,wed,thu,fri,sat;,枚举类型应用说明: 对枚举元素按常量处理,不能对它们赋值。 如,不能写:sun=0; 枚举元素具有缺省值,它们依次为: 0,1,2,。 也可以在声明时另行指定枚举元素的值,如: enum weekday sun=7,mon
10、=1,tue,wed,thu,fri,sat; 枚举值可以进行关系运算。 如: weekday today; if(today=tue) ; 整数值不能直接赋给枚举变量,如需要将整数赋值给枚举变量,应进行强制类型转换。 如:today=(weekday)3;,链表,链表是一种重要的基础数据结构,也是实现复杂数据结构的重要手段。它不是顺序存储数据,而是由若干个同一结构类型的“结点”依次串接而成的,即每一个结点里保存着下一个结点的地址(指针)。 链表又分单向链表,双向链表以及循环链表等,单向链表的结构,使用结构的嵌套来定义单向链表结点的数据类型。如: struct Node ElementType
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 技术 DS02 实现 基础
链接地址:https://www.31doc.com/p-2258618.html