任何希望掌握计算机程序设计的读者首先要了解由三门课程构成了程序设计理论底层的黄金三角形,分别是高级语言、数据结构、算法设计与分析。高级语言偏重语法的描述和细节程序设计等能力培养; 数据结构重点讨论程序设计中如何分析、规划和存储实现相关的数据以及关系; 算法设计则偏重解题思路的实现。大部分算法设计首先依赖于数据结构的构造,这将深远影响到程序的时间效率和空间效率,以及程序结构的合理性和程序阅读的简易性。计算机界著名人士尼克劳斯·沃思(Wirth N)提出的“算法+数据结构=程序”的观点正说明数据结构的重要性,即使在面向过程转向面向对象程序设计的今天,对象底层的函数实现依然能体现这句至理名言的准确性。
本人从事数据结构教学已有近三十年,多年教学实践中深刻体会到数据结构是计算机专业的一门很难的课程,学生普遍反映过于抽象和难于编程实现。这反映了几个现实问题: 第一,高级语言课程所教授的内容离数据结构编程需求有一定的距离,高级语言教程通常更多讨论的是数值计算方面的程序设计范例,对于离散结构的讨论相对偏少; 第二,算法设计是数据结构的后续课程,很多设计思想在数据结构课程中暂时无法起到引导作用; 第三,从数据结构本身来看,教材结构或书写方式有时成了学习过程的阻碍。部分数据结构教材偏重理论,全部用算法表述数据结构相关程序设计思想,导致学生可以模仿编程的范例不够,实际效果不大理想。部分教材由于源于翻译国外教材的原因,术语和描述生涩难懂。部分教材重点难点不突出,整体结构不完整,增加了学生的学习困难。
2012年我在清华大学出版社主编出版了《数据结构与程序构建》(C++版),受到了来自全国各地大学生或程序开发工作者的欢迎。他们告诉我,由于我的教材他们能够以最快的速度学习到数据结构的程序设计,效果很理想,并且希望我能推出更多平台的数据结构源码设计。受到这些热情读者和编辑的鼓励,我开始着手编写数据结构的C版程序设计。经过了一段非常值得怀念的日子,我的努力变成了现在这本教材。希望它能为那些只学习过C语言的学生快速掌握数据结构编程做出自己的贡献。
学习数据结构是一种“痛并快乐着”的过程,在学习它的时候大部分学生都会感到过于抽象和高深,但是如果能用程序具体实现,就会体会到激动的成就感,会多次被计算机科学家的奇思妙想所震撼,体会到程序设计的引人入胜,体会到整个过程是充满挑战和乐趣的。
本书最大的特色就是全面给出数据结构的相关程序构建源码,使得学生有一个可以研究、探讨、模仿、提高的平台。本书提供的程序构建范例都具有实用性和趣味性,覆盖了多种程序设计方法和界面设计风格,供学生研究使用。
全书体系结构完整,注重原理与实践结合,重点和难点突出,为学生搭建了一个很全面的学习研究平台。其目标是学生易于学习、教师易于组织教学。鉴于部分学生C语言的编程能力不能满足数据结构多功能同时提供、程序反复运行、处理意外情况等要求,本书全面提供了各种程序界面的细节设计。数据输入方面提供了键盘输入、内部预置、随机产生、文件读入等多种方式供读者模仿学习。递归思想在数据结构的讨论中大量出现,本书单独一章先行讨论,给学生提供了一个良好的基础。排序在完成线性表之后先讲基本部分,体现了线性表的实际使用,而进阶部分涉及更复杂的数据结构,放在大部分数据结构学习完成之后讲解。另外,为了较为全面地体现数据结构的整体关系,本书专门讨论了广义表的实现,这部分构成了线性结构和非线性结构的桥梁,供学生了解掌握。
全书共分15章,按照数据结构学习的基础知识、理论知识和应用三大部分来编写。第一部分涉及学习数据结构的基本概念、C语言复习与归纳、递归思想; 第二部分涉及线性数据结构、非线性数据结构,包含线性表、栈、队列、字符串、二维数组、树和森林、二叉树、图; 第三部分涉及查找、排序等基础应用。为了拓展数据结构的知识,介绍了广义表和文件的基础内容。
相对于C++版的《数据结构与程序构建》,本书的源码进行了重新的设计,相比过去的内容,增加了集合运算、括号匹配判断、文本索引结构、最优二叉树用于哈夫曼编码、查找技术中的平衡二叉树的程序设计源码和歌曲播放等有实用价值的源码,大大提高了本书的源码数量和质量。
本书配有电子教案和程序源代码,便于教师教学和学生使用。本书采用C语言编程实现,程序均在VC++6.0下调试运行通过。
数据结构是程序开发的基础,是进入程序设计殿堂的敲门砖。本书是我多年来勤恳敬业、认真教学和仔细思考的结晶,在付出了很多艰辛之后终于有了今天的收获,希望读者能分享和品味学习的乐趣。
我要感谢我的父母,他们给予了我生命和不断进步的力量,也希望在此专门表达对我爱妻的感激,能写出这本教材,也是对她几十年给我的无微不至关怀和帮助的最好回报,在我的心中她是一个完美的女性,还有我诸多朋友的鼓励和支持让我不能忘怀。
我要感谢我多年前在清华大学研习人工智能研究生课程时的指导老师石纯一教授,他对专业的精通、做事的认真以及平易近人的态度让我的一生都受益匪浅,那段时光是我一生的回忆和骄傲。
我非常感谢我的领导和同事,在我多年讲授数据结构过程中给予我很多的支持和鼓励,感谢周海鹰教授、陈宇峰教授、史旅华教授。
本书能够顺利的出版,得益于清华大学出版社广大员工的支持和鼓励,以及细致的审稿和深入全面的建议,深深地感谢他们。
我要感谢多年来参与程序编写测试、文字校对的学生团队,他们当中有许多我的得意弟子,如何清、陈帅、赵伟、熊锐等。
本书第2章由付勇智老师编写,其他章节由马春江老师编写。
马春江于湖北汽车工业学院
2014年12月31日