数据结构(C语言版)严蔚敏 吴伟民 编著 第1章 绪论
1.1 什么是数据结构?
用计算机解决一个具体问题时,大致需要经过下列几个步骤:首先要从具体问题抽象出一个适当的数学模型,然后设计一个解此数学模型的算法,最后编出程序,进行调试,调整直至得到最终解答。寻找数学模型的实质是分析问题,从中提取操作的对象,并找出这些操作对象之间含有的关系,然后用数学的语言加以描述。描述这类非数值问题的数学模型不再是数学方程,而是诸如表、树和图之类的数据结构。因此,简单来说,数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科。
“数据结构”的研究不仅涉及到计算机硬件(特别是编码理论、存储装置和读取方法等)的研究范围,而且和计算机软件的研究有着更密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题。在研究信息检索时也必须考虑如何组织数据,以便查找和存取数据元素更为方便。因此,可以认为“数据结构”是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。在计算机科学中,“数据结构”不仅是一般程序设计(特别是非数值计算的程序设计)的基础,而且是设计和实现编译程序、操作系统、数据库系统及其他系统程序和大型应用程序的重要基础。
1.2 基本概念和术语
- 数据
在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。它是计算机程序加工的“原料”。 - 数据元素
是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。有时,一个数据元素可由若干个数据项组成。 - 数据对象
是性质相同的数据元素的集合,是数据的一个子集。 - 数据结构
是相互之间存在一种或多种特定关系的数据元素的集合。
根据元素之间关系的不同特性,通常有以下4类基本结构:
(1)集合
结构中数据元素之间除了“同属于一个集合”关系外,别无其他关系
(2)线性结构
结构中数据元素之间存在一个对一个的关系
(3)树形结构
结构中的数据元素之间存在一个对多个的关系
(4)图状结构或网状结构
结构中的数据元素之间存在多个对多个的关系
数据结构的形式定义为:数据结构是一个二元组
Data_Structure=(D,S)
其中:D是数据元素的有限集,S是D上关系的有限集。
上述数据结构的定义仅是对操作对象的一种数学描述,换句话说,是从操作对象抽象出来的数学模型。结构定义中的“关系”描述的是数据元素之间的逻辑关系,因此又称为数据的逻辑结构,然而讨论数据结构的目的是为了在计算机中实现对它的操作,因此还需研究如何在计算机中表示它。
数据结构在计算机中的表示(又称映像)称为数据的物理结构,又称存储结构。它包括数据元素的表示和关系的表示。在计算机中表示信息的最小单位是二进制数的一位,叫做位(bit)。在计算机中,我们可以用一个由若干位组合起来形成的一个位串表示数据元素(如用一个字长的位串表示一个整数,用8位二进制数表示一个字符串等),通常这个位串为元素或节点。当数据元素由若干数据项组成时,位串中对应于各个数据项的子位串称为数据域。因此,元素或节点可看成是数据元素在计算机中的映像。
数据元素之间的关系在计算机中有两种不同的表示方法:顺序映像和非顺序映像,并由此得到两种不同的存储结构:顺序存储结构和链式存储结构。顺序映像的特点是借助元素在存储器中的相对位置来表示元素之间的逻辑关系。非顺序映像的特点是借助指示元素存储地址的指针来表示数据元素之间的逻辑关系。数据的逻辑结构和物理结构是密切相关的两个方面,任何一个算法的设计取决于选定的数据(逻辑)结构,而算法的实现依赖于采用的存储结构。
如何描述存储结构呢?虽然存储结构涉及数据元素及其关系在存储器中的物理位置,但由于本书是在高级程序语言的层次上讨论数据结构的操作,因此不能如上那样直接以内存地址来描述存储结构,但我们可以借用高级程序语言中提供的“数据类型”来描述它。我们把C语言看成是一个执行C指令和C数据类型的虚拟存储器,那么本书中讨论的存储结构是数据结构在C虚拟处理中的表示,不妨称它为虚拟存储结构。
数据类型是和数据结构密切相关的一个概念,它最早出现在高级程序语言中,用以刻画(程序)操作对象的特性。在用高级程序语言编写的程序中,每个变量、常量或表达式都有一个它所属的确定的数据类型。类型明显或隐含地规定了在程序执行期间变量或表达式所有可能取值的范围,以及在这些值上允许进行的操作。因此数据类型是一个值得集合和定义在这个值集上的一组操作的总称。如C语言中的整型变量,其值集为某个区间上的整数(区间大小依赖于不同的机器),定义在其上的操作为加、减、乘、除和取模等算术运算。
按“值”的不同特性,高级程序语言中数据类型可分为两类:一类是非结构的原子类型。原子类型的值是不可分解的,例如C语言中的基本类型(整型、实型、字符型和枚举类型)、指针类型和空类型。另一类是结构类型。结构类型的值是由若干成分按某种结构组成的,因此是可以分解的,并且它的成分可以是非结构的,也可以是结构的。
实际上,在计算机中,数据类型的概念并非局限于高级语言中,每个处理器(包括计算机硬件系统、操作系统、高级语言、数据库等)都提供了一组原子类型或结构类型。如一个计算机硬件系统通常含有“位”、“字节”、“字”等原子类型,它们的操作通过计算机设计的一套指令系统直接由电路系统完成,而高级程序语言提供的数据类型,其操作需要通过编译器或解释器转化为低层,即汇编语言或机器语言的数据类型来实现。引入“数据类型”的目的,从硬件的角度看,是作为解释计算机内存中信息含义的一种手段,而对使用数据类型的用户来说,实现了信息的隐蔽,即将一切用户不必了解的细节都封装在类型中。
抽象数据类型(Abstract Data Type)是指一个数学模型以及定义在该模型上的一组操作。抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关,即不论其内部结构如何变化,只要它的数学特性不变,都不影响其外部的使用。抽象数据类型和数据类型实质上是一个概念,抽象数据类型不再局限于前述各处理器中已定义并实现的数据类型,还包括用户在设计软件系统时自己定义的数据类型。为了提高软件的复用率,在近代程序设计方法学中指出,一个软件系统的框架应建立在数据之上,而不是建立在操作之上(后者是传统的软件设计方法所为)。即在构成软件系统的每个相对独立的模块上,定义一组数据和施于这些数据上的一组操作,并在模块内部给出这些数据的表示及其操作的细节,而在模块外部使用的只是抽象的数据和抽象的操作。一个含抽象数据类型的软件模块通常包含定义、表示和实现3个部分。
如前所述,抽象数据类型的定义由一个值域和定义在该值域上的一组操作组成。若按其值得不同特性,可细分为下列3种类型:
-
原子类型
属原子类型的变量的值是不可分解的。这类抽象数据类型较少,因为一般情况下,已有的固有数据类型足以满足需求。但有时也有必要定义新的原子数据类型。 -
固定聚合类型
属该类型的变量,其值由确定数目的成分按某种结构组成。 -
可变聚合类型
和固定聚合类型相比较,构成可变聚合类型“值”的成分的数目不确定。
后两种类型可统称为结构类型。
和数据结构的形式定义相对应,抽象数据类型可用以下三元组表示:
(D,S,P)
其中D是数据对象,S是D上的关系集,P是对D的基本操作集。本书采用以下格式定义抽象数据类型:
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT 抽象数据类型名
其中,数据对象和数据关系的定义用伪码描述,基本操作的定义格式为: