![数据结构简明教程(第2版)微课版](https://wfqqreader-1252317822.image.myqcloud.com/cover/351/25111351/b_25111351.jpg)
1.3 数据结构程序设计
1.3.1 数据结构程序设计步骤
一个数据结构程序用于求解一个数据结构问题,其设计的一般步骤如下。
第一步:分析求解问题的数据和求解功能,采用抽象数据类型来描述求解问题,主要包括数据逻辑结构和运算定义。
第二步:设计逻辑结构对应的存储结构。
第三步,在存储结构上设计实现运算定义的算法。
一种数据逻辑结构可以映射成多种存储结构,同一运算定义不仅在不同的存储结构上实现可以对应多种算法,而且在同一种存储结构上实现也可能有多种算法,那么哪一个算法更好呢?
从前面的介绍看出,算法的评价标准就是算法占用计算机资源的多少,占用计算机资源越多的算法就越坏,反之占用计算机资源越少的算法就越好。这是通过算法的时间复杂度和空间复杂度分析来完成的,所以设计好算法的过程如图1.22所示。
![](https://epubservercos.yuewen.com/71470A/13467201303429506/epubprivate/OEBPS/Images/Figure-P33_28225.jpg?sign=1738864813-D8DsJrsZ064UIcD7yw4BmHFKXgsxrxcn-0-901ee9765ae98efbc5a29afb1c6d3f7c)
图1.22 设计好算法的过程
另外,数据结构程序设计的三个步骤是不是独立的呢?结论是这些步骤不是独立的,因为不可能设计出一大堆算法后再从中找出一个好的算法,而好的算法在很大程度上取决于描述实际问题的存储结构,也就是说必须以设计好算法为目标来设计存储结构,因为数据存储结构会影响算法的好坏,因此设计存储结构是很关键的一步,在选择存储结构时需要考虑其对算法设计的影响。
1.3.2 应用程序的结构
在设计好存储结构的基础上设计求解问题的应用程序时,应遵循结构化程序设计方法(若采用面向对象编程应遵循面向对象的程序设计方法),先提炼出基本运算功能的算法,设计出相应的函数,然后应用程序调用这些基本运算函数完成其求解问题的功能,应用程序的一般结构如图1.23所示。
![](https://epubservercos.yuewen.com/71470A/13467201303429506/epubprivate/OEBPS/Images/Figure-P34_28246.jpg?sign=1738864813-kx452JFuKqZcE7BXReAeXWRQVlnv6EUY-0-e2f8e459709a9747c67a2e04a85e3688)
图1.23 应用程序的一般结构
【例1.11】设计实现例1.4功能的完整程序。
解:设计求解本例应用程序SetApp的过程如下。
问题描述
见例1.4的抽象数据类型ASet和BSet。
设计存储结构
可以用一个整型数组存放ASet中的数据元素集合D,即单个集合的元素。由于C/C++语言中数组并没有一个标识数组中实际元素个数的值,为此用一个整型变量length表示数组中的实际元素个数,这样设计集合类型Set如下。
![](https://epubservercos.yuewen.com/71470A/13467201303429506/epubprivate/OEBPS/Images/Figure-P34_28253.jpg?sign=1738864813-C36SuvdUxZdY5nIDAd0OMfyYfsKOmW2j-0-9ba4121c719159a008015a33558aec16)
采用Set类型的变量存储一个集合。
设计运算算法
ASet抽象数据类型中的运算算法对应的函数如下。
![](https://epubservercos.yuewen.com/71470A/13467201303429506/epubprivate/OEBPS/Images/Figure-P34_46484.jpg?sign=1738864813-VPgU9MJO1DLR147FaI0cVDc7gteJXPPc-0-b89366c4863a72398fa8d021f1b507ba)
BSet抽象数据类型中的运算算法对应的函数如下。
![](https://epubservercos.yuewen.com/71470A/13467201303429506/epubprivate/OEBPS/Images/Figure-P35_46493.jpg?sign=1738864813-TxUqNBER5wVutht9qL2OgDb55en0NJvs-0-cba8d1df3fb3ffe010b56bcb5cc38745)
设计主函数
在所有基本运算设计好后,为了求两个集合{1,4,2,6,8}和{2,5,3,6}的并集、交集和差集,设计相关的主函数如下。
![](https://epubservercos.yuewen.com/71470A/13467201303429506/epubprivate/OEBPS/Images/Figure-P35_28297.jpg?sign=1738864813-JnvLx91LRUGXBcbDdExwcix0KkxDOo8i-0-0068b8c191b3471b7526819e4409dde6)
从中看到,求解本例应用程序SetApp的结构如图1.24所示,该结构清楚地反映了各种函数的调用关系。
![](https://epubservercos.yuewen.com/71470A/13467201303429506/epubprivate/OEBPS/Images/Figure-P36_28313.jpg?sign=1738864813-DZvJGmuN0A42OdBVneGOndbe8UlB7CUh-0-9ba8ace06742de8db82c5503aa722c2f)
图1.24 应用程序SetApp的结构
程序执行结果
上述程序的执行结果如下。
集合s1:1 4 2 6 8 集合s2:2 5 3 6 集合s1和s2的并集:1 4 2 6 8 5 3 集合s1和s2的差集:1 4 8 集合s1和s2的交集:2 6