本书系统、全面地论述数据结构的重要内容,包括基本概念和方法、线性表、链表、树、堆结构、图、排序和搜索结构。在充分继承国内外经典教材的合理体系结构和优秀内容的基础上,结合国内实际教学情况编写,内容系统、精炼,且经过优化整合,在深度和广度上有明显增强;突出重点、难点,强调分析问题和解决问题的方法,以及产生这些方法的背景。书中内容都经过编者深入研究,且在教学实践中反复验证,因而较易理解。本书注重启发创新思维,培养能力;概念准确,逻辑性强;自然引用面向对象设计思想,用C++语言描述算法。本书适于作为计算机科学与技术、软件工程以及相关专业的教材,也可供从事相关工作的科技与工程人员参考。本书前言设计解决实际问题的计算机软件系统,首先需要建立被处理对象的数据模型。数据和世上万物一样,都是具有结构的。因此,人们很自然地用数据结构表示应用领域的被处理对象。为了模拟实际问题的求解过程和现实对象的行为,还必须提供对数据结构的相应操作。数据结构的实现是由下一层数据结构表示上一层数据结构,直至由程序设计语言提供的基本数据类型表示的过程。评价数据结构表示优劣的标准主要是其能否方便且有效地实现需要的操作,而实现操作的算法设计及其效率高低也依赖于数据结构表示。因此,数据结构的定义、表示以及操作的实现相互关联,都是数据结构研究的重要内容。计算机软件系统可看成是通过不同层次的数据结构及其操作实现的。通过多层表示,完成计算机对应用领域问题的求解过程。在此,中间层数据结构起着核心作用。数据结构的研究产生了一批通用性强、具有很高实用价值的中间层数据结构,如数组、字符串、集合、线性表、栈、队列、链表、树、图、符号表等。这些结构不仅为我们提供了设计软件系统的有用工具,而且向我们展示了在广泛的应用领域表示与解决问题的精巧思路和技术。系统地学习和掌握数据结构知识和方法,对于提高设计与开发软件系统尤其是复杂软件系统的能力,无疑是十分重要的。因此,数据结构早已成为计算机科学与技术和软件工程等专业的核心课程。数据结构课程内容丰富,涵盖了计算机科学与技术的许多重要的成果,分析问题和解决问题的思路和方法新颖,创新点多,技巧性强,对学生专业素质的培养作用明显,但同时也是一门较难学习的课程。我校计算机科学与工程系开设的"数据结构"课程一直采用美国南加州大学教授E.Horowitz等编著的《数据结构基础》作为教材。该书注重培养学生分析问题、解决问题的能力,在数据结构和算法设计以及时空复杂性分析的深度和广度方面特色明显。但在教学中也感到该书内容的表达形式学生较难理解,方法和技术的论述还不够简明扼要,有的内容不够精炼,部分章节存在一些小错误,教学效果较多依赖于教师的讲解。为此,编者在充分继承该书体系结构和内容优点的基础上,吸收其他教材长处,进行优化整合,并结合自身多年的教学改革与实践经验,编写了这本教材,力图使其系统全面,内容深刻,表达简洁,易于理解,以适应计算机科学与技术及相关专业的教学需要。本书共分为8章。第1章论述数据结构的基本概念和方法,包括数据结构与软件系统,数据抽象与封装,算法,递归,性能分析、性能测量,以及效率与权衡等。特别引入了代价分摊分析方法,将相关的操作序列联系起来分析,从而得到更接近实际代价的结果。此外,还从软件重用的角度描述了C++的模板机制。第2章介绍线性表的概念及其顺序表示方法,讨论了通过线性表表示的多项式、稀疏矩阵和字符串等结构。在描述著名的字符串模式匹配算法KMP时,采用了简明易懂的图示方法。还通过两个字符串的最长公共子序列问题的求解,展示了利用动态规划改进算法效率的方法。由于栈和队列是受限的线性表,因此也被整合到这一章。此章不仅给出了通用栈和队列的实现方法,还分别通过求解迷宫问题、表达式计算以及机场模拟问题描述了栈和队列的应用。第3章论述以链表形式实现线性表的方法和技术,讨论了遍历通用模板类容器对象的游标技术。还介绍了广义表的功能及其实现方法,并结合C++的动态类型,讨论了异构表的实现方法。第4章介绍最基本的非线性结构:树,包括树和森林的概念、二叉树、二叉树的遍历及应用、线索二叉树、胜者树、败者树、森林的二叉树表示及遍历、树在并查集问题中的应用和二叉树计数等。特别给出了有一定难度的中序线索二叉树的后序遍历算法,还给出了生成所有可能的二叉树的算法。第5章介绍支持各种优先队列的堆结构,包括最大堆、最大最小堆、双堆、左偏树、二项式堆和斐波纳契堆。在分析二项式堆和斐波纳契堆的性能时,采用了代价分摊方法。第6章介绍更普遍的非线性结构:图,包括图的定义和表示方法、图的遍历、图的连通性、最小代价生成树、最短路径和传递闭包以及活动网络等。特别讨论了应用斐波纳契堆改进最短路径算法性能的技术。在数据结构中,数据元素之间的次序是一种重要的关系。按照数据元素的特定属性对其进行排序是最频繁的计算任务之一。第7章介绍各种典型的排序方法,包括插入排序、希尔排序、快速排序、归并排序、堆排序、基数排序、基于链表和映射表排序结果的顺序化以及外排序。第8章介绍符号表概念以及实现符号表的各种结构,包括二叉查找树、AVL树、2-3树、Splay树、B树、B+树、Trie、静态散列和动态散列等,特别分析了二叉查找树的平均性能。在分析Splay树的性能时,采用了代价分摊方法。此外,还论述了上述结构的演变关系,帮助读者理解其设计思想。本书可供各种层次的读者选用,既适用于教学,也可供从事相关工作的科技与工程人员参考。可以按"数据结构基础"(64学时,必修)和"高级数据结构"(24~32学时,选修)两门课组织教学。本书的2.4、2.9、3.10、4.5、4.8、4.9、5.2~5.6、6.4、7.8、8.4、8.5、8.7和8.9节可作为"高级数据结构"课程的内容,其余作为"数据结构基础"课程的内容。本书引用了数据结构研究的大量先进成果,在此,作者谨向这些成果的原创者表示崇高的敬意和衷心的感谢。同时,对本书所引用的参考文献的作者也表示衷心的感谢。在本书的写作过程中,作者与徐宝文、孙志挥、王茜、徐冬梅、王树梅、吉根林和张丽晖老师开展了卓有成效的讨论,并由此得到很多启发。南京大学计算机科学与技术系陈道蓄教授认真审读了全部书稿,并提出了十分宝贵的修改意见,在此对他们表示最诚挚的谢意。感谢清华大学出版社的鼓励与支持。感谢东南大学教学改革基金的资助。还要感谢作者的众多学生,他们在数据结构课程学习过程中表现出的热情与执着给了作者很大的鼓励,与他们的讨论和交流使作者对教学内容和教学方法的改进有了更深刻的认识。