C语言程序设计进阶教程
作者 : [美] 陆永祥(Yung-Hsiang Lu) 著
译者 : 徐东 译
丛书名 : 计算机科学丛书
出版日期 : 2017-07-10
ISBN : 978-7-111-56840-7
定价 : 79.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 403
开本 : 16
原书名 : Intermediate C Programming
原出版社: Taylor & Francis -CRC Press
属性分类: 教材
包含CD :
绝版 :
图书简介

本书旨在让中等编程水平的学生提升编程技能,编写出更好的真实程序,修炼成为优秀的程序员。作者向学生展示了如何确定和和消除bug,编写整洁的代码,与他人共享代码,并使用标准的基于Linux的工具,如ddd和valgrind。
本文涵盖许多概念和工具,这些将有助于您的学生写出更好的程序。作者通过向学生解释编程概念以及比较常见的错误和正确的程序,来提高他们的编程技能。

图书特色

“这是一本学习实用软件开发的优秀入门书籍。如果20年前在我当年学习的时候能有这样一本书,一定能给我巨大的帮助......书中的例子令人耳目一新。我认为该书对所有真正想要开发软件的人都能提供帮助。”
—— Gerhard Klimeck,预测材料和装置—纳米计算网络技术中心主任,普渡大学电子与计算机工程教授,
英国皇家物理学会(IOP)、美国物理学会(APS)以及美国电子电气工程师协会(IEEE)院士
“这本书提供了实用的工具和技能,使得学习者可以逐渐成为经验丰富的程序员。书中不仅介绍了如何编写优秀的程序,而且介绍了如何避免糟糕的程序。此外,书中还加入了Linux操作以及版本控制的内容,并且介绍了应用程序以及集成开发环境,可帮助学习者建立开发大规模软件的信心。”
—— Siau Cheng Khoo,新加坡国立大学博士
“这本书以自下而上的、新的角度讲解C语言,这在编程教程中是独一无二的。学习者可以从非常亲切而且实用的视角快速理解C语言的机制。”
—— Niklas Elmqvist, 博士,马里兰大学副教授,项目主任,人机交互科学专家

本书为中级水平的C语言学习者提供了一块垫脚石,使其从编写简短程序成长到可以编写真正的项目。它向学习者介绍了如何查找及消除bug,编写简洁代码,与其他人分享代码,以及实用的基于Linux的标准工具,例如ddd和valgrind。本书通过解释编程概念,以及对比常见错误与正确程序之间的区别,增强了学习者的编程技能。本书还讨论了如何通过调试器以及调试策略进行调试,此外,还研究了编程与离散数学之间的联系。
作者简介
陆永祥(Yung-Hsiang Lu) 现为普渡大学电子和计算机工程学院副教授。他是ACM杰出科学家和杰出讲者,IEEE重启计算计划(Rebooting Computing initiative)成员。他还是2015年首届低功耗图像识别竞赛的主要组织者,IEEE多媒体通信技术委员会多媒体通信系统兴趣组的主席(2014—2016年)。他在2002年获得斯坦福大学电子工程系博士学位。

图书前言

为什么要写这本书
市面上有成百上千种关于编程的书籍,其中有很多都是关于C语言编程的,那么为什么我还要写这本书呢?为什么建议你花时间读它呢?这本书跟其他书有什么不同呢?跟很多作者一样,我写这本书是因为我觉得有必要,觉得这本书中的方法比其他书中的更好。
我将现在已有的关于编程的书分为两类:入门和进阶。入门类书是给初学者写的,一般都假设读者没有编程基础,所以主要是介绍基本的概念。通常以“Hello World!”程序开始,也就是将“Hello World!”输出到电脑屏幕的程序。这种类型的书主要是一步步地介绍语言特点,包括关键词、数据类型、控制结构、字符串、文件操作等,而这些书一般都有一个特点:程序很短,一般是1~2页。这很奏效,因为短程序有助于解释编程语言的新概念。如果把学编程语言比作学自然语言,如英语、汉语、法语、韩语等,这些书就相当于教导如何造句和撰写短段落。
第二类书是写给有程序开发经验的读者的。这些书主要介绍解决现实中的问题的程序,比如关于电脑游戏或者图像。而这类书的例子一般很长,有些甚至几千行代码,因此不会全部印在书本上。书中只会解释程序的其中一部分,而源程序一般保存在CD或者某个网址上。这类书一般不会再介绍如何编程,而是大多专注于解决特定问题的算法研究,有时包括算法性能的详细信息。读者不可能再找到类似于“Hello World!”这样的例子。再比作自然语言的例子,这类书就是在教导如何撰写可能超过20页的短篇小说。
问题是,从写一个段落到写一篇小说,这种跨越太难了。
一本针对中级编程能力的学生的书
市面上很少有针对中级编程能力学生的书籍。这些学生往往已经掌握了编程的基本知识,在看到if或者while时不会茫然,知道如何创建函数和调用函数,有能力编写几十上百行的短代码,却不知道如何处理上千行的程序。他们经常会犯错误,因为大多数入门级的书籍只教导如何编写正确的程序,却不会教导避免常见的错误。他们往往对大多数的概念和那些可以帮助提高编程能力的工具都不太熟悉,他们需要这样一个台阶:可以帮助他们从有能力编写短代码到有能力编写解决现实问题的程序。
现在入门和进阶的空档已经被数据结构和算法的书籍填充了一部分,这类图书一般提供实现数据结构或算法的完整例子。然而这并不是最合适的解决方法,这类图书致力于介绍数据结构和算法,却罕有提供帮助读者编写正确代码的信息。事实上,它们大多只提供程序,而很少解释。它们往往不解释编程概念,比如函数需要一个指针作为实参的原因或者深拷贝与浅拷贝之间的差异等。因此,读者只能自学这些编程技巧。
为了迎合这个需求,我写下这本针对中级编程能力的学生的书,本书适合作为学习编程的第二本教材。
避免出错和调试的重点
我们可以看到有很多关于如何编程的书籍,却很少关于开发软件的书籍。开发软件不是简单地输入代码,它需要更多的知识和技能。为了弥补这种不足,最好就是去研究什么是对的、什么是错的。只解释如何编写正确的程序是不够的,还需要解释常见的错误并将它们与正确的程序进行对比。
一次疏忽可能使程序运行出乎意料,甚至是某些情况下运行正确而另一些情况下出错。这种类型的错误往往很难发现,更别说更正了。本书将介绍一些常见的错误以教导读者如何避免这些错误。调试过程在大多数书中都不会涉及,罕有书籍会提到“调试器”这个词,以至于有些读者都不知道这类工具的存在。学会如何使用调试器一般不超过30分钟,这可以帮助程序员节省很多时间。关于如何使用调试器和调试策略的书籍则更少了。
程序设计和离散数学
程序设计和离散数学是计算机科学中的两个重要学科,然而,大多数书籍都将这两个主题分开,所以很少会在编程的书籍中看到数学公式,同样也很难在离散数学中看到代码。在本书中,这两个主题紧密结合,我相信读者可以从中学到更多的知识。
为什么本书使用C语言?
C语言诞生于20世纪60年代后期和20世纪70年代早期。在C语言发明之后,很多语言也相继出现,这些语言也深受C语言的影响。除了它的历史影响之外,C语言的简单易用也保证了它在几乎所有现代化平台中的重要地位。与许多操作系统一样,Linux是就用C语言编写的,Android基本都是用Java编写的但仍有叫作JNI(Java Native Interface,Java本地接口)的C语言接口。大多数计算机语言都可以与C语言进行通信或通过C语言进行通信,事实上这对一种编程语言而言是有用的,因为大多数操作系统接口都使用C语言。当一个全新的系统被设计出来,C语言通常是第一种(很多情况下是唯一一种)被系统支持的编程语言。
对于具有中级编程能力的学生来说,C语言是一个很好的选择,因为学习C语言需要了解很多计算机概念。langpop.com网站对比了编程语言的受欢迎程度,得出C语言是最受欢迎的语言,紧接着是Java。IEEE Spectrum中的一个报告将编程语言进行排行,主要考虑四类软件:移动应用、企业软件、嵌入式系统和网页。其中嵌入式系统中最受欢迎的就是C语言。四种类型都考虑时,前五名编程语言如下所示:
1. Java(100%)
2. C(99.3%)
3. C++(95.5%)
4. Python(93.4%)
5. C#(92.4%)
可以发现,基于C的编程语言(C、C++、C#)占据了前五席的三席。而Java是受C++影响的。
为什么需要读这本书?
如果你是计算机科学、计算机工程或者电子工程专业的学生,那么就绝对应该读本书。本书包含了很多基本概念,这些概念对于理解计算机中程序的运行方式十分重要。如果你是工程、科学、数学或者技术专业的学生,在学习工作中就很有可能需要用到计算机,而阅读本书将会有很大帮助。即便你不是上述专业的学生,仍然可以在本书中学到很多有用的概念(比如递归)。
作者、审稿人及封面设计师
作者简介
Yung-Hsiang Lu 是美国印第安纳州西拉法叶普渡大学电子与计算机工程学院的副教授。他是美国计算机协会(ACM)的杰出科学家和演说家。2011年8~12月,曾是新加坡国立大学计算机科学系的客座副教授。他在美国加利福尼亚州斯坦福大学电子工程系取得博士
学位。
审稿人简介
Aaron Michaux是美国印第安纳州西拉法叶普渡大学电子与计算机工程学院的一名研究生。他在澳大利亚昆士兰科技大学取得计算机科学学士学位,在加拿大新布伦瑞克圣托马斯大学获得心理学学士学位。Aaron在重新回到学校攻读博士学位之前已经作为专业程序员工作了10年。他的研究方向主要围绕计算机视觉和人类视觉感知。
Pranav Marla是美国印第安纳州西拉法叶普渡大学电子与计算机工程学院的一名本科生。他主修的专业是计算机科学。在计算机工程、心理学和哲学上也稍有涉猎。他希望可以专攻机器学习和人工智能。
封面设计师简介
本书封面是由Kyong Jo Yoon描绘的。他是一名韩国画家,经常在自然场景中加入英雄人物。他是韩国美术协会的一名顾问,他的作品在美国伊利诺伊州芝加哥市的安内森美术馆中展出。
软件开发中的规则
如果由于软件错误,银行每天将你的钱减少0.1%,你会满意吗?你能接受每个月都少走40分钟的手表吗?这两种情况都是“成功了99.9%”,但却都让人无法接受。计算机现在用在很多应用程序中,有些甚至会影响人类的安全。即使你编写的程序在99.9%的时间里都可以正确地运行,那也有可能会在剩余的0.1%的时间里危害人类的生命。这是绝对让人无法接受的,这是一个失败的程序。因此,99.9%的成功就是失败。
如果你住在加州的帕萨迪纳,现在想去纽约,你会走哪条路呢?也许你会去洛杉矶机场,然后坐飞机去纽约。但是纽约在帕萨迪纳的东边,而机场在帕萨迪纳的西边。你为什么不直接开车去东边呢?你为什么要绕路去机场呢?如果你直接开车去东边,而不是去机场排队的话,你就离纽约越来越近了啊。答案很简单:相对于汽车来讲,飞机这一交通工具更适合长途旅行。在程序开发中,有许多用以管理大型软件的开发工具,你需要学习这些工具。没错,学习使用工具会消耗一些时间,但是如果你使用不合适的工具或者不使用工具的话,将浪费更多的时间。花些时间学习使用编程工具将在软件开发和调试时节省大量时间。
尽管经过了数十年的努力,现在的计算机依然没有达到智能化的水平。计算机无法猜测你的想法。如果你写的程序让计算机去做一件错事,那么计算机就会跟随指令去做。如果你的程序是错的,那就是你的责任。计算机无法猜测你的想法。在很多例子中,计算机程序中一个微小的错误就可以造成巨大的财产损失,甚至危及人类的生命。缺少一个分号“;”或者用“,”取代“. ”,程序将无法执行。计算机程序不能容忍任何微小的错误。
通过测试方案并不能保证程序的正确性。测试只能得出一个程序有错误的结论但不能表明一个程序是正确的。为什么呢?测试方案能覆盖所有可能的情景吗?覆盖全部情景是非常困难的,而且在很多情况下是不可能的。因为测试方案很难检测特殊行为,所以一些问题可能会隐藏在你的程序中。
产生正确的输出并不意味着程序是正确的。你会认为一架已经安全起飞并着陆的飞机是安全的吗?如果飞机在漏油,你会在登机前要求航空公司维修飞机吗?如果航空公司回复:“之前没有人受伤,说明这架飞机是安全的。”你会接受航空公司的回应吗?如果司机闯红灯而没出事故的话,是否意味着闯红灯是安全的呢?一个可以产生正确输出的程序就像是一架安全着陆的飞机。可能有很多问题隐藏在安全的表面之下。很多工具可以检测人类隐藏的健康问题,比如X–射线,核磁共振以及超声波扫描。我们也需要工具来检测出隐藏在电脑程序中的问题。即使程序可以产生正确的输出,我们也要对它们进行修改。
你必须假设程序会出问题,并开发出检测和改正问题的策略。在写程序时,应该每次只专注于一小部分。在仔细检查并确保没有问题之后再进行下一部分。对于大多数程序,你需要为了测试这些小的模块而编写额外的程序。虽然这些测试代码并不包含在最终的程序中,但是编写测试程序可以节省大量时间。有时,测试代码可能会比程序本身还要多。我自己的经验建议1:3的比例:最终程序中的1行代码,需要3行测试代码。
没有什么工具可以取代一个清醒的大脑。工具可以提供一些帮助,但是对概念清晰深刻的理解才是最重要的。如果你想成为一名优秀的程序员,那么你需要完全理解每一个细节。不要指望工具可以替你思考:它们做不到。
源代码
本书中所有的程序都可以从github.com上获取。请使用下面的命令获取文件:
…………………………………………
$ git clone ‘https://github.com/yunghsianglu/IntermediateCProgramming.git’
$是Linux终端的shell提示符
…………………………………………

上架指导

计算机\程序设计

封底文字

“这是一本学习实用软件开发的优秀入门书籍。如果20年前在我当年学习的时候能有这样一本书,一定能给我巨大的帮助......书中的例子令人耳目一新。我认为该书对所有真正想要开发软件的人都能提供帮助。”
——Gerhard Klimeck,预测材料和装置—纳米计算网络技术中心主任,普渡大学电子与计算机工程教授,英国皇家物理学会(IOP),美国物理学会(APS)以及美国电子电气工程师协会(IEEE)院士

“这本书提供了实用的工具和技能,使得学习者可以逐渐成为经验丰富的程序员。书中不仅介绍了如何编写优秀的程序,而且介绍了如何避免糟糕的程序。此外,书中还加入了Linux操作以及版本控制的内容,并且介绍了应用程序以及集成开发环境,可帮助学习者建立了开发大规模软件的信心。”
——Siau Cheng Khoo, 新加坡国立大学博士

“这本书以自下而上的、新的角度讲解C语言,这在编程教程中是独一无二的。学习者可以从非常亲切而且实用的视角快速理解C语言的机制。”
——Niklas Elmqvist, 博士,马里兰大学副教授,项目主任,人机交互科学专家

本书为中级水平的C语言学习者提供了一块垫脚石,使其从编写简短程序成长到可以编写真正的项目。它向学习者介绍了如何查找及消除bug,编写简洁代码,与其他人分享代码,以及实用的基于Linux的标准工具,例如ddd和valgrind。本书通过解释编程概念,以及对比常见错误与正确程序之间的区别,增强了学习者的编程技能。本书还讨论了如何通过调试器以及调试策略进行调试,此外,还研究了编程与离散数学之间的联系。

作者简介

[美] 陆永祥(Yung-Hsiang Lu) 著:
陆永祥(Yung-Hsiang Lu)现为普渡大学电子和计算机工程学院副教授。他是ACM杰出科学家和杰出讲者,IEEE重启计算计划(Rebooting Computing initiative)成员。他还是2015年首届低功耗图像识别竞赛的主要组织者,IEEE多媒体通信技术委员会多媒体通信系统兴趣组的主席(2014—2016年)。他2002年获得斯坦福大学电子工程系博士学位。

译者简介

徐东 译:暂无简介

译者序

2013年我到普渡大学陆教授的实验室做访问学者时,读到了《Intermediate C Programming》这本书的初稿。作为一个多年使用C语言基于嵌入式系统编程的科研人员,读完之后我直接找到陆教授,问他能不能把这本书翻译成中文出版。当时本书英文版还没有正式出版,我们便商定说等书出版后,我再联系出版社商量翻译事项。直至今天,我终于结束了翻译工作,也算完成了一个心愿。
读完本书的初稿,我为什么就会产生把它译成中文出版的冲动呢?因为基于自己使用C语言的体会,我产生了强烈的共鸣。读完之后,我觉得十分痛快,用这个词来描述当时的感受挺恰当。就好像有一个问题,自己已经理解到了意会的程度;在和一个朋友讨论时,他条理清晰地把问题言传出来了。本书所编排的内容,就是自己在使用C语言进行开发的过程中逐渐深入理解的内容,我相信这也是C语言使用者在入门之后急需学习的内容。
本书是作者十多年教学经验积累的成果,内容的编排、例程的选择、论述的角度都渗透着美国大学课堂教学中的轻松却严谨的特色。程序是算法+数据结构。作者从C语言中数据的组织形式入手,用对“栈”这一重要概念的讲解开始了C语言的进阶,进而对堆、指针、文件进行了深入形象的阐述。此后,第二部分展开分析了递归程序的思想、实现和应用,用一个典型的问题具体分析了C语言函数的特点。以此为基础,第三部分讨论了几种数据结构的编程应用。最后一部分用应用实例加深读者对前面内容的理解。这种结构的编排体现了本书提高读者C语言编程水平的宗旨,使读者能够循序渐进地理解和掌握C语言的内涵。
我的研究生彭祥、黄倩、曾海宁、吕志宇承担了部分书稿的翻译和校对,在本书的翻译工作中付出了辛勤的劳动,在此表示感谢。还要感谢机械工业出版社华章分社对本书翻译出版的支持。由于译者的水平有限,尽管翻译过程中谨慎动笔,仔细校对,但难免还会存在疏漏,恳请广大读者批评指正。

徐 东
于北航 主北106

图书目录

出版者的话
译者序

前言
第一部分 计算机存储:内存和文件
第1章 程序的执行 2
1.1 编译 2
1.2 重定向输出 6
第2章 栈内存 7
2.1 值和地址 7
2.2 栈 8
2.3 调用栈 9
2.3.1 返回位置 9
2.3.2 函数实参 12
2.3.3 局部变量 14
2.3.4 值地址 15
2.3.5 数组 16
2.3.6 获取地址 17
2.4 可见度 17
2.5 习题 20
2.5.1 绘制调用栈I 20
2.5.2 绘制调用栈II 20
2.5.3 地址 21
2.6 习题解答 21
2.6.1 绘制调用栈I 21
2.6.2 绘制调用栈II 22
2.6.3 地址 22
2.7 在DDD(命令行调试程序)上检测调用栈 22
第3章 预防、检测及消除bug 26
3.1 开发软件≠编码 26
3.1.1 编程前 26
3.1.2 编程中 27
3.1.3 编程后 28
3.2 常见错误 28
3.2.1 未初始化变量 28
3.2.2 错误数组下标 28
3.2.3 错误数据类型 28
3.3 后执行式和交互式调试 28
3.4 生产代码与测试代码分离 29
第4章 指针 30
4.1 作用域 30
4.2 swap函数 31
4.3 指针 33
4.4 再论swap函数 37
4.5 类型错误 39
4.6 数组和指针 40
4.7 类型规则 43
4.8 指针运算 44
4.9 习题 47
4.9.1 swap函数1 47
4.9.2 swap函数2 48
4.9.3 swap函数3 48
4.9.4 swap函数4 48
4.9.5 swap函数5 49
4.9.6 15 552种变化 49
4.10 习题解答 50
4.10.1 swap函数1 50
4.10.2 swap函数2 50
4.10.3 swap函数3 51
4.10.4 swap函数4 51
4.10.5 swap函数5 51
第5章 编写和测试程序 52
5.1 不同的数组元素 52
5.1.1 main函数 52
5.1.2 areDistinct函数 53
5.1.3 编译和链接 54
5.1.4 make工具 55
5.2 使用Makefile测试 57
5.2.1 生成测试用例 58
5.2.2 重定向输出 58
5.2.3 使用diff去比较输出 58
5.2.4 添加测试到Makefile 59
5.3 无效的内存访问 60
5.4 使用valgrind检查内存访问错误 62
5.5 测试覆盖 64
5.6 限制内核大小 67
5.7 带有死循环的程序 67
第6章 字符串 69
6.1 字符数组 69
6.2 C语言中的字符串函数 72
6.2.1 复制函数:strcpy 72
6.2.2 比较函数:strcmp 73
6.2.3 寻找子字符串函数:strstr 73
6.2.4 寻找字符函数:strchr 74
6.3 理解argv 74
6.4 对子字符串计数 77
第7章 编程问题和调试 80
7.1 实现字符串函数 80
7.1.1 C语言库 80
7.1.2 头文件 80
7.1.3 mystring.h 82
7.1.4 创建输入和正确输出 82
7.1.5 Makefile 86
7.1.6 mystring.c 86
7.1.7 使用const 88
7.2 调试 89
7.2.1 找到死循环 90
7.2.2 找到无效内存访问 91
7.2.3 检测无效内存访问 92
第8章 堆内存 94
8.1 用malloc函数创建数组 94
8.2 栈和堆 96
8.3 返回堆地址的函数 98
8.4 C语言中的二维数组 99
8.5 指针和参数 101
第9章 使用堆内存的编程问题 104
9.1 对数组排序 104
9.1.1 生成测试输入和期望输出 104
9.1.2 重定向输入 105
9.1.3 整数排序 107
9.1.4 使用valgrind检测内存泄漏 110
9.2 使用qsort进行排序 111
9.2.1 qsort 111
9.2.2 比较函数 112
9.2.3 执行范例 114
9.2.4 对字符串排序 115
第10章 读写文件 118
10.1 通过argv传递一个文件名 118
10.2 读取文件 119
10.2.1 读取字符型:fgetc 119
10.2.2 读取整型:fscanf(...%d...) 121
10.3 写入文件 123
10.4 读写字符串 125
第11章 编程解决使用文件的问题 128
11.1 对文件中的整数进行排序 128
11.2 计算字符出现的次数 130
11.3 计算单词出现的次数 132
11.4 如何注释程序 134
第二部分 递归
第12章 递归 138
12.1 在限制条件下选取小球 138
12.1.1 双色球问题 138
12.1.2 三色球问题 139
12.1.3 附加限制条件 140
12.2 单行道 142
12.3 汉诺塔 143
12.4 计算整数分拆 145
12.4.1 计算“1”的个数 147
12.4.2 仅使用奇数进行分拆 148
12.4.3 使用递增数进行分拆 148
12.4.4 交替使用奇偶数进行分拆 149
12.4.5 整数分拆问题的推广 151
12.4.6 解决分拆问题的错误方法 151
第13章 递归函数 152
13.1 在限制条件下选取小球 152
13.2 单行道 155
13.3 汉诺塔 156
13.4 整数分拆 158
13.5 阶乘 159
13.6 斐波那契数列 161
13.7 利用gprof进行性能分析 165
第14章 整数分拆 167
14.1 堆内存和栈内存 168
14.2 追踪递归函数调用 176
14.3 约束条件下的分拆 178
14.3.1 仅使用奇数进行分拆 179
14.3.2 使用递增数进行分拆 179
14.3.3 交替使用奇偶数进行分拆 180
14.3.4 使用gprof和gcov查找性能瓶颈 180
第15章 使用递归解决问题 187
15.1 二分搜索 187
15.2 快速排序 189
15.3 排列组合 195
15.4 栈排序 198
15.4.1 例子1 199
15.4.2 例子2 199
15.4.3 例子3 199
15.4.4 例子4 199
15.4.5 可排序栈 200
15.5 追踪递归函数 203
15.6 一个存在错误的递归函数 205
第三部分 结构
第16章 程序员可定义数据类型 208
16.1 结构体和对象 208
16.2 作为实参传递对象 212
16.3 对象和指针 214
16.3.1 返回一个对象 216
16.3.2 对象和malloc 216
16.4 构造函数和析构函数 218
16.5 结构中的结构 224
16.6 二进制文件和对象 226
第17章 使用结构的编程问题 230
17.1 个人信息库排序 230
17.2 压缩十进制数位 235
17.2.1 数制 235
17.2.2 用1字节表达2个十进制数位 236
17.2.3 位运算 236
17.2.4 压缩和恢复十进制 239
17.2.5 十进制压缩编程 239
17.3 二进制文件和指针 243
第18章 链表 245
18.1 可扩展类型 245
18.2 链表 246
18.3 链表的插入 246
18.4 链表的查找 248
18.5 从链表中删除 249
18.6 打印链表 252
18.7 链表的销毁 253
第19章 使用链表的编程问题 256
19.1 队列 256
19.2 数字排序 256
19.3 稀疏数组 257
19.4 单链表反转 262
第20章 二叉搜索树 264
20.1 二叉搜索树 265
20.2 二叉搜索树的插入 266
20.3 二叉搜索树的搜索 269
20.4 二叉搜索树的遍历 269
20.5 二叉搜索树的删除 272
20.6 二叉搜索树的销毁 274
20.7 主函数main 274
20.8 链接器Makefike 275
20.9 不同的二叉树结构 275
第21章 线程并行编程 278
21.1 并行编程 278
21.2 多任务处理 278
21.3 POSIX线程 279
21.4 子集和 280
21.4.1 生成测试实例 281
21.4.2 字典顺序处理 283
21.4.3 多线程处理 287
21.5 多线程处理过程的交叉运行 289
21.6 线程同步 293
21.7 阿姆达尔定律 295
第四部分 应用
第22章 寻找迷宫出口 298
22.1 迷宫的文件格式 298
22.2 读取迷宫文件 299
22.3 迷宫结构体 303
22.4 逃跑策略 306
22.5 策略的实现 308
22.5.1 canMove函数 308
22.5.2 getOut函数 309
22.5.3 打印访问过的位置 313
第23章 图像处理 316
23.1 图像结构体 316
23.2 图像处理 321
23.2.1 图像像素和颜色 321
23.2.2 处理函数 322
23.2.3 应用一个颜色滤波器 322
23.2.4 图像颜色反转 324
23.2.5 边缘检测 324
23.2.6 颜色均衡 326
第24章 霍夫曼压缩 329
24.1 例程 329
24.2 编码 330
24.2.1 计算频率 330
24.2.2 按频率排序 332
24.2.3 构建编码树 334
24.2.4 创建编码本 342
24.2.5 压缩文件 346
24.2.6 位压缩 349
24.3 解码 353
附录A Linux 370
附录B 版本控制 373
附录C 集成开发环境 376
索引 385

教学资源推荐
作者: [美]加里·R. 赖特(Gary R. Wright),W. 理查德·史蒂文斯(W. Richard Stevens) 著
作者: 严义 包健 周尉 编著
参考读物推荐
作者: (美)Vlada Matena Beth Stearns
作者: Erik Brown
作者: 翟陆续 著