《大话数据结构》简体中文版勘误
尽管已经很仔细的检查和审核,但错误还是没有能避免。以下的错误,有些是作者的笔误或者表述不清,有些是编辑审稿时不理解造成的错误,有些是美编改图时的错误,有些是印刷厂印刷时的错误。虽然出错的原因很多,但总的来说都会给读者阅读时造成困扰,所以再次向读者说一声对不起!并请读者时常关注本博文,以便可以获得最新的勘误信息。现勘误如下:
注:★★★、★★和★为建议马上修改,它们之间程度不同,没有星为可改可不改,不影响阅读。
第一次印刷:
1.01★ P38,倒数第二行,“速度其实只提高了10”,后面增加一个“倍”字。
1.02 P111,第三段,第二行,“打算了Reset时”,多了一个“了”字。目录P15,同样的问题。
1.03★★★ P268,P269,图7-7-14,图7-7-15,图7-7-16横竖条中都是有符号或数字的,目前因印刷问题没有显示。
1.04 P377 “时间性能”这一段中 "事实上,移动可以通过改为记录的存储方式来予以避免" ,其中“改为”应该是“改变”
1.05★★ P35,第一行,有一个“+”号应该是“=”,见下图
第二次印刷:
2.01 P383,代码第6行,“ for(i=1;i<L->length && flag; i++) /*若flag为true则退出循环*/” 其中注释应该改为“/* 若flag为true说明有过数据交换,否则停止循环 */”( My Blogs 提供)
2.02 P20,代码中“int i,sum =0, n = 100;”中的"i,"是多余的,可以删除,因为没有用到i变量。( AGPSky 提供)
2.03 P43,图3-2-2,在天秤和射手之间,少了一个“天蝎座”。 ( 小老K 提供)
2.04 P58,图3-6-5,左侧第三条,“头指针均不为空”应该改为“头指针均存在” ( 小老K 提供)
2.05★★ P58,图3-6-4和图3-6-6,两图中“头指针”改为“后继指针地址”。图3-6-6,“0900”应该改为“NULL” ( 小老K 提供)
2.06 P60,中间编号1后面,“声明一个结点p”改为“声明一指针p”。下方代码中第6行,“/*声明一结点p*/”应该改为“/*声明一指针p*/”。( 小老K 提供)
2.07 P64,第一句:“用来存放e数据s结点。”,将“e数据s结点"改成“数据e的s结点” ( 小老K 提供)
2.08 P71,倒数第三段第三行,“而游标cur相当于单链表中的next指针,存放该元素的后继在数组中的下标。”,将“游标”两字删除,并在句子最后句号前增加一句:“,我们把cur叫做游标。” ( 小老K 提供)
2.09 P105,第五段第二行,“只有碰到左括号”改为“只要碰到左括号”。 ( 小老K 提供)
2.10 P105,第五段最后一行,“最终再因全部匹配成功后成为空栈的结果。”,将“的结果”删除。( 小老K 提供)
2.11★★ P109,第6条,将第一个句号前的句子与第二个句号前的句子对调。结果为“紧接着是符号"X",因为此时的栈顶符号……因此不输出,"*"进栈。接着是数字3,输出,总的表达式为931-3。”( 小老K 提供)
2.12★ P126,第三段倒数第二行,“表示216个字符”,“216”应该改为“216”(strider 提供)
2.13★★ P137,第四段第一行,“假设S="abcabcabc",”,其中的字符串S应该是“abcababca”。图5-7-4和图5-7-5的第①图,都应该改为下图所示。(strider 提供)
2.14★ P138,倒数第二段第二行,“而图5-7-4中,”改为“而图5-7-5中,”。(strider 秦萌 提供)
2.15★ P144,5.7.5小节中第1号小标题中:“先计算出next数组的值分别为001234223”,应改为011234223”。(strider 提供)
2.16★ P145,9)"当j=9时,next值为3,.....因此nextval[9]=nextval[3]=1" 最后的“1”应改为“0”。(strider 提供)
2.17 P153,6.2.3节第一段第三行,“而G、H、I、J也是。”,应该改为“而G、H、I与J也是堂兄弟。” (康凯 提供)
2.18 P155,6.4.1小节第二段第二行:“其双亲结点到链表中的位置”应改为“其双亲结点在数组中的位置”。(strider 提供)
2.19★ P157,表6-4-3的数据第一行 A的firstchild 应该是 1 不是 -1。( 小老K 提供)
2.20★ P169,6.6.2 二叉树性质2的第四段,“如果有一层,至多1=20-1个结点”,应该是“21-1个结点”。(康凯 提供)
2.21★ P170,倒数第二段第二行,“倒推得到满二叉树的度数为”,其中“度数”改为“深度”,第三行,“度为4”,应该改为“深度为4”。( 小老K 提供)
2.22★ P171,第一行“等于同样的度数”,“度数”改为“深度”;第四行,“而k作为度数也是整数”,“度数”改为“深度”;图6-6-2上面一段,“这是一个完全二叉树,度为4”,“度为4”改为“深度为4”。( 小老K 提供)
2.23 P199,5~6行 “比如图6-11-4中最右侧的树”,将“最右侧”改为“右下方”。倒数3~4行 “比如图6-11-5右侧三棵树的森林”,将“右侧”改为“下面”。P200 第一行 “6-11-5右侧三棵树的森林”,“右侧”改为“下面”。( 小老K 提供)
2.24★ P200,第二行,“我们对图6-11-4的左侧二叉树”,“6-11-4”改为“6-11-5”。( 小老K 提供)
2.25 P203,第一行,“我们先把这两棵二叉树简化成叶子结点带权的二叉树”,应该加“注:树结点间的边相关的数叫做权(Weight)”。( 小老K 提供)
2.26 P203,第三段第四行,“每个叶子的路径长度为lk”,其中"lk"应该改为“lk”,即k是下标。( 小老K 提供)
2.27 P218,倒数第二段第一行,“图7-2-9中的左侧”,其中“左侧”改为“上方”,后面的“右侧两条路径长度为3”,其中“右侧”改为“下方”。( 小老K 提供)
2.28★ P219,中间一段第二行,“两个顶点vi、vj∈E,”,这里“E”应该改成“V” (咖啡崽 提供)
2.29★ P220,倒数第二行,“在存在”,应该改成“不存在”。(咖啡崽 提供)
2.30★★ P220,图7-2-13的图1和图2,顶点A与顶点B之间的箭头都画反了。(咖啡崽 提供)
2.31★★★ P338,图8-7-10,图中有小错误,且图形过于繁琐,不利于读者理解,因此做比较大的修改如下图。(康凯 提供)
2.32 P52,代码中间部分,“for(k=L>length-1;k>=i-1;k--”后面少了一个“)”。(萧萧Leo 提供)
2.33 P95,第二行 “另一个栈为栈的末端” 应该改成“另一个栈为数组的末端”。( AGPSky 提供)
2.34 P248,倒数第六行,“arjvex”应该为“adjvex”。(萧萧Leo 提供)
2.35★ P263,第8小节,“此时i=2。”改成“此时v=2。”。P264,第11小节,“此时i=3。”改成“此时v=3。”(萧萧Leo 提供)
2.36★ P260-P261,书中代码“matirx”都应该改为“matrix”(一共有五处修改,分别是P260倒数第三行,P261,代码1、8、27、29行)。在提供下载的代码中,统一将matrix修改成了arc。(萧萧Leo 提供)
2.37★★ P285,倒数第四行,公式中“min{ltv[j]+len……”,中“+”应该是“-”(萧萧Leo 提供)
2.38★★ P81,第一行代码,“rearB->next=p; free(p);” 应该在这两句上方加一句“q=rearB->next; ”(即在四句代码的中间增加一句),并修改最后的“free(p);"为“free(q); /*释放q*/ ” (siatliuliu1 提供)
2.39 P26,倒数第四行最后,“运算100次是运算10次的100”,应该是“运算10次的1000”。(laciqs 提供)
2.40★★★ P46,union代码,有不少的问题,修正如下图。union是C语言的关键字,因此函数名增加一个L。具体实现代码,请参见源代码中的“01线性表顺序存储_List.c”文件(laciqs 提供)
2.41 P59,倒数第五行,“结点由存放数据元素的数据域”后面加一个“和”字。
以下2011-8-23更新
2.42★ P216,图7-2-6,顶点B与顶点D缺少两根互为反向的连线。因为有向完全图的定义是任意两个顶点之间都存在方向互为相反的两条弧。(Zhangth 提供)
2.43★ P247。图7-6-3中邻接矩阵有些错误。 arc[v2][v1]应该是18, arc[v3][v6]和arc[v6][v3]都应该是24。 (Zhangth 提供)
2.44★ P330,图8-7-2,图1,删除叶子结点35和结点99。(黑洞熵 提供)
以下2011-8-25更新
2.45 P285 第6小节,“ltv相对应的值为19、25、13”,三个数字的顺序应该是“19、13、25”。(黑洞熵 提供)
2.46 P332,第一行,“平衡因子没有发生改变”,改为“平衡因子没有超出限定范围(-1,0,1)”。 (黑洞熵 提供)
2.47★ P334,图8-7-8中的图15中结点7的BF值应该是-2而不是-1。(黑洞熵 提供)
2.48★ P347 第二段,情形二的第二行,“此时删除结点1”,修改为“此时删除结点4”。(黑洞熵 提供)
以下2011-8-30更新
2.49★ P375,第二段第三行,“(非递减或非递增)关系”,是应该写成“非递减(或非递增)关系”。(黑洞熵 提供)
以下2011-9-1更新
2.50★ P76,第一段第二行,“j=k[999].cur=1",应该将“k"修改为“L”。(Mark1940 提供)
2.51★ P387,第3条最后一行 “L.r[j-1]=L.r[j] ”应该是“L.r[j+1]=L.r[j]” (萧萧Leo 提供)
以下2011-9-2更新
2.52 P57,第6行,"元素ai的存储映像,称为节点"中的i应该是a的下标.(Jeallyn 提供)
以下2011-9-7更新
2.53★ P319,代码下第一段第一行,"InsertBST(T,93)"应该是"InsertBST(&T,93)",第二行,"InsertBST(T,95)"应该是"InsertBST(&T,95)" (ff22 提供)
以下2011-9-21更新
2.54 P398,中间一段,堆排序定义的倒数第二行,“这样就会得到n个元素中的次小值”,其中“次小”应该改为“次大”。(ff22 提供)
以下2011-10-8更新
2.55 P235,图7-4-11,V1点的阴影应该改为V2 ,修改结果见下图(盲剑客 提供)
以下2011-10-18更新
2.56 P339★,代码第22行,"if (taller)",应该改为"if (*taller)"。本书提供的源代码也有相同错误,已经做了修改。(Jakson 提供)
2.57 P158,图6-4-2,每个结点末尾都多画了一个指针域(即应该有四个方格却画了五个),应该要去掉,如下图。(孟倩 提供)
以下为第三次印刷还遗留的错误
以下2011-11-09更新
3.01 P329,倒数第二行,“结点58的左子树高度为2,”其中2应该改为3。( 小墨的童鞋 提供)
3.02 P330★,中间一段,“(即它的左子树高度2减去右子树高度0)”,应该改为“(即它的左子树高度3减去右子树高度1)”。然后图8-7-3在结点58的右侧增加一个60的结点,如下图。( 小墨的童鞋 提供)
以下2011-11-14更新
3.03 P194,中间第3条,"第7~8行,whild(p!=T)",其中"whild"应该改为"while"。(小老k 提供)
3.04 P251 第三行 “假设 N=(P,{E}) .....” 改为“假设 N=(V,{E}) .....” (小老k 提供)
以下2011-11-23更新
3.05 P126页第三段倒数第二行,“65万”改为“6.5万”(somebodysssss 提供)
以下2011-12-05更新
3.06 P351,中间一段,有四处的└m/2┘都应该是 ┌m/2┐,见下图。( 给你改错 提供)
以下2011-12-07更新
3.07 P288,第二段第二行,“十字链表是邻接矩阵的一种升级,而邻接多重表则是邻接表的升级。”,应该改为“十字链表是针对有向图邻接表结构的优化,邻接多重表是针对无向图邻接表结构的优化。”(韦欢 提供)
以下2011-12-20更新
3.08 (本次改动仅限第三次印刷)P61,代码第三行,"if (!p || j>=i)",请将“=”去掉。P63,代码中间一行,,"if (!p || j>=i)",请将“=”去掉。P65,代码中间一行,"if (!p || j>=i)",请将“=”去掉。(kenly2007 提供)
以下2012-01-09更新
3.09 P68 最后一行,"那么应该让这个链表的指针域置空" ,其中“链表”应该改为“节点”。(落崖惊风 提供)
3.10 P138 最下方的公式,“且‘p1……k-1’”,在“k-1”的左侧少了一个"p". (落崖惊风 提供)
以下2012-02-07更新
3.11 P108 倒数第四行最后一句,“是右括号或优先级低于”,其中“低于”改为“不高于”。(王天兴 提供)
3.12 在源代码中栈与队列的DoubleStack.c中的两个问题(目前源代码已经修正,重新下载即可。书中讲解并无错误):
问题1:
int StackLength(SqDoubleStack S)
{
return (S.top1+1)+(MAXSIZE-1-S.top2);
}
中的语句return (S.top1+1)+(MAXSIZE-1-S.top2); 应该修改为 return (S.top1+1)+(MAXSIZE-S.top2);
问题2:
Status StackTraverse(SqDoubleStack S)
{
int i;
i=0;
while(i<=S.top1)
{
visit(S.data[i++]);
}
i=S.top2;
while(i<MAXSIZE)
{
visit(S.data[i++]);
}
printf("\n");
return OK;
}
中的语句 while(i<S.top1) 应该修改为 while(i<=S.top1) (闫丰 提供)
以下2012-02-13更新
3.14 P234 图7-4-10 右下角那句“V2后再无V0的入边顶点,所以其taillink为空” taillink应该是headlink (风碎月 提供)
以下2012-04-12更新
4.01 P188,第二段整段删除,即“当然,你完全也可以……###DB##CA”这一段。原因在于,由于中序遍历不能首先建立根结点,用加“#”的方法是不可能创建一个二叉树的,后序遍历在特定规则下可以见http://www.cnblogs.com/cj723/archive/2012/01/09/2316791.html#2372197。(猫□咪和 G-rated 提供)
以下2012-06-04更新
4.02 P52,代码第8行,"if (i<1 || i>L->length+1)"当中的“+1”不需要,应该是"if (i<1 || i>L->length)"。( csensix 提供)本处不需要修改,并没有错,详细说明请看我提供的源代码的注释“/* 当i比第一位置小或者比最后一位置后一位置还要大时 */”
以下2012-06-25更新
p70,图3-11-1,时间性能最后一个,“线出”应改为“找出” ( Darker 提供)
以下2012-07-16更新
p261★★ 代码第9行 “(*P)[v]=0 /*初始化路径数组P为0 */” 将其中的0改为-1,即“(*P)[v]=-1 /*初始化路径数组P为-1 */” 。这是因为当为0时本来表示没有路径,但却和数组索引为0的编号重合,导致在一些特殊情况出现最短路径计算错误,提供下载的代码和测试代码也做了修正,请下载查看。(伍迷 自提供)
以下2012-08-08更新
p103,图4-8-3,当中的Fib都改为Fbi。本错误不算严重,可以不改。由于是对Fibonacci这个单词的缩写,Fbi或者Fib都是可以的。为了和代码中的统一,特告知,后续印刷版本,会将这样的小错误修正。(hefeijuan 提供)
以下2013-07-31更新
p153,图6-2-6上方段落第二行,"则其子树的根就在第l+1层","的根"两字去掉。(莫小峰来了 提供)
p175,第三段第二行,"简单地假定就是输出结点的数据信息",其中“简单地假定就是”改成"简单地假定访问就是"。(莫小峰来了 提供)
p205,右方的图中结点N1~N2少了权值15,N2~N3之间少了权值30,可参看左侧6-12-7的图。(莫小峰来了 提供)
p218,最后一段第一行,"第一个顶点到最后一个顶点",其中“到”改为"和"。(莫小峰来了 提供)
p249,第一段第二行,"arjvex"改为"adjvex"。(莫小峰来了 提供)
p255, 最后一段第一句,“最右图"改为"右下方的图"。(莫小峰来了 提供)
p266,第一段第二行, "P代表对应顶点的前驱矩阵",前驱矩阵是什么没解释,后增加一句“,用来存储路径”。(莫小峰来了 提供)
P388页,第7点第二段,“由于6、5、4、3都比2小,它们都将右移一位” 应该更正为“由于6、5、4、3都比2大,它们都将右移一位”。(禾鬥雨 提供)
————————————————————————————————————————————————————————
《大话数据结构》第三次印刷已将勘误中的错误修正,预计在2011年12月在各大网上书店中有售。再次向已经购买前两次印刷的读者说一声抱歉,给您要花时间修正错误添麻烦了,当然您们在花费二十多分钟的修改后就能尽早阅读本书,也算是有遗憾后值得欣慰的地方!
也希望读者可以理解,本书因为关注度比较高,所以出错后也会影响面比较大。作为作者,本人也有很大压力。其实任何书籍在刚出版时,都会有大大小小的错误,错误原因很多,有些图书没有勘误并不等于没有错误。所以尽管出版本书前,已经做了很大的努力,但还是没有避免错误的发生,现在重要的就是如何弥补错误,不要造成读者的阅读障碍。微软的Windows也需要打补丁,所以希望您可以用类似打补丁的心态去查看勘误修正错误。请您更多关注图书的内容而不是错误本身。谢谢!
感谢小老K 和strider的认真阅读和指正,本人与他们沟通后,决定赠送他们每人一本签名本《大话设计模式》留作纪念。也欢迎其他朋友多多给予指正和建议,只要提交足够多的错误,本人都会考虑给予签名赠书!