首页 理论教育计算机导论:数据结构基本概念

计算机导论:数据结构基本概念

【摘要】:计算机进行数据输入和数据输出时使用的最小单位称为数据元素。书号、书名、作者名、状态等称为数据元素的数据项。如何表示现实世界中的各种不同的数据元素模型,如何在程序设计中实现各种不同的数据元素模型,是数据结构要讨论的主要问题。为了使读者理解数据结构的基本概念,我们以图书信息计算机管理问题的软件设计为例来进行说明。数据结构主要有数据的逻辑结构、数据的存储结构以及对数据元素的操作。

描述客观事物的数字、字符、图像、声音等所有能输入到计算机中并能被计算机接受的符号称为数据。

计算机进行数据输入和数据输出时使用的最小单位称为数据元素。例如,在图书馆图书的计算机管理问题中,一本图书的描述数据由书号、书名、作者名、状态等组成,一本书的这些数据在输入或输出时必须作为一个整体进行,所以这个问题的数据元素就由书号、书名、作者名、状态等数据组成。书号、书名、作者名、状态等称为数据元素的数据项。

程序是计算机可以理解和执行的求解问题的操作步骤。现实世界中的问题是用数据元素来描述的。现实世界中的问题类型有很多种,描述现实世界问题的数据元素模型也必然有很多种。如何表示现实世界中的各种不同的数据元素模型,如何在程序设计中实现各种不同的数据元素模型,是数据结构要讨论的主要问题。

为了使读者理解数据结构的基本概念,我们以图书信息计算机管理问题的软件设计为例来进行说明。要用计算机来管理图书馆图书的借阅,需要分析和建立图书数据的模型。对于图书借阅问题来说,数据元素由书号、书名、作者名、状态(状态有未借出状态、已借出状态等)等组成。所有数据元素应组织成一种一个数据元素后接另一个数据元素的结构。任何一次借阅的计算机管理过程实际就是对其中某一个数据元素的某一个(或某几个)数据项数据值的修改过程。例如,某个读者要在图书馆借阅一本由作者名为朱战立,书名为《计算机导论》的书,计算机的管理方法是:在图书信息文件中查找是否存在作者名为朱战立,书名为《计算机导论》的书,如果不存在,则告诉读者图书馆没有这本书,处理过程结束;如果存在,则检查该数据元素的状态数据项是否为已借出状态,如果是已借出状态(假设每种书只有一本),则告诉读者该书已借出,处理过程结束;如果该数据元素的状态是未借出状态,则把该数据元素的状态修改为已借出状态,并从书架上找出该书,把它借给读者,处理过程结束。

在图书馆图书的计算机管理问题中,图书数据的组织模型为线性表。在线性表中,每个数据元素只有一个惟一的前驱数据元素和一个惟一的后继数据元素。线性表是一种最简单的数据结构模型。按线性表模型组织的数据,允许对其中任意一个数据元素进行修改操作。由于这样的数据模型是从逻辑概念上考虑的数据模型,所以这样的数据模型称为数据的逻辑结构。

对于图书馆图书的计算机管理问题,还要考虑逻辑结构的线性表怎样具体存储在计算机中。对于图书信息表,我们可以用一个数值足够大的数组来具体存放,用数组具体存储图书信息表的示意图见图8-1。其中,最后一列数值为0表示未借出状态,数值为1表示已借出状态。该数组存放在内存中一段地址连续的存储单元中。在图8-1中,图书信息表中的数据元素是按逻辑次序在内存中连续存放的,即逻辑意义上在前面的数据元素存放在数组的前面位置,逻辑意义上在后面的数据元素存放在数组的后面位置。数据模型在计算机内存的存储方式称为数据的存储结构。由于用数组方式存储的存储结构在内存中是顺序存储的,所以这种存储结构称为顺序存储结构。因此,图书信息表的数组存储结构也称为图书信息表的顺序存储结构。

图8-1 用数组存储图书信息表(www.chuimin.cn)

对于逻辑结构的图书信息表,我们还可以用链接的方式在计算机中具体存储,链接方式图书信息表的存储示意见图8-2(a)。其中,箭头指示出下一个数据元素在内存中的存储位置。符号“”表示链接到此结束。图书信息表的链接方式存储简称链表。链表中的一个数据元素和相应的勾链(称为指针)称为结点。在链表中,数据元素的逻辑次序是靠勾链来实现的。链表中每个结点在内存中的存储位置由操作系统根据当前运行的计算机的内存使用情况临时分配。链表在内存中的一个具体存储位置示意见图8-2(b)。显然,在链接方式存储的图书信息表中,数据元素并不是按其逻辑次序顺序存放的,而是靠勾链来指示下一个数据元素的存储单元地址的。链接方式的存储结构称为链式存储结构。

图8-2 用链接方式存储图书信息表

(a)链接方式的图书信息表;(b)链表在内存中的存放示意

对于图书馆图书的计算机管理问题来说,图书信息表的存储结构不同,算法的实现方法必然不同。例如,任何一次图书借阅管理过程首先需进行所借阅或归还图书的查找,若图书信息表采用数组来存储,那么,为了提高查找算法的效率,我们可以先按图书的书号对该数组进行排序,然后可以按折半查找算法来设计图书的查找算法。但是,若图书信息表采用链式存储结构来存储,那么,就不能用折半查找算法来设计查找算法,因为在链式存储结构下,每一个结点的地址都是当前运行计算机的操作系统临时分配的,因此,我们无法计算出链表中最中间结点在内存中的存储地址。

总结上面的讨论可以归纳出,任何问题的软件设计都包括数据结构的设计。数据结构主要有数据的逻辑结构、数据的存储结构以及对数据元素的操作。对于相同的问题,若存储结构不同,则实现操作的算法也不同。

本章后面三节将概要介绍数据的逻辑结构、数据的存储结构和不同存储结构下操作的实现方法。