数据的四种基本存储方法 数据的存储结构可用以下四种基本存储方法得到 ( )顺序存储方法 该方法把逻辑上相邻的结点存储在物理位置上相邻的存储单元里结点间的逻辑关系由存储单元的邻接关系来体现 由此得到的存储表示称为顺序存储结构 ( 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相当于是在概念层(或称为抽象层)上描述问题而类相当于是在实现层上 描述问题此外C﹢﹢中的类只是一个由用户定义的普通类型可用它来定义变量(称为对象或类的实例)因此在C﹢﹢中最终是通过操 作对象来解决实际问题的所以我们可将该层次看作是应用层例如main程序就可看作是用户的应用程序 由于C语言中没有提供类这一数据类型因此无法实现ADT故我们不采用ADT的形式来描述数据结构以节省篇幅大家只要记住它实 际上等价于我们定义的数据的逻辑结构以及在逻辑结构上定义的抽象操作 |