数据(Data) 数据是信息的载体它能够被计算机识别存储和加工处理是计算机程序加工的原料 随着计算机应用领域的扩大数据的范畴包括 整数实数字符串图像和声音等 数据元素(Data Element) 数据元素是数据的基本单位数据元素也称元素结点顶点记录 一个数据元素可以由若干个数据项(也可称为字段域属性)组成 数据项是具有独立含义的最小标识单位 数据结构(Data Structure) 数据结构指的是数据之间的相互关系即数据的组织形式 .数据结构一般包括以下三方面内容 ① 数据元素之间的逻辑关系也称数据的逻辑结构(Logical Structure) 数据的逻辑结构是从逻辑关系上描述数据与数据的存储无关是独立于计算机的数据的逻辑结构可以看作是从具体问题抽象出来的数学模型 ② 数据元素及其关系在计算机存储器内的表示称为数据的存储结构(Storage Structure) 数据的存储结构是逻辑结构用计算机语言的实现(亦称为映象)它依赖于计算机语言对机器语言而言存储结构是具体的一般只在高级语言的层次上讨论存储结构 ③ 数据的运算即对数据施加的操作 数据的运算定义在数据的逻辑结构上每种逻辑结构都有一个运算的集合最常用的检索插入删除更新排序等运算实际上只是在抽象的数据上所施加的一系列抽象的操作 所谓抽象的操作是指我们只知道这些操作是做什么而无须考虑如何做只有确定了存储结构之后才考虑如何具体实现这些运算 为了增加对数据结构的感性认识下面举例来说明有关数据结构的概念 【例.】 学生成绩表见下表 注意在表中指出数据元素数据项开始结点和终端结点等概念 ()逻辑结构 表中的每一行是一个数据元素(或记录结点)它由学号姓名各科成绩及平均成绩等数据项组成 表中数据元素之间的逻辑关系是对表中任一个结点与它相邻且在它前面的结点(亦称为直接前趋(Immediate Predecessor))最多只有一个与表中任一结点相邻且在其后的结点(亦称为直接后继(Immediate Successor))也最多只有一个表中只有第一个结点没有直接前趋故称为开始结点也只有最后一个结点没有直接后继故称之为终端结点例如表中马二所在结点的直接前趋结点和直接后继结点分别是丁一和张三所在的结点上述结点间的关系构成了这张学生成绩表的逻辑结构 ()存储结构 该表的存储结构是指用计算机语言如何表示结点之间的这种关系即表中的结点是顺序邻接地存储在一片连续的单元之中还是用指针将这些结点链接在一起? ()数据的运算 在上面的学生成绩表中可能要经常查看某一学生的成绩当学生退学时要删除相应的结点进来新学生时要增加结点究竟如何进行查找删除插入这就是数据的运算问题 搞清楚了上述三个问题也就弄清了学生成绩表这个数据结构 .数据的逻辑结构分类在不产生混淆的前提下常将数据的逻辑结构简称为数据结构数据的逻辑结构有两大类 ()线性结构 线性结构的逻辑特征是若结构是非空集则有且仅有一个开始结点和一个终端结点并且所有结点都最多只有一个直接前趋和一个直接后继 线性表是一个典型的线性结构栈队列串等都是线性结构 ()非线性结构 非线性结构的逻辑特征是一个结点可能有多个直接前趋和直接后继数组广义表树和图等数据结构都是非线性结构 .数据的四种基本存储方法 数据的存储结构可用以下四种基本存储方法得到 ()顺序存储方法 该方法把逻辑上相邻的结点存储在物理位置上相邻的存储单元里结点间的逻辑关系由存储单元的邻接关系来体现 由此得到的存储表示称为顺序存储结构 (Sequential Storage Structure)通常借助程序语言的数组描述 该方法主要应用于线性的数据结构非线性的数据结构也可通过某种线性化的方法实现顺序存储 ()链接存储方法 该方法不要求逻辑上相邻的结点在物理位置上亦相邻结点间的逻辑关系由附加的指针字段表示由此得到的存储表示称为链式存储结构(Linked Storage Structure)通常借助于程序语言的指针类型描述 ()索引存储方法 该方法通常在储存结点信息的同时还建立附加的索引表 索引表由若干索引项组成若每个结点在索引表中都有一个索引项则该索引表称之为稠密索引(Dense Index)若一组结点在索引表中只对应一个索引项则该索引表称为稀疏索引(Spare Index)索引项的一般形式是 (关键字地址) 关键字是能唯一标识一个结点的那些数据项稠密索引中索引项的地址指示结点所在的存储位置稀疏索引中索引项的地址指示一组结点的起始存储位置 ()散列存储方法 该方法的基本思想是根据结点的关键字直接计算出该结点的存储地址 四种基本存储方法既可单独使用也可组合起来对数据结构进行存储映像 同一逻辑结构采用不同的存储方法可以得到不同的存储结构选择何种存储结构来表示相应的逻辑结构视具体要求而定主要考虑运算方便及算法的时空要求 .数据结构三方面的关系数据的逻辑结构数据的存储结构及数据的运算这三方面是一个整体孤立地去理解一个方面而不注意它们之间的联系是不可取的 存储结构是数据结构不可缺少的一个方面同一逻辑结构的不同存储结构可冠以不同的数据结构名称来标识 【例】线性表是一种逻辑结构若采用顺序方法的存储表示可称其为顺序表若采用链式存储方法则可称其为链表若采用散列存储方法则可称为散列表 数据的运算也是数据结构不可分割的一个方面在给定了数据的逻辑结构和存储结构之后按定义的运算集合及其运算的性质不同也可能导致完全不同的数据结构 【例】若对线性表上的插入删除运算限制在表的一端进行则该线性表称之为栈若对插入限制在表的一端进行而删除限制在表的另一端进行则该线性表称之为队列更进一步若线性表采用顺序表或链表作为存储结构则对插入和删除运算做了上述限制之后可分别得到顺序栈或链栈顺序队列或链队列 数据类型(Data Type) 所谓数据类型是一个值的集合以及在这些值上定义的一组操作的总称通常数据类型可以看作是程序设计语言中已实现的数据结构 【例.】C语言的整数类型就定义了一个整数可取值的范围(其最大值INTMAX依赖于具体机器)以及对整数可施加的加减乘除和取模等操作 按值是否可分解可将数据类型划分为两类 ①原子类型其值不可分解通常是由语言直接提供 【例】C语言的整型字符型等标准类型及指针等简单的导出类型 ②结构类型其值可分解为若干个成分(或称为分量)是用户借助于语言提供的描述机制自己定义的它通常是由标准类型派生的故它也是一种导出类型 【例】C的数组结构等类型 抽象数据类型(Abstract Type简称ADT) ADT是指抽象数据的组织和与之相关的操作可以看作是数据的逻辑结构及其在逻辑结构上定义的操作 一个ADT可描述为 ADT ADTName{ Data://数据说明 数据元素之间逻辑关系的描述 Operations://操作说明 Operation://操作它通常可用C或C﹢﹢的函数原型来描述 Input:对输入数据的说明 Preconditions:执行本操作前系统应满足的状态//可看作初始条件 Process:对数据执行的操作 Output:对返回数据的说明 Postconditions:执行本操作后系统的状态//系统可看作某个数据结构 Operation://操作 …… }//ADT 抽象数据类型可以看作是描述问题的模型它独立于具体实现它的优点是将数据和操作封装在一起使得用户程序只能通过在ADT里定义的某些操作来访问其中的数据从而实现了信息隐藏在C﹢﹢中我们可以用类(包括模板类)的说明来表示ADT用类的实现来实现ADT【参阅[]】因此C﹢﹢中实现的类相当于是数据的存储结构及其在存储结构上实现的对数据的操作 ADT和类的概念实际上反映了程序或软件设计的两层抽象ADT相当于是在概念层(或称为抽象层)上描述问题而类相当于是在实现层上描述问题此 |