下载中心>文集> C语言精品学习文集

C语言精品学习文集

C语言属于高级程序语言的一种,它的前身是“ALGOL”。其创始人是布朗·W·卡尼汉和丹尼斯·M·利奇。经过不断发展,C语言具备了兼备高级语言与低级语言优点、具有丰富数据类型和函数、适合结构化编程的优点。本专题整理了一部分C语言界脍炙人口的佳作供大家交流学习,内容涵盖了从基础到进阶,由于本站网友多活跃于电子设计领域,所以添加了C语言与嵌入式结合的子专题,希望能帮助大家更好地实践。

下载:6103 评论

基础理论 文档列表

简介:

掌握C语言知识并不难,选一两本书籍踏踏实实啃完,把基础理论打扎实。

pdf
C Primer Plus 第6版 中文版
标签:C语言带书签PDF文档CPrimerPlus
积分:10 下载次数:166资源类型:技术书籍上传者:EMST上传时间:2018-08-05
简介:CPrimer Plus(第6版)中文版 [美]Stephen Prata 著 姜佑 译 人民邮电出版社 本书详细讲解了C语言的基本概念和编程技巧。 全书共17章。第1章、第2章介绍了C语言编程的预备知识。第3章~第 15章详细讲解了C语言的相关知识,包括数据类型、格式化输入/输出、运算 符、表达式、语句、循环、字符输入和输出、函数、数组和指针、字符和字 符串函数、内存管理、文件输入输出、结构、位操作等。第16章、第17章介 绍C预处理器、C库和高级数据表示。本书以完整的程序为例,讲解C语言的 知识要点和注意事项。每章末尾设计了大量复习题和编程练习,帮助读者巩 固所学知识和提高实际编程能力。附录给出了各章复习题的参考答案和丰富 的参考资料。 本书可作为C语言的教材,适用于需要系统学习C语言的初学者,也适 用于巩固C语言知识或希望进一步提高编程技术的程序员。 作者简介 Stephen Prata曾在加利福尼亚的马林学院(肯特菲尔德)教授天文学、 物理学和程序设计课程,现已退休。他在加州理工学院获得学士学位,在加 州大学伯克利分校获得博士学位。他最早接触程序设计,是为了利用计算机 给星团建模。Stephen撰写和与他人合著了十几本图书,其中包括C++Primer Plus和UNIX Primer Plus。 献辞 谨将本书献给我的父亲William Prata。 致谢 感谢Pearson的Mark Taber一直都非常关注本书。感谢Danny Kalev在技术 上提供的帮助和建议。
pdf
C和指针 中文带标签
标签:C指针经典
积分:0 下载次数:193资源类型:技术书籍上传者:morkdor上传时间:2020-04-17
简介:《C和指针》提供与C语言编程相关的全面资源和深入讨论。《C和指针》通过对指针的基础知识和高级特性的探讨,帮助程序员把指针的强大功能融入到自己的程序中去。全书共18章,覆盖了数据、语句、操作符和表达式、指针、函数、数组、字符串、结构和联合等几乎所有重要的C编程话题。
pdf
传说中C语言的圣经!The C Programming Language (2nd Edition)清晰PDF版
标签:C语言
积分:1 下载次数:190资源类型:技术书籍上传者:空气上传时间:2013-09-17
简介:传说中C语言的圣经!The C Programming Language (2nd Edition)清晰PDF版 The C Programming Language 2nd Edition   Author:Brian W.Kernighan and Dennis M.Ritchie   Publisher: Prentice Hall   Published: 1988.   Amazon Reviews: Amazon.com   Book Info: Brian W.Kernighan和Dennis M.Ritchie的传世之作. 千千万万程序员和编程爱好者的圣经,每一页都是价值连城的秘诀. 不管你从哪一页信手翻起,最终你都会发现自己已经深陷其中而不能自拔.
pdf
C程序设计语言(第2版·新版).pdf
标签:C程序设计语言第2版·新版
积分:1 下载次数:385资源类型:技术书籍上传者:nn50上传时间:2015-07-03
简介:C程序设计语言(第2版·新版).pdf

C语言进阶 文档列表

简介:

掌握编程技巧、了解C语言库的实现、进阶数据结构与算法。

pdf
C陷阱与缺陷(中文)
标签:C陷阱与缺陷
积分:1 下载次数:346资源类型:技术书籍上传者:sinceyoulove上传时间:2014-03-05
简介:全书分为8章,分别从词法分析、语法语义、连接、库函数、预处理器、可移植性缺陷等几个方面分析了C编程中可能遇到的问题。
rar
C专家编程(Expert C Programming)
标签:C专家编程C语言编程
积分:1 下载次数:139资源类型:应用文档上传者:sharley上传时间:2013-07-15
简介:《C专家编程》展示了最优秀的C程序员所使用的编码技巧,并专门开辟了一章对C++的基础知识进行了介绍。书中C的历史、语言特性、声明、数组、指针、链接、运行时、内存以及如何进一步学习C++等问题进行了细致的讲解和深入的分析。全书撷取几十个实例进行讲解,对C程序员具有非常高的实用价值。本书可以帮助有一定经验的C程序员成为C编程方面的专家,对于具备相当的C语言基础的程序员,本书可以帮助他们站在C的高度了解和学习C++。
pdf
C标准库 “圣经” PDF (中文,扫描版)
标签:C标准库标准库C语言
积分:0 下载次数:413资源类型:技术书籍上传者:lcofjp上传时间:2016-08-24
简介:基本信息 原书名:The Standard C Library 原出版社: Prentice Hall PTR 作者: (美)P.J.Plauger 译者: 卢红星 徐明亮 霍建同 出版日期:2009 年7月 C标准库“圣经”. 提供完整源代码,全面深入阐述库函数的实现与运用.. C程序员必备参考书... 本书是由世界级C语言专家编写的C标准库经典著作。英文版已经重印十多次,影响了几代程序员。. 本书结合C标准的 相关部分,精辟地讲述了每一个库函数的使用方法和实现细节,而这正是一个真正的C程序员所必须掌握的。更重要的是,书中给出了实现和测试这些函数的完整源 代码,可以让你更深入地学习C语言。不仅如此,本书还讨论了一些即使是最有经验的C程序员通常也不熟悉的知识,比如国际化和独立于区域设置的程序的编写、 与构建库相关的概念和设计思想。... 作译者 P. J. Plauger 世界著名的软件技术专家,曾任ISO C标准委员会主席,C/C++ User’s Journal主编,现任ISO C++标准委员会主席。他是C/C++标准库开发领域的大师,所开发的Dinkumware标准库应用广泛。...
rar
数据结构与算法分析:C语言描述
标签:C语言描述有目录高清带源码
积分:0 下载次数:208资源类型:技术书籍上传者:RCSN上传时间:2018-07-28
简介:本书是《Data Structures and Algorithm Analysis in C》一书第2版的简体中译本。原书曾被评为20世纪顶尖的30部计算机著作之一,作者Mark Allen Weiss在数据结构和算法分析方面卓有建树,他的数据结构和算法分析的著作尤其畅销,并受到广泛好评.已被世界500余所大学用作教材。, 在本书中,作者更加精炼并强化了他对算法和数据结构方面创新的处理方法。通过C程序的实现,着重阐述了抽象数据类型的概念,并对算法的效率、性能和运行时间进行了分析。, 全书特点如下:, ●专用一章来讨论算法设计技巧,包括贪婪算法、分治算法、动态规划、随机化算法以及回溯算法, ●介绍了当前流行的论题和新的数据结构,如斐波那契堆、斜堆、二项队列、跳跃表和伸展树, ●安排一章专门讨论摊还分析,考查书中介绍的一些高级数据结构, ●新开辟一章讨论高级数据结构以及它们的实现,其中包括红黑树、自顶向下伸展树。treap树、k-d树、配对堆以及其他相关内容, ●合并了堆排序平均情况分析的一些新结果, 本书是国外数据结构与算法分析方面的标准教材,介绍了数据结构(大量数据的
pdf
[C语言接口与实现:创建可重用软件的技术].(Hanson).郭旭.扫描版
标签:C语言
积分:1 下载次数:184资源类型:技术书籍上传者:tiankai001上传时间:2013-09-09
简介: [C语言接口与实现:创建可重用软件的技术].(Hanson).郭旭.扫描版 由汉森编著的《C语言接口与实现》提倡的是一种基于接口及其实现的设计方法,并且通过对24个接口及其实现的描述详细演示了该方法。这些接口涉及很多计算机领域的知识,包括数据结构、算法、字符串处理和并发程序。这些实现并不是简单的玩具,而是为在产品级代码中使用而设计的。实现的代码是可免费提供的。 由汉森编著的《C语言接口与实现:创建可重用软件的技术》概念清晰、实例详尽,是一本有关设计、实现和有效使用C语言库函数,掌握创建可重用C语言软件模块技术的参考指南。书中提供了大量实例,重在阐述如何用一种与语言无关的方法将接口设计实现独立出来,从而用一种基于接口的设计途径创建可重用的API。 《C语言接口与实现:创建可重用软件的技术》是所有C语言程序员不可多得的好书,也是所有希望掌握可重用软件模块技术的人员的理想参考书,适合各层次的面向对象软件开发人员、系统分析员阅读。
zip
数据结构、算法与应用:C++语言描述(原书第2版)附源码.pdf
标签:算法
积分:2 下载次数:197资源类型:技术书籍上传者:lcofjp上传时间:2018-05-27
简介:全书共分三个部分。第一部分从第1章到第4章,旨在复习C++程序设计的概念以及程序性能的分析和测量方法。第二部分从第5章到第16章,研究数据结构,包括线性表的数组描述和链式描述,以及用这两种描述方法描述的数组和矩阵、栈、队列、字典、二叉树、优先级队列、竞赛树和图等数据结构。第三部分从第17章到第21章,研究常用算法,包括贪婪算法、分而治之算法、动态规划、回溯算法和分支定界算法。 本书内容广博、组织合理、论述清晰、循序渐进,每章包含丰富的习题,对程序性能的分析和测量系统且细致,不仅是数据结构和算法的经典教材,而且是计算机科学与工程领域的理想参考书。 作译者 Sartai Sahni佛罗里达大学计算机与信息科学工程系杰出教授,欧洲科学院院士,美国电气和电子工程师协会(IEEE)、羹国计算机协会(ACM)、美国科学促进会(AAAS)和明尼苏达超级计算机研究所的成员,坎普尔印度理工学院(IIT)的杰出校友。Sahni博士获得1997年IEEE计算机分会的TaylorL Booth教育奖,2003年IEEE计算机分会的W.Wallace McDowel,奖和2003年ACM的Karl Karlstrom杰出教育家奖。他目前还担任ACM《Computing Surveys》期刊的总编辑,还是17个期刊编委会成员。他在坎普尔印度理工学院获得电子工程学士学位,在康奈尔大学获得计算机科学硕士和博士学位,发表过250多篇论文,编写了15本教科书,研究成果所涉及的领域包括有效算法的设计与分析、并行计算,互联网,自动化设计和医用算法。
pdf
大话数据结构 清晰扫描版 完整版
标签:大话数据结构
积分:0 下载次数:358资源类型:技术书籍上传者:Timson上传时间:2014-06-24
简介:《大话数据结构》以一个计算机教师教学为场景,讲解数据结构和相关算法的知识。通篇以一种趣味方式来叙述,大量引用了各种各样的生活知识来类比,并充分运用图形语言来体现抽象内容,对数据结构所涉及到的一些经典算法做到逐行分析、多算法比较。与市场上的同类数据结构图书相比,《大话数据结构》内容趣味易读,算法讲解细致深刻,是一本非常适合自学的读物。   《大话数据结构》主要内容包含:数据结构介绍、算法推导大o阶的方法;顺序结构与链式结构差异、栈与队列的应用;串的朴素模式匹配、kmp模式匹配算法;二叉树前中后序遍历、赫夫曼树及应用;图的深度、广度遍历;最小生成树两种算法、最短路径两种算法;拓扑排序与关键路径算法;折半查找、插值查找、斐波那契查找等静态查找;稠密索引、分块索引、倒排索引等索引技术;二叉排序树、平衡二叉树等动态查找;b树、b+树技术,散列表技术;冒泡、选择、插入等简单排序;希尔、堆、归并、快速等改进排序……   《大话数据结构》适合学过一门编程语言的各类读者,包括在读的大中专计算机专业学生、想转行做开发的非专业人员、欲考计算机研究生的应届或在职人员,以及工作后需要补学或温习数据结构和算法的程序员等。 前言 本书起因   大家好!我是《大话设计模式》(2008年初出版)的作者,三年来,承蒙广大读者的厚爱,《大话设计模式》取得了较大的成功。仅在当当网,截止本文写作时,就已经有1073次评论,705次5星评价,位居五星图书榜计算机/网络类的累计总榜第二名。此书已经成为国内原创计算机类图书最畅销的书籍之一。   对于这样一个自己喜欢做、可以做得好,而且已经得到了市场广泛认可,为很多朋友提供帮助的事情,我没有理由不去继续做下去。这就是我准备再写书的原因。   我曾做过调查,数据结构的学习者大多都有这样的感慨:数据结构很重要,一定要学好,但数据结构比较抽象,有些算法理解起来很困难,学得很累。可我更希望传达这样的信息:数据结构非常有趣,很多算法是智慧的结晶,学习它是去感受计算机编程技术的魅力,在理解掌握它的同时,整个过程都是一种愉悦的精神感受,而非枯燥乏味的一门课程。因此我决定写作一本关于数据结构有趣的书。   不过现实总比理想来得更“现实”。要想把书写好,谈何容易,我需要突破很多困难……嗐!不管如何,现在您看到了本书,那就说明我已经克服了困难战胜了自己。希望您可以喜欢上这本书。   本书定位   本书的定位就是一本适合读者自学数据结构的书籍,它有区别于教材,希望给大家另一种阅读体验。   通常讲解数据结构的图书都是以教材的方式呈现。在写作前,我购买或在图书馆借阅了十几本非常好的数据结构相关教材用来为写作本书做准备。但经过认真阅读后,我发现,它们大多不是一本好的“自学读物”。   我没有轻视这些好书的意思,不过教材和自学读物,所面向的读者是完全不同的。   好的教材应该是提纲挈领、重点突出,一定要留出思考的空间,否则就没必要再听老师上课了。很多内容的讲解是由老师在课堂完成,教材中有练习、课后习题、思考题等,这些大多可以通过老师来解答。比如我们中学时的语文、数学课本,很薄的一本书通常要用一学期、甚至一年的时间来学习,这就是因为它们是教材而不是自学读物。如果是小说,可能一两天就读完了。   好的自学读物的目标是让初学者“独自”全盘掌握知识,需要强调“独自”一词,这就说明读者在阅读时,是完全依靠自己的力量来向未知发出挑战。因此书中内容,要么不写,写了就应该写透。如果读者在阅读时总是疑惑重重,那么这本书就有很大的问题了。   我也就是在基于这样的认识,决心将《大话数据结构》真正写成一本关于数据结构和算法的自学读物来展开写作的。   本书特色   1.趣味引导   大部分的编程类图书,在内容上基本都是直奔主题。但是尼采曾说过:“人们无法理解他没有经历过的事情。”换句话说,我们只接受过去早已理解的事物相关的信息。这是一种比较学习过程,在这个过程中,大脑寻找每条信息之间的联系。所以教育专家普遍认为,吸引学生的注意力,比较好的办法是用他们比较熟知的知识开始。   因此在本书中,我会用一个故事、一个趣味题目、一部电影的介绍等形式来作为每一章甚至很多小节的开头,选择的内容也多多少少与要讲的主题内容相关。这并不是多余,而是有意为之。事实上,这样的形式在我的前一本书中已经得到了普遍认可。   2.图文并茂   西方有句谚语,“A picture is worth a thousand words.(一图值千言)”。用上千个字描述不明白的东西,很可能一张图就能解释清楚。   我非常认可这个观点,所以本书虽没有达到每一页都有图,但基本做到了绝大部分讲解都有相关图示,关键算法更是通过多图逐步分解剖析。尽管这带来了写作上的难度,但却可以达到较好的效果。毕竟,读者通过本书开始学习数据结构时,要从一无所知或略知一二到完全理解,甚至掌握应用,是需要一个比较艰苦的过程,用大量的图示可以减少这个过程的长度。   3.代码详解 .  我在写作中尽量摒弃了传统数据结构教材的“重理论思想而轻代码讲解”的作法。在准备数据结构写作时我发现,很多教材对数据结构理论和算法设计思想讲得比较好,可一到实际代码时,有的把代码贴出来加少量注释,有的直接用伪代码形式。这对于上课的学生还好,毕竟有老师在课堂中去详解代码编写原理,可是对于初学数据结构和算法的自学者而言,如果书中不去解释代码某些细节为什么那样编写的原因,甚至代码根本不可能在某个编译器中运行通过,其挫折感是很强烈的。比如即使理解了图结构中的最短路径求解原理,也可能无法写出最短路径的算法。   我把代码在运行过程中变量的变化融入到整个算法设计思想的讲解中,配合相应的示意图,会帮助大家更加容易理解算法的实质。这种讲解模式在本书的第6、7、8、9章的很多复杂算法中有具体体现,越是复杂的代码越是讲解细致。这算是本书的一个特色,希望对读者有帮助。   4.形式新颖   我把本书的内容虚构成了一个老师上课的场景,所有内容都通过这位老师表达出来,书中的文字非常口语化,这样做的目的是为了更加直观地让读者感觉,自己是在学习,是在上课。有人可能会说,现在的课堂大都是让人昏昏欲睡,把读者带入上课场景,不是更加让读者犯困吗?我觉得如果你的学习经历中听过一些优秀老师的课,你就不会下这样的结论。好的老师讲课,是可以做到引人入胜的。   有人可能会问,我为什么不用《大话设计模式》中的对话形式,而采用讲课形式呢?这是对数据结构这门学问的特点考虑的。设计模式主要都是思想体现,通常会仁者见仁、智者见智,用对话展开比较容易;而数据结构中更多的是定义、术语、经典算法等,这些公认的知识,可讨论的地方并不多,更多的是需要把它讲清楚。让两个人在一起讨论某个设计模式的优缺点,会非常合适,而讨论数据结构定义的好坏,就没有太大意义了,不如让一个老师告诉学生数据结构的定义好在哪里更符合实际。因此用传统的讲课形式会好一些。   另外,本书没有习题,有思考的题目也一定会给出某种答案。但本书每个复杂知识点的末尾,都会提供另一本书的进一步阅读建议。这也是基于它是一本自学读物的原则。读者阅读本书可能是任何时间任何地方,如果书中存在没有解答的习题,碰到了困难是没法及时找到老师来帮助的,因此本书尽量避免让读者有这样的困惑存在。如果需要练习的同学,我觉得还是应该考虑再去买本习题集来学习。学习数据结构和算法,做题和上机写代码非常有必要,从这个角度也说明,阅读完本书其实也只是完成入门而已。   本书既然是以老师上课的形式来进行,那就免不了要融入一名教师除了授业解惑以外,还要传达一些个人价值观的体现。书中很多细微处,如对某位科学家的尊敬、对某个算法的推崇、对勤奋励志故事的讲述等都在表达着一个老师向学生传递真、善、美的意愿。我始终认为,读者拿到的虽然只是一本没有表情、不会说话的书,但其实也是在隔空与另一个朋友交流。人与人的交流不可能只是就事论事,一定会有情感的沟通,这种情感如果能产生共鸣、达成互信,就会让事情(比如学习数据结构与算法这件事)本身更容易理解和接受。   本书内容   本书主要是按照教育部关于计算机专业数据结构课程大纲的要求略微增减来组织内容的。   主要包括:数据结构介绍,算法推导大O阶的方法,线性表结构的介绍,顺序结构与链式结构差异,栈与队列的应用,串的朴素模式匹配、KMP模式匹配算法,树结构的介绍,二叉树前中后序遍历,线索二叉树,赫夫曼树及应用,图结构的介绍,图的深度、广度遍历,最小生成树两种算法,最短路径两种算法,拓扑排序与关键路径算法,查找应用的相关介绍,折半查找、插值查找、斐波那契查找等静态查找,稠密索引、分块索引、倒排索引等索引技术,二叉排序树、平衡二叉树等动态查找,B树、B+树技术,散列表技术,排序应用的相关介绍,冒泡、选择、插入等简单排序,希尔、堆、归并、快速等改进排序,各位排序算法的对比等。   本书读者   数据结构是计算机软件相关专业的基础课程,几乎可以说,要想从事编程工作,无论你是否是科班出身,都不可以绕过这部分知识。因此,适合阅读本书的读者非常广泛,包括在读的本专科、中专职高技校等计算机专业学生、想转行做开发的非专业人员、欲考计算机研究生的应届或在职人员,以及工作后需要补学或温习数据结构和算法的程序员等各类读者。   本书对读者的技术背影要求比较低,只要是学过一门高级编程语言,例如C、C++、Java、C#、VB等就可以开始阅读本书。不过由于当中涉及到比较复杂的算法知识,需要读者有一定的数学修养和逻辑思维能力,否则可能书籍的后半部分阅读起来会比较吃力。   本书研读方法   事实上,任何有难度的知识和技巧,都不是那么容易被掌握的。我尽管已经朝着通俗易懂的方向努力,可有些数据结构,特别是经典算法,是几代科学家的智慧结晶,因此要掌握它们还是需要读者的全力投入。   美国畅销书《如何阅读一本书》中提到“阅读可以是一件主动的事,阅读越主动,效果越好。拿同样的书给背景相近的两个人阅读,一个人却比另一个人从书中得到了更多,这是因为,首先在于这人的主动,其次,在于他在阅读中的每一种活动都参与了更多的技巧。这两件事是息息相关的。阅读是一个复杂的活动,就跟写作一样,包含了大量不同的活动。要达成良好的阅读,这些活动都是不可或缺的。一个人越能良好运作这些活动,阅读的效果也就越好。”   我当然希望读者在阅读本书后收获巨大,但这显然是一厢情愿。要想获得更多,您可能也需要付出类似我写作一样的力气来阅读,例如摘抄文字、眉批心得、稿纸演算、代码输入电脑,以及您自己在编程工作中的运用等。这些相应活动的执行,将会使您得到巨大的收获。   作为作者,建议本书的研读方法为:   1.复习C语言的基础知识。如果你掌握的是别的语言也不要紧,适当了解一些C语言和你掌握的编程语言的语法差异还是有必要的。甚至将本书代码改造成另一种语言本身就是一种非常好的学习方法。   2.阅读第一遍时,建议从头至尾进行。如果你对前面的知识有足够了解,当然可以跳过直接阅读后面的章节。不过若要学习一门完整的知识并形成体系。通读本书,还是最好的学习方法。   3.阅读时,摘抄是非常好的习惯。“最淡的墨水也胜于最强的记忆!”有不少读者会认为摘抄了将来也不会再去看,有什么必要,但其实在写字的过程就是大脑学习的过程,写字在减缓你阅读的速度,从而让你更好地消化阅读的内容。相信大家都能理解,“囫囵吞枣”和“慢慢品味”的差异,学习同样如此。   4.阅读每一章时,特别是在阅读算法的推导过程时,一定要在电脑中运行代码(本书源码的下载地址可以到http://cj723.cnblogs.com中的《大话数据结构相关主题》中找到),了解代码的运行过程。本书的很多算法都做到了逐行讲解,但单纯阅读可能真的很难达到理解的程度(这是纸质书无法克服的缺陷),需要你通过开发工具调试,并设置断点和逐行执行,并参照书中的讲解,观察变量的变化情况来理解算法的编写原理。   5.阅读完每一章时,一定要在理解基础上记忆一些关键东西。最佳的效果就是你可以不看书也做到一点不错地默写出相关算法。   6.阅读完每一章时,一定要适当练习。本书没有提供练习题,但市场上相关的数据结构习题集比比皆是,可以选择尝试。另外互联网上也可以获得足够的习题来给你练习。练习的目的是为了检测自己是否真的完全理解了书中的内容。事实上很多时候,阅读中的人们只是自我感觉理解,而并非真正的明白。   7.学习不可能一蹴而就,数据结构和算法如果通过一本书就可以掌握,那本身就是笑话。本书附录提供了本书写作时的参考书目,基本都是最优秀的数据结构或相关的中文书籍各有侧重,建议大家可以适当地阅读。   8.在之后的编程学习和工作中,尽量把已经学到的数据结构和算法知识运用到现实开发中。遗忘时翻阅本书回顾相关内容,最终达到精通数据结构和相关算法的境界。   编程语言说明   本书是用C语言编写,基于C90(ISO C)的标准。读者可以选择任何一款基于C90标准的C语言开发工具或更高版本的开发工具来学习本书中的代码。   本人一直习惯于用Visual Studio 2008作为开发工具,因此在写作此书时,也是用此工具的Visual C++来编译调试代码,一切都相安无事,但写作完成后,考虑到不同读者应用开发工具的习惯不同,最终在编辑的建议下,决定提供一份可在C90标准的C语言开发环境中编译通过的代码,结果发现错误百出。   例如C90标准的注释要求是“/* 注释文字 */”而不允许是“//注释文字”:要求变量声明必须要在函数的最前面,只能是“int i; for(i=0;i[n;i++)……”,而不允许如“for (int i=0;i[n;i++)”这样的方式:再比如C++中函数的参数可以传递如“void CreateBiTree(BiTree &T)”的地址变量,但在C语言中,只能传递如“void CreateBiTree(BiTree *T)”的指针变量。因此当你看到书中的有些代码到处都是“*”时,就用不着奇怪了。   出于为了让代码可以在低端编译环境通过的考虑,牺牲一些代码的简捷性和优雅性也是无可奈何和必要的。最终我将书中全部代码都改成C90标准的代码。   C语言初学者可能会因为刚接触编程语言,特别是对指针的理解不深,而担心阅读困难。我个人感觉,单纯学习指针是很难理解它的真正用途和好处,而通过学习数据结构,特别是像链式存储结构在各种结构算法中的运用,反而可以让读者进一步的理解指针的优越之处。从这个角度说,数据结构的学习可以反过来加强读者对C语言,特别是指针概念的理解。   编程语言差异   C语言是一门古老的高级语言,它的应用范围非常广泛,因此我选择它作为本书的算法展示语言。如果读者之前学过它,那么阅读本书就不存在语言障碍。懂得C++语言的读者,同样也不会有任何语言上的问题。   像掌握Java、C#、VB等面向对象语言的读者,当面对书中大量的C语言式的结构(struct)声明和针对结构的参数传递的代码时,都可以理解为是类的定义和由类生成对象的传递。尽管的确存在差异,但是并不影响整体对数据结构知识和算法原理的理解。   我个人感觉,哪怕是对C语言不熟悉,也不妨利用学习数据结构的机会,学习一下C语言的编程方法,这对于将来应用其他高级语言也是有很大帮助的。   不是一个人在战斗   首先要感谢我的妻子李秀芳对我写作本书期间的全力支持,我辞职写作,没有她精神上的理解鼓励和生活上的悉心照顾,是不可能走出这一步并顺利完成书稿的。我们的儿子程晟涵如今已经三周岁,我是在他每日的欢声笑语和哭哭啼啼中进行每一章节的构思和写作,希望他可以茁壮成长。我的父母已经年迈,他们为我的全职创作也甚为担心和忧虑,这里也要说一声抱歉。   本人数据结构的知识,是源自清华大学出版社出版的《数据结构(C语言版)》(严蔚敏、吴伟民编著)一书,严老师和吴老师算是我在数据结构方面的启蒙老师,本书的不少内容和代码也是参考了此书。机械工业出版社的《算法导论》对于本人的算法知识提高帮助很大,写作中也大量吸收了书中的精华。写作过程中,本人购买和借阅了与数据结构相关的大量书籍,详细书目见附录。没有前辈的贡献,就没有本书的出版,也希望本书能成为这些书籍的前期读物。在此向这些图书作者表示衷心的感谢。   仅有作者是不可能完成图书的出版的,本人要非常感谢清华大学出版社的朋友们,他们是本书的最初读者,也是协助本人将此书由毛糙变精良的最有力帮手。   本书的封面设计程瑜、插图设计周翔,都是在反反复复的修改中完成创作的。   写作中,还得到了周筠、卢鸫翔、张伸、胡文佳、Milo、陈钢、刘超、刘唯一、杨绣国、戚妩婷、雷顺、杨诗盈、高宇翔、林健的友情帮助,他们都在本人的书稿创作中提出了宝贵建议。   在此向所有帮助与支持我的朋友道一声:谢谢!   程 杰    《大话数据结构》 第1章数据结构绪论 1 1.1开场白 2 如果你交给某人一个程序,你将折磨他一整天;如果你教某人如何编写程序,你将折磨他一辈子。 1.2你数据结构怎么学的? 3 他完成开发并测试通过后,得意地提交了代码。项目经理看完代码后拍着桌子对他说:“你数据结构是怎么学的?” 1.3数据结构起源 4 1.4基本概念和术语 5 正所谓“巧妇难为无米之炊”,再强大的计算机,也要有“米”下锅才可以干活,否则就是一堆破铜烂铁。这个“米”就是数据。 1.4.1数据 5 1.4.2数据元素 5 1.4.3数据项 6 1.4.4数据对象 6 1.4.5数据结构 6 1.5逻辑结构与物理结构 7 1.5.1逻辑结构 7 1.5.2物理结构 9 1.6抽象数据类型 11 大家都需要房子住,但显然没钱考虑大房子是没有意义的。于是商品房就出现了各种各样的户型,有几百平米的别墅,也有仅两平米的胶囊公寓…… 1.6.1数据类型 11 .1.6.2抽象数据类型 12 1.7总结回顾 14 1.8结尾语 15 最终的结果一定是,你对着别人很牛的说“数据结构——就那么回事。” 第2章算法 17 2.1开场白 18 2.2数据结构与算法关系 18 计算机界的前辈们,是一帮很牛很牛的人,他们使得很多看似没法解决或者很难解决的问题,变得如此美妙和神奇。 2.3两种算法的比较 19 高斯在上小学的一天,老师要求每个学生都计算1+2+…+100的结果,谁先算出来谁先回家…… 2.4算法定义 20 现实世界中的算法千变万化,没有通用算法可以解决所有问题。甚至一个小问题,某个解决此类问题很优秀的算法却未必就适合它。 2.5算法的特性 21 2.5.1输入输出 21 2.5.2有穷性 21 2.5.3确定性 21 2.5.4可行性 21 2.6算法设计的要求 22 求100个人的高考成绩平均分与求全省所有考生的成绩平均分在占用时间和内存存储上有非常大的差异,我们自然追求高效率和低存储的算法来解决问题。 2.6.1正确性 22 2.6.2可读性 23 2.6.3健壮性 23 2.6.4时间效率高和存储量低 23 2.7算法效率的度量方法 24 随着n值越来越大,它们在时间效率上的差异也就越来越大。好比有些人每天都在学习,而另一些人,打打游戏、睡睡大觉,毕业后前者名企争着要,后者求职处处无门。 2.7.1事后统计方法 24 2.7.2事前分析估算方法 25 2.8函数的渐近增长 27 2.9算法时间复杂度 29 理解大o推导不算难,难的其实是对数列的一些相关运算,这考察的更多的是数学知识和能力。 2.9.1算法时间复杂度定义 29 2.9.2推导大o阶方法 30 2.9.3常数阶 30 2.9.4线性阶 31 2.9.5对数阶 32 2.9.6平方阶 32 2.10常见的时间复杂度 35 有些时候,告诉你某些东西不可以去尝试,也是一种知识的传递。总不能非要去被毒蛇咬一口才知道蛇不可以去招惹吧。 2.11最坏情况与平均情况 35 2.12算法空间复杂度 36 事先建立一个有2050大的数组,然后把所有年份按下标数字对应,如果是闰年,此数组项的值就是1,如果不是就是0。这样,所谓的判断某一年是否是闰年就变成了查找这个数组的某一项的值是多少的问题。 2.13总结回顾 37 2.14结尾语 38 愚公移山固然可敬,但发明炸药和推土机,可能更加实在和聪明。 第3章线性表 41 3.1开场白 42 门外家长都挤在大门口与门里的小孩子的井然有序,形成了鲜明对比。哎,有时大人的所作所为,其实还不如孩子。 3.2线性表的定义 42 3.3线性表的抽象数据类型 45 有时我们想知道某个小朋友(比如麦兜)是否是班级的同学,老师会告诉我说,没有,麦兜是在春田花花幼儿园里。这种查找某个元素是否存在的操作很常用。 3.4线性表的顺序存储结构 47 他每次一吃完早饭就冲着去了图书馆,挑一个好地儿,把他书包里的书,一本一本的按座位放好,长长一排,九个座硬是被他占了。 3.4.1顺序存储定义 47 3.4.2顺序存储方式 47 3.4.3数据长度与线性表长度区别 48 3.4.4地址计算方法 49 3.5顺序存储结构的插入与删除 50 春运时去买火车票,大家都排队排着好好的,这时来了一个美女:“可否让我排在你前面?”这可不得了,后面的人像蠕虫一样,全部都得退后一步。 3.5.1获得元素操作 50 3.5.2插入操作 51 3.5.3删除操作 52 3.5.4线性表顺序存储结构的优缺点 54 3.6线性表的链式存储结构 55 反正也是要让相邻元素间留有足够余地,那干脆所有元素都不要考虑相邻位置了,哪有空位就到哪里。而只是让每个元素知道它下一个元素的位置在哪里。 3.6.1顺序存储结构不足的解决 办法 55 3.6.2线性表链式存储结构定义 56 3.6.3头指针与头结点的异同 58 3.6.4线性表链式存储结构代码描述 58 3.7单链表的读取 60 3.8单链表的插入与删除 61 本来是爸爸左牵着妈妈的手、右牵着宝宝的手在马路边散步。突然迎面走来一美女,爸爸失神般地望着,此情景被妈妈逮个正着,于是扯开父子俩,拉起宝宝的左手就快步朝前走去。 3.8.1单链表的插入 61 3.8.2单链表的删除 64 3.9单链表的整表创建 66 3.10单链表的整表删除 69 3.11单链表结构与顺序存储结构优缺点 70 3.12静态链表 71 对于一些语言,如basic、fortran等早期的编程高级语言,由于没有指针,这链表结构,按照前面我们的讲法,它就没法实现了。怎么办呢? 3.12.1静态链表的插入操作 73 3.12.2静态链表的删除操作 75 3.12.3静态链表优缺点 77 3.13循环链表 78 这个轮回的思想很有意思。它强调了不管你今生是穷是富,如果持续行善积德,下辈子就会好过,反之就会遭到报应。 3.14双向链表 81 就像每个人的人生一样,欲收获就得付代价。双向链表既然是比单链表多了如可以反向遍历查找等的数据结构,那么也就需要付出一些小的代价。 3.15总结回顾 84 3.16结尾语 85 如果你觉得上学读书是受罪,假设你可以活到80岁,其实你最多也就吃了20年苦。用人生四分之一的时间来换取其余时间的幸福生活,这点苦不算啥。 第4章栈与队列 87 4.1开场白 88 想想看,在你准备用枪的时候,突然这手枪明明有子弹却打不出来,这不是要命吗。 4.2栈的定义 89 类似的很多软件,比如word、photoshop等,都有撤消(undo)的操作,也是用栈这种思想方式来实现的。 4.2.1栈的定义 89 4.2.2进栈出栈变化形式 90 4.3栈的抽象数据类型 91 4.4栈的顺序存储结构及实现 92 4.4.1栈的顺序存储结构 92 4.4.2栈的顺序存储结构进栈操作 93 4.4.3栈的顺序存储结构出栈操作 94 4.5两栈共享空间 94 两个大学室友毕业同时到北京工作,他们都希望租房时能找到独自住的一室户或一室一厅,可找来找去发现,实在是承受不起。 4.6栈的链式存储结构及实现 97 4.6.1栈的链式存储结构 97 4.6.2栈的链式存储结构进栈操作 98 4.6.3栈的链式存储结构出栈操作 99 4.7栈的作用 100 4.8栈的应用——递归 100 当你往镜子前面一站,镜子里面就有一个你的像。但你试过两面镜子一起照吗?如果a、b两面镜子相互面对面放着,你往中间一站,嘿,两面镜子里都有你的千百个“化身”。 4.8.1斐波那契数列实现 101 4.8.2递归定义 103 4.9栈的应用——四则运算表达式求值 104 4.9.1后缀(逆波兰)表示法定义 104 4.9.2后缀表达式计算结果 106 4.9.3中缀表达式转后缀表达式 108 4.10队列的定义 111 电脑有时会处于疑似死机的状态。就当你失去耐心,打算了reset时。突然它像酒醒了一样,把你刚才点击的所有操作全部都按顺序执行了一遍。 4.11队列的抽象数据类型 112 4.12循环队列 113 你上了公交车发现前排有两个空座位,而后排所有座位都已经坐满,你会怎么做?立马下车,并对自己说,后面没座了,我等下一辆?没这么笨的人,前面有座位,当然也是可以坐的。 4.12.1队列顺序存储的不足 112 4.12.2循环队列定义 114 4.13队列的链式存储结构及实现 117 4.13.1队列链式存储结构入队操作118 4.13.2队列链式存储结构出队操作 119 4.14总结回顾 120 4.15结尾语 121 人生,需要有队列精神的体现。南极到北极,不过是南纬90度到北纬90度的队列,如果你中途犹豫,临时转向,也许你就只能和企鹅相伴永远。可事实上,无论哪个方向,只要你坚持到底,你都可以到达终点。 第5章串 123 5.1开场白 124 “枯眼望遥山隔水,往来曾见几心知?壶空怕酌一杯酒,笔下难成和韵诗。途路阻人离别久,讯音无雁寄回迟。孤灯夜守长寥寂,夫忆妻兮父忆儿。”……可再仔细一读发现,这首诗竟然可以倒过来读。 5.2串的定义 124 我所提到的“over”、“end”、“lie”其实就是“lover”、“friend”、“believe”这些单词字符串的子串。 5.3串的比较 126 5.4串的抽象数据类型 127 5.5串的存储结构 128 感情上发生了问题,为了向女友解释一下,我准备发一条短信,一共打了75个字。最后八个字是“我恨你是不可能的”,点发送。后来得知对方收到的,只有70个字,短信结尾是“……我恨你”。 5.5.1串的顺序存储结构 129 5.5.2串的链式存储结构 131 5.6朴素的模式匹配算法 131 主串为s=”00000000000000000000000000000000000000000000000001”,而要匹配的子串为t=”0000000001”,……在匹配时,每次都得将t中字符循环到最后一位才发现,哦,原来它们是不匹配的。 5.7kmp模式匹配算法 135 很多年前我们的科学家觉得像这种有多个0和1重复字符的字符串,却需要挨个遍历的算法,是非常糟糕的事情。 5.7.1kmp模式匹配算法原理 135 5.7.2next数组值推导 139 5.7.3kmp模式匹配算法实现 141 5.7.4kmp模式匹配算法改进 142 5.7.5nextval数组值推导 144 5.8总结回顾 146 5.9结尾语 146 《璇玑图》共八百四十字,纵横各二十九字,纵、横、斜、交互、正、反读或退一字、迭一字读均可成诗,诗有三、四、五、六、七言不等,目前有人统计可组成七千九百五十八首诗。听清楚哦,是7958首。 第6章树 149 6.1开场白 150 无论多高多大的树,那也是从小到大的,由根到叶,一点点成长起来的。俗话说十年树木,百年树人,可一棵大树又何止是十年这样容易。 6.2树的定义 150 树的定义其实就是我们在讲解栈时提到的递归的方法。也就是在树的定义之中还用到了树的概念,这是比较新的一种定义方法。 6.2.1结点分类 152 6.2.2结点间关系 152 6.2.3树的其他相关概念 153 6.3树的抽象数据类型 154 6.4树的存储结构 155 6.4.1双亲表示法 155 6.4.2孩子表示法 158 6.4.3孩子兄弟表示法 162 6.5二叉树的定义 163 苏东坡曾说:“人有悲欢离合,月有阴晴圆缺,此事古难全”。意思就是完美是理想,不完美才是人生。我们通常举的例子也都是左高右低、参差不齐的二叉树。那是否存在完美的二叉树呢? 6.5.1二叉树特点 164 6.5.2特殊二叉树 166 6.6二叉树的性质 169 6.6.1二叉树性质1 169 6.6.2二叉树性质2 169 6.6.3二叉树性质3 169 6.6.4二叉树性质4 170 6.6.5二叉树性质5 171 6.7二叉树的存储结构 172 6.7.1二叉树顺序存储结构 172 6.7.2二叉链表 173 6.8遍历二叉树 174 你人生的道路上,高考填志愿要面临哪个城市、哪所大学、具体专业等选择,由于选择方式的不同,遍历的次序就完全不同。 6.8.1二叉树遍历原理 174 6.8.2二叉树遍历方法 175 6.8.3前序遍历算法 178 6.8.4中序遍历算法 181 6.8.5后序遍历算法 184 6.8.6推导遍历结果 184 6.9二叉树的建立 187 6.10线索二叉树 188 我们现在提倡节约型社会,一切都应该节约为本。对待我们的程序当然也不例外,能不浪费的时间或空间,都应该考虑节省。 6.10.1线索二叉树原理 188 6.10.2线索二叉树结构实现 191 6.11树、森林与二叉树的转换 195 有个乡镇企业也买了同样的生产线,老板发现这个问题后找了个小工来说:你必须搞定,不然炒你鱿鱼。小工很快想出了办法:他在生产线旁边放了台风扇猛吹,空皂盒自然会被吹走。 6.11.1树转换为二叉树 196 6.11.2森林转换为二叉树 197 6.11.3二叉树转换为树 197 6.11.4二叉树转换为森林 199 6.11.5树与森林的遍历 199 6.12赫夫曼树及其应用 200 压缩而不出错是如何做到的呢?简单的说,就是把我们要压缩的文本进行重新编码,以达到减少不必要的空间的技术。压缩和解压缩技术就是基于赫夫曼的研究之上发展而来,我们应该记住他。 6.12.1赫夫曼树 200 6.12.2赫夫曼树定义与原理 203 6.12.3赫夫曼编码 205 6.13总结回顾 208 6.14结尾语 209 人受伤时会流下泪水。树受伤时,天将再不会哭。希望我们的未来不要仅仅是钢筋水泥建造的高楼,也要有那郁郁葱葱的森林和草地,我们人类才可能与自然和谐共处。 第7章图 211 7.1开场白 212 如果你不善于规划,很有可能就会出现如玩好新疆后到海南,然后再冲向黑龙江这样的荒唐决策。 7.2图的定义 213 现实中,人与人之间关系就非常复杂,比如我的认识的朋友,可能他们之间也互相认识,这就不是简单的一对一、一对多的关系了,那就是我们今天要研究的主题——图。 7.2.1各种图定义 214 7.2.2图的顶点与边间关系 217 7.2.3连通图相关术语 219 7.2.4图的定义与术语总结 222 7.3图的抽象数据类型 222 7.4图的存储结构 223 因为美国的黑夜就是中国的白天,利用互联网,他的员工白天上班就可以监控到美国仓库夜间的实际情况,如果发生了像火灾、偷盗这样的突发事件,及时电话到美国当地相关人员处理 7.4.1邻接矩阵 224 7.4.2邻接表 228 7.4.3十字链表 232 7.4.4邻接多重表 234 7.4.5边集数组 236 7.5图的遍历 237 我有一天早晨准备出门,发现钥匙不见了。一定是我儿子拿着玩,不知道丢到哪个犄角旮旯去了,你们说,我应该如何找? 7.5.1深度优先遍历 238 7.5.2广度优先遍历 242 7.6最小生成树 245 如果你加班加点,没日没夜设计出的结果是方案一,我想你离被炒鱿鱼应该是不远了(同学微笑)。因为这个方案比后两个方案一半还多的成本会让老板气晕过去的。 7.6.1普里姆(prim)算法 247 7.6.2克鲁斯卡尔(kruskal)算法 251 7.7最短路径 257 有人为了省钱,需路程最短,但换乘站间距离长等原因并不省时间;另一些人,他为赶时间,最大的需求是总时间要短;还有一类人,他们都不想多走路,关键是换乘要少,这样可以在车上好好休息一下。 7.7.1迪杰斯特拉(dijkstra)算法 259 7.7.3弗洛伊德(floyd)算法 265 7.8拓扑排序 270 电影制作不可能在人员到位进驻场地时,导演还没有找到,也不可能在拍摄过程中,场地都没有。这都会导致荒谬的结果。 7.8.1拓扑排序介绍 271 7.8.2拓扑排序算法 272 7.9关键路径 277 假如造一个轮子要0.5天、造一个发动机要3天、造一个车底盘要2天、造一个外壳要2天,其它零部件2天,全部零部件集中到一处要0.5天,组装成车要2天,请问,在汽车厂造一辆车,最短需要多少天呢? 7.9.1关键路径算法原理 279 7.9.2关键路径算法 280 7.10总结回顾 287 7.11结尾语 289 世界上最遥远的距离,不是牛a与牛c之间狭小空隙,而是你们当中,有人在通往牛逼的路上一路狂奔,而有人步入大学校园就学会放弃。 第8章查找 291 8.1开场白 292 当你精心写了一篇博文或者上传一组照片到互联网上,来自世界各地的无数“蜘蛛”便会蜂拥而至。所谓蜘蛛就是搜索引擎公司服务器上软件,它把互联网当成了蜘蛛网,没日没夜的访问上面的各种信息。 8.2查找概论 293 比如网络时代的新名词,如“蜗居”、“蚁族”等,如果需要将它们收录到汉语词典中,显然收录时就需要查找它们是否存在,以及找到如果不存在时应该收录的位置。 8.3顺序表查找 295 8.3.1顺序表查找算法 296 8.3.2顺序表查找优化 297 8.4有序表查找 298 我在纸上已经写好了一个100以内的正整数请你猜,问几次可以猜出来。当时已经介绍了如何才可以最快的猜出这个数字。我们把这种每次取中间记录查找的方法叫做折半查找。 8.4.1折半查找 298 8.4.2插值查找 301 8.4.3斐波那契查找 302 8.5线性索引查找 306 我母亲年纪大了,经常在家里找不到东西,于是她用一小本子,记录了家里所有小东西放置的位置,比如户口本放在右手床头柜下面抽屉中,钞票放在衣……咳,这个就不提了。 8.5.1稠密索引 307 8.5.2分块索引 308 8.5.3倒排索引 311 8.6二叉排序树 313 后来老虎来了,一人拼命地跑,另一人则急中生智,爬到了树上。而老虎是不会爬树的,结果……。爬树者改变了跑的思想,这一改变何等重要,捡回了自己的一条命。 8.6.1二叉排序树查找操作 316 8.6.2二叉排序树插入操作 318 8.6.3二叉排序树删除操作 320 8.6.4二叉排序树总结 327 8.7平衡二叉树(avl树) 328 平板就是一个世界,当诱惑降临,人心中的平衡被打破,世界就会混乱,最后留下的只有孤独寂寞失败。这种单调的机械化的社会,禁不住诱惑的侵蚀,最容易被侵蚀的,恰恰是最空虚的心灵。 8.7.1平衡二叉树实现原理 330 8.7.2平衡二叉树实现算法 334 8.8多路查找树(b树) 341 要观察一个公司是否严谨,看他们如何开会就知道了。如果开会时每一个人都只是带一张嘴,即兴发言,这肯定是一家不严谨的公司。 8.8.12-3树 343 8.8.22-3-4树 348 8.8.3b树 349 8.8.4b+树 351 8.9散列表查找(哈希表)概述 353 你很想学太极拳,听说学校有个叫张三丰的人打得特别好,于是到学校学生处找人,工作人员拿出学生名单,最终告诉你,学校没这个人,并说张三丰几百年前就已经在武当山作古了。 8.9.1散列表查找定义 354 8.9.2散列表查找步骤 355 8.10散列函数的构造方法 356 8.10.1直接定址法 357 8.10.2数字分析法 358 8.10.3平方取中法 359 8.10.4折叠法 359 8.10.5除留余数法 359 8.10.6随机数法 360 8.11处理散列冲突的方法 360 我们每个人都希望身体健康,虽然疾病可以预防,但不可避免,没有任何人可以说,生下来到现在没有生过一次病。 8.11.1开放定址法 361 8.11.2再散列函数法 363 8.11.3链地址法 363 8.11.4公共溢出区法 364 8.12散列表查找实现 365 8.12.1散列表查找算法实现 365 8.12.2散列表查找性能分析 367 8.13总结回顾 368 8.14结尾语 369 如果我是个喜欢汽车的人,时常搜汽车信息。那么当我在搜索框中输入“甲壳虫”、“美洲虎”等关键词时,不要让动物和人物成为搜索的头条。 第9章排序 373 9.1开场白 374 假如我想买一台iphone4的手机,于是上了某电子商务网站去搜索。可搜索后发现,有8863个相关的物品,如此之多,这叫我如何选择。我其实是想买便宜一点的,但是又怕遇到骗子,想找信誉好的商家,如何做? 9.2排序的基本概念与分类 375 比如我们某些大学为了选拔在主科上更优秀的学生,要求对所有学生的所有科目总分倒序排名,并且在同样总分的情况下将语数外总分做倒序排名。这就是对总分和语数外总分两个次关键字的组合排序。 9.2.1排序的稳定性 376 9.2.2内排序与外排序 377 9.2.3排序用到的结构与函数 378 9.3冒泡排序 378 无论你学习哪种编程语言,在学到循环和数组时,通常都会介绍一种排序算法,而这个算法一般就是冒泡排序。并不是它的名称很好听,而是说这个算法的思路最简单,最容易理解。 9.3.1最简单排序实现 379 9.3.2冒泡排序算法 380 9.3.3冒泡排序优化 382 9.3.4冒泡排序复杂度分析 383 9.4简单选择排序 384 还有一种做股票的人,他们很少出手,只是在不断观察和判断,等时机一到,果断买进或卖出。他们因为冷静和沉着,以及交易的次数少,而最终收益颇丰。 9.4.1简单选择排序算法 384 9.4.2简单选择排序复杂度分析 385 9.5直接插入排序 386 哪怕你是第一次玩扑克牌,只要认识这些数字,理牌的方法都是不用教的。将3和4移动到5的左侧,再将2移动到最左侧,顺序就算是理好了。这里,我们的理牌方法,就是直接插入排序法。 9.5.1直接插入排序算法 386 9.5.2直接插入排序复杂度分析 388 9.6希尔排序 389 不管怎么说,希尔排序算法的发明,使得我们终于突破了慢速排序的时代(超越了时间复杂度为o(n2)),之后,更为高效的排序算法也就相继出现了。 9.6.1希尔排序原理 391 9.6.2希尔排序算法 391 9.6.3希尔排序复杂度分析 395 9.7堆排序 396 什么叫堆结构呢?回忆一下我们小时候,特别是男同学,基本都玩过叠罗汉的恶作剧。通常都是先把某个要整的人按倒在地,然后大家就一拥而上扑了上去……后果?后果当然就是一笑了之。 9.7.1堆排序算法 398 9.7.2堆排序复杂度分析 405 9.8归并排序 406 即使你是你们班级第一、甚至年级第一名,如果你没有上分数线,则说明你的成绩排不到全省前1万名,你也就基本失去了当年上本科的机会了。 9.8.1归并排序算法 407 9.8.2归并排序复杂度分析 413 9.8.3非递归实现归并排序 413 9.9快速排序 417 终于我们的高手要登场了,将来你工作后,你的老板让你写个排序算法,而你会的算法中竟然没有快速排序,我想你还是不要声张,偷偷去把快速排序算法找来敲进电脑,这样至少你不至于被大伙儿取笑。 9.9.1快速排序算法 417 9.9.2快速排序复杂度分析 421 9.9.3快速排序优化 422 9.10总结回顾 428 目前还没有十全十美的排序算法,有优点就会有缺点,即使是快速排序法,也只是在整体性能上优越,它也存在排序不稳定、需要大量辅助空间、对少量数据排序无优势等不足。 9.11结尾语 430 如果你有梦想的话,就要去捍卫它。当别人做不到的时候,他们就想要告诉你,你也不能。如果你想要些什么,就得去努力争取。就这样! 附录参考文献 435
pdf
C语言最新编程技巧200例
标签:C语言编程技巧
积分:1 下载次数:189资源类型:技术书籍上传者:zouxin2010上传时间:2015-02-09
简介:bianchengsh

C语言与嵌入式的结合 文档列表

简介:

结合自己实际工作,边实践边学习。在编程领域中,C语言的运用非常之多,这里只列举C语言在单片机开发、嵌入式编程方面上的应用,供大家参考。

pdf
C嵌入式编程设计模式
标签:C嵌入式C语言嵌入式C语言设计模式
积分:1 下载次数:1715资源类型:技术书籍上传者:qinkaiabc上传时间:2013-11-28
简介:作者: [美]道格拉斯 译者: 刘旭东 出版年: 2012-4 《C嵌入式编程设计模式》以面向对象的视角,重新审视嵌入式系统,全面总结了嵌入式系统中常见的以及关键的设计模式。《C嵌入式编程设计模式》提出了很多新颖的设计模式,为使用c语言编程的嵌入式系统开发者提供了强有力的工具。通过这些模式,开发者可以用最短的时间设计出性能好、稳定性强、安全性高的嵌入式系统或软件。《C嵌入式编程设计模式》针对嵌人式系统中从内存访问到事件调度,从状态机设计到安全性可靠性保证,对系统的设计以及性能表现的方方面面进行了详细阐述。《C嵌入式编程设计模式》采用uml图形化解释,直观清晰;所有实例配有c代码实现,方便使用。
pdf
嵌入式C语言进阶之道.pdf
标签:嵌入式C语言
积分:1 下载次数:368资源类型:应用文档上传者:499362154上传时间:2013-01-05
简介:C语言的书有一大堆,嵌入C语言的书也不少,但都不过是简单介绍一下标准C语言的语法,再讲一下嵌入式C语言与标准C的区别,讲一下新增加的关键字。这样的书,对于初学者或许是适合的。问题是,若是我不愿意只是当一个小菜鸟,我想对嵌入式C语言有更多更深的了解时,我突然发现,满图书馆的书,竟找不到一本,能解我心头之惑。 对于在实际工作当中, 你不再是独自编写程序,你要和小组内的成员之间分工合作,你要学会模块化编程、要写出更规范更安全的代码、做更合理的优化、减少更多的bug。所有的这些,都迫使你必须更彻底的理解嵌入式C的语法结构,数据细节,与硬件打交道的特性,使得你必须时时考虑硬件与C的对应关系并养成良好的编程习惯。 本文的原意是想尽可能多的解决上述问题,帮助更多的新人深入理解嵌入式C语言。 本文是我工作之余整理而来。是对我个人学习嵌入式C语言过程的总结。本文涉及的知识点多数来自于网络,其中加入我个人理解以及自己平时遇到的注意点。 本文从编程风格谈起,讲述了模块化的编程方法,对一些大型项目中常用重点关键字做了讲解,参照MISRA C 2004规范,对嵌入式C安全编程做了阐述,对一些嵌入式C的小技巧进行了讨论。 在读本文时,我假设你有C语言基础、至少理解一种微控制器(51、PIC、AVR、DSP、ARM等)、有简单的(这里本想写较深的)汇编基础。
rar
51单片机C语言程序设计经典实例
标签:51单片机设计经典实例
积分:0 下载次数:330资源类型:技术书籍上传者:Electronic_1108上传时间:2013-03-14
简介:51单片机C语言程序设计经典实例
pdf
51单片机C语言应用开发三位一体实战精讲 421页 53.8M 超清书签版
标签:单片机
积分:0 下载次数:197资源类型:应用文档上传者:tyw上传时间:2013-12-10
简介:51单片机C语言应用开发三位一体实战精讲 421页 53.8M 超清书签版
pdf
新概念51单片机C语言教程.入门、提高、开发 545页
标签:新概念概念单片机语言教程
积分:0 下载次数:157资源类型:应用文档上传者:tyw上传时间:2013-12-10
简介:新概念51单片机C语言教程.入门、提高、开发 545页
pdf
手把手教你学AVR单片机C程序设计(完整版)
标签:AVRC程序设计
积分:5 下载次数:368资源类型:技术书籍上传者:tiankai001上传时间:2013-03-17
简介:《手把手教你学AVR单片机C程序设计》作者:周兴华,2009年4月出版。 《手把手教你学AVR单片机C程序设计》理论与实践完美结合,引导读者循序渐进地学习。每学习一段理论,必有与之对应的短小精悍的程序可供实践,这样读者学得进、记得牢,不会产生畏难情绪,直至彻底掌握AVR单片机的C语言高效编程。

评论

登录/注册

意见反馈

求资源

回顶部

最新下载

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版 版权声明

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
$(function(){ var appid = $(".select li a").data("channel"); $(".select li a").click(function(){ var appid = $(this).data("channel"); $('.select dt').html($(this).html()); $('#channel').val(appid); }) })
×

已收藏到:个人中心—我的下载—收藏