《大话数据结构》简体中文版勘误

      尽管已经很仔细的检查和审核,但错误还是没有能避免。以下的错误,有些是作者的笔误或者表述不清,有些是编辑审稿时不理解造成的错误,有些是美编改图时的错误,有些是印刷厂印刷时的错误。虽然出错的原因很多,但总的来说都会给读者阅读时造成困扰,所以再次向读者说一声对不起!并请读者时常关注本博文,以便可以获得最新的勘误信息。现勘误如下:

注:★★★、★★和★为建议马上修改,它们之间程度不同,没有星为可改可不改,不影响阅读。

第一次印刷:

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,代码中第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,中间一段第二行,“两个顶点vivj∈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 (风碎月 提供)

 ————————————————————————————————————————————————————————    

    《大话数据结构》第三次印刷已将勘误中的错误修正,预计在2011年12月在各大网上书店中有售。再次向已经购买前两次印刷的读者说一声抱歉,给您要花时间修正错误添麻烦了,当然您们在花费二十多分钟的修改后就能尽早阅读本书,也算是有遗憾后值得欣慰的地方!

      也希望读者可以理解,本书因为关注度比较高,所以出错后也会影响面比较大。作为作者,本人也有很大压力。其实任何书籍在刚出版时,都会有大大小小的错误,错误原因很多,有些图书没有勘误并不等于没有错误。所以尽管出版本书前,已经做了很大的努力,但还是没有避免错误的发生,现在重要的就是如何弥补错误,不要造成读者的阅读障碍。微软的Windows也需要打补丁,所以希望您可以用类似打补丁的心态去查看勘误修正错误。请您更多关注图书的内容而不是错误本身。谢谢!

     感谢小老K 和strider的认真阅读和指正,本人与他们沟通后,决定赠送他们每人一本签名本《大话设计模式》留作纪念。也欢迎其他朋友多多给予指正和建议,只要提交足够多的错误,本人都会考虑给予签名赠书!

posted on 2011-06-26 17:26 伍迷 阅读(6343) 评论(214) 编辑 收藏

评论

#115楼  回复 引用 查看   

P57中第6行,"元素ai的存储映像,称为节点"中的i应该是a的下标.
2011-09-01 10:02 | Jeallyn      

#116楼[楼主]  回复 引用 查看   

@Jeallyn
感谢指正。已经加入勘误中。
2011-09-02 09:36 | 伍迷      

#117楼  回复 引用 查看   

引用小老K:
p63
这个程序不太懂,L已经是指向链表头结点的指针了,
为什么函数要写成
Status ListInsert (LinkList *L , int i , ElemType e)
...
这样写有什么好处呢?

把L前的星号去掉,写成
Status ListInsert (LinkList L , int i , ElemType e)
然后把函数体里面的 p = *L改成 p = L不行吗?严蔚敏老师的书p29下边的程序体里就是 p = L




这里是可以 直接用 LinkList L的。
因为 在这个程序中 不需要改变 L这个指针的内容。
P65的 中 ListDelete函数 中参数也可以用 LinkList L
但是P66 CreateListHead中 必须使用 LinkList *L,因为 你要改变linkList这个值真的值。*L=(LinkList)malloc(sizeof(Node))
2011-09-02 11:45 | snan4love      

#118楼  回复 引用 查看   

@ff22
可以的~ListInsert 和 ListDelete 可以, 但是P66的CreateListHead不可以。
2011-09-02 11:47 | snan4love      

#119楼  回复 引用 查看   

引用siatliuliu1:
引用伍迷:
@小老K
首先您需要对我的代码中的函数声明
Status ListInsert (LinkList *L , int i , ElemType e)
和严老师的
Status ListInsert (LinkList &L , int i , ElemType e)
看出区别,严老师是传递的是&L而非*L

严格意义上说,严老师的代码是C++语言而不是C语言。您可以从她书的"前言"第三段中得到信息:“……本书未直接采用类和对象等设施,而是从C语言中精选了一个核心子集,并增添C++语言的引用调用参数传递方式等,构成了一个类C描述语言……”

在我写...

当你传递一个参数给函数的时候, 这个参数会不会在函数内被改动,如果需要被改动,则需要传递指向这个参数的指针,如果不用被改动,可以直接传递这个参数。
在ListInsert和ListDelete中,想要 传递的参数 是一个 LIst的头指针,即LinkList L. 在函数内部,没有要改变这个头指针的内容(L从没有出现在过任何 “=” 号的左边 ),也就是说这个指针不需要改变,所以可以直接传递 LinkList L. 没有必要传递 LinkList *L。
但是在CreateListHead中, 如果传递的是 LinkList L的话,在第五行的就会是 L=(LinkList)malloc(sizeof(Node));也就是说L的值会被改变,此时需要传递的是 指向 L的指针。所以就是 LinkList *L.
2011-09-02 11:56 | snan4love      

#120楼  回复 引用 查看   

有一个地方不明白:

P344
2-3树的插入实现

对于2-3树的插入实现,与二叉排序树一样,插入操作一定是发生在叶子节点上?
二叉排序树也要一定是叶子节点吗? 应该是完全二叉树吧。
2011-09-02 12:01 | snan4love      

#121楼  回复 引用 查看   

建议开个专门的交流贴 呵呵
2011-09-02 14:51 | ff22      

#122楼  回复 引用 查看   

有没有哪位大哥义务一下,建个群,我们进去讨论下!
2011-09-02 23:48 | 盲剑客      

#123楼  回复 引用 查看   

看到KMP算法那边好难啊,熬了2天通过网上饿严蔚敏视频总算有点门路。有遇到同样问题的可以参考视频再跟书一起看
视频1:http://v.youku.com/v_show/id_XOTI2ODQ4MTI=.html
视频2:http://v.youku.com/v_show/id_XOTI3MTY2OTI=.html
2011-09-04 22:09 | 盲剑客      

#124楼  回复 引用 查看   

新建大话讨论群 欢迎大家加入!一起讨论《大话数据结构》QQ群:173601068
2011-09-05 15:29 | 小步舞曲      

#125楼  回复 引用 查看   

P227
关于建立邻接矩阵函数中有一个输入顶点信息的循环
for (i=0; i<G->numVertexes; i++)
    scanf(&G->vexs[i]);


这里scanf(&G->vexs[i]);我试了一下并不能将输入存放到Vexs数组中
而且就算改为scanf("%c", &G->vexs[i]);也只会输入两次
说明在其中两次被我们输入的回车占用了
当输入第一个字符之后 输入缓冲区中有第一个字符还有一个回车符
下一次直接将回车符送到vexs[i]中
建议在
scanf("%c", &G->vexs[i]);后面加上fflush(stdin);来清空输入缓冲区
2011-09-05 17:26 | 小步舞曲      

#126楼  回复 引用 查看   

303页的代码第九行没问题吗i<F[k]-1;那i=12就取不到值啊,后面的讲解说可以取到的
2011-09-05 19:45 | ff22      

#127楼[楼主]  回复 引用 查看   

@snan4love
“对于2-3树的插入实现,与二叉排序树一样,插入操作一定是发生在叶子节点上?”
这是规则,不用质疑。

@小步舞曲
您说的的确有点小问题,我会考虑如何修改代码。谢谢

@ff22
这段代码没有问题,请仔细跟踪调试,i=12是可以取值的。
2011-09-06 09:35 | 伍迷      

#128楼  回复 引用 查看   

319页两个Insert函数T前没有加&
2011-09-06 19:59 | ff22      

#129楼[楼主]  回复 引用 查看   

@ff22
感谢指正,的确是错误。
2011-09-07 09:21 | 伍迷      

#130楼  回复 引用 查看   

看这阵势,很给力哈,那么多童鞋帮忙纠错;

这两天就去买一本。。。
2011-09-12 16:06 | liushuifeng      

#131楼  回复 引用 查看   

@盲剑客
我也是啊,遇到这边卡住了,差点放弃!
2011-09-14 17:33 | 惹红尘      

#132楼  回复 引用 查看   

P241
邻接表的深度优先遍历的代码中,两个函数的参数都是GraphAdjList类型的。 这是一个结构体类型,而不是指针。但是在函数体中所有用到结构体中的内容的方式都是'->'而非'.'。 应该修改为GL.XXX
void DFS(GraphAdjList G, int i)
{
	EdgeNode *p;
	visited[i] = TRUE;
	printf("%c ", G.adjList[i].data);
	p = G.adjList[i].firstedge;

	while (p)
	{
		if (!visited[p->adjvex])
			DFS(G, p->adjvex);
		p = p->next;
	}
}


void DFSTraverse(GraphAdjList G)
{
	int i;
	for (i=0; i<G.numVertexes; ++i)
		visited[i] = FALSE;

	for (i=0; i<G.numVertexes; ++i)
		if (!visited[i])
			DFS(G, i);
}
2011-09-17 00:00 | 小步舞曲      

#133楼  回复 引用 查看   

应该把错误分个级,例如对读者会照成误导的应标为严重等级,而像“在天秤和射手之间,少了一个‘天蝎座’”则为普通。

这样读者就可以一眼望去,只把重要的在书上标记下,而不是对着上面长长的勘误表“做功课”了...

————
看到2.05,我觉得还是先把这个建议提出来,而不是继续看下去...
2011-09-17 23:07 | vons      

#134楼  回复 引用 查看   

@vons
大哥,你饶了作者吧!
2011-09-18 14:04 | 盲剑客      

#135楼[楼主]  回复 引用 查看   

@vons
感谢您的提议,我已经做了相应的修改。
2011-09-19 09:21 | 伍迷      

#136楼  回复 引用 查看   

408页 代码第4行 TR2[MAXSIZE+1];
申请的内存空间太大了吧 MAXSIZE可是10000啊
递归调用 太浪费了吧
2011-09-19 21:08 | ff22      

#137楼  回复 引用 查看   

398页 倒数第二段倒数第二行的次小应该为次大吧
2011-09-19 21:12 | ff22      

#138楼[楼主]  回复 引用 查看   

@ff22
MAXSIZE是10000,只是为了避免排序数组过大而溢出。这只是书中样例,现实需要根据需要考量。

398页,应该是次小值,没有错误,请再仔细阅读。
2011-09-20 09:06 | 伍迷      

#139楼[楼主]  回复 引用 查看   

@小步舞曲
此处没有错误,应该是GL->
2011-09-20 09:11 | 伍迷      

#140楼  回复 引用 查看   

@伍迷
我用VC6.0是不能通过编译的
2011-09-20 10:32 | 小步舞曲      

#141楼[楼主]  回复 引用 查看   

@小步舞曲
哦,这个我还真没注意,因为我是用vs2008调试的,用你的方法反而编译不通过。可能是历史原因版本不同的原因。不过这不影响你阅读,也谈不上错误,你可以根据自己需要更改。
2011-09-20 10:38 | 伍迷      

#142楼  回复 引用 查看   

@伍迷
确认是次小值吗 不是由大顶堆来生成由小到大的数列吗?所以应该是次大值,最大值已经和最后一个元素交换了啊
2011-09-20 16:48 | ff22      

#143楼[楼主]  回复 引用 查看   

@ff22
Sorry,您是正确的。上回我没有看清楚就下了结论,对不起。应该是次大值。
2011-09-21 09:07 | 伍迷      

#144楼  回复 引用 查看   

引用盲剑客:
@vons
大哥,你饶了作者吧!

一个小细节的修改,阅读起来就轻松了很多,不是么,呵呵。
2011-09-22 06:27 | vons      

#145楼  回复 引用   

书已经到手上!放在家里还没看
想问下书上有介绍k-d树的内容和应用吗?如果没有作者能不能写篇文章介绍一下、、、、
2011-09-23 17:14 | lingchenqidian[未注册用户]

#146楼  回复 引用 查看   

你的B树源码有问题,你自己的测试用例,没有插入0这个关键字,但是却可以查找到这个关键字...代码逻辑有点小问题

#147楼  回复 引用 查看   

原因已经查明,int数组默认值是0
你的循环for(i=0;i<N;i++)做了很多无用循环,把不该插入的数据插入进去了
建议用哨兵设置界限...

#148楼[楼主]  回复 引用 查看   

@我是一头快乐的小毛驴-(Zealot Yin)
明白您的意思了,原来我设置的N是100,可实际上我的测试数据只是17个。代码健状性上还是有小问题,谢谢提醒,我已经更正。
2011-09-26 13:49 | 伍迷      

#149楼  回复 引用 查看   

P234最下面有句,若要删除左图的(v0,v2)这条边,需要对邻接表结构中右边表的阴影两个结点进行删除操作,.....
P235的图的阴影画错了吧,应该是是画V2那边的那个结点0吧!
2011-10-04 13:25 | 盲剑客      

#150楼[楼主]  回复 引用 查看   

@盲剑客
感谢指正,的确是错误。
2011-10-08 15:10 | 伍迷      

#151楼  回复 引用 查看   

P330第三行:结点是58(即它的左子树高度2减去右子树高度0)
左子树高度应该是3吧
2011-10-08 15:35 | xiaosmile2000      

#152楼  回复 引用 查看   

图8-7-3,58的左子树深度:结点47->结点35->结点37,不是深度为3吗?
2011-10-08 17:03 | xiaosmile2000      

#153楼[楼主]  回复 引用 查看   

@xiaosmile2000
经过仔细确认,您提到的的确是错误,我前面搞错了,非常感谢!
2011-10-09 09:52 | 伍迷      

#154楼  回复 引用   

2.06 P60,代码中第6行
“/*声明一结点p*/”应该改为“/*声明一指针p*/”,( 小老K 提供)

跪求赐教 为什么P是指针 不是节点
2011-10-11 10:46 | cici_nn[未注册用户]

#155楼  回复 引用   

@snan4love
还是不解:
但是P66 CreateListHead中 必须使用 LinkList *L,因为 你要改变linkList这个值真的值。*L=(LinkList)malloc(sizeof(Node))

你要改变linkList这个值真的值 是啥意思?

PS 我是学java的 C不太懂~
2011-10-11 14:05 | cici_nn[未注册用户]

#156楼[楼主]  回复 引用 查看   

@cici_nn
建议你先去学习一下C语言。不然可能会在阅读上有很多困惑,你有开发基础,看完一本C语言的基础知识,用不了几天时间。加油!
2011-10-12 11:04 | 伍迷      

#157楼  回复 引用   

P353 页 B+树的插图是不是也有点问题?怎么感觉不符合定义了。。。
2011-10-17 16:39 | xinyu16077[未注册用户]

#158楼  回复 引用 查看   

我说哥哥,这错也太多了.改的我都烦了...
2011-10-17 17:23 | beyoung      

#159楼[楼主]  回复 引用 查看   

@beyoung
我很抱歉!
2011-10-17 17:38 | 伍迷      

#160楼  回复 引用   

勘误 P339
AVL树源代码:第22行:
if(taller)
改为
if(*talller)
一个小指针,不细心可是要害惨程序员的
很走运,这个例子里面
a[10]={3,2,1,4,5,6,7,10,9,8};
正好没有受这个指针影响。提供下载的源代码里面也有这个问题。
2011-10-17 21:44 | Jakson[未注册用户]

#161楼[楼主]  回复 引用 查看   

@Jakson
感谢回复,的确是笔误。加入勘误中。
2011-10-18 09:06 | 伍迷      

#162楼  回复 引用 查看   

书上虽然有很多错误,不过确实学到不少东西,但有个缺点就是书里讲解的内容不是很全,有些地方讲的不是很深,很多想看的地方反而一笔带过,简单的地方确讲了不少篇幅,希望老师能出第二版 并且越来越全,越来越有深度。
2011-10-27 16:30 | 80后的一缕忧伤      

#163楼[楼主]  回复 引用 查看   

@80后的一缕忧伤
感谢您的指正,不知能否将您认为没讲到的,讲得不深入的知识点告诉我吗?
2011-10-28 08:52 | 伍迷      

#164楼  回复 引用   

程老师,请问您书中传递的*L是否可以直接替代严老师书中传递的&L?
2011-10-28 21:53 | rokkie[未注册用户]

#165楼[楼主]  回复 引用 查看   

基本上可以,不过有些小地方的差异。建议不妨下载我提供的源代码做对比。
2011-10-29 22:19 | 伍迷      

#166楼  回复 引用 查看   

程老师,您好!
源代码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)

请核实!期待您的答复!
2011-10-31 20:03 | 闫丰      

#167楼[楼主]  回复 引用 查看   

@闫丰
我查看了一下,这两段代码应该没有问题。你要注意s.top1起始是-1。请设置断点跟踪调试来判断问题出在哪里。
2011-11-02 11:17 | 伍迷      

#168楼  回复 引用   

建议勘误的顺序按页数来排序,不然看着好辛苦啊。。。还得自己复制下来重新人排序
2011-11-02 13:00 | busy[未注册用户]

#169楼[楼主]  回复 引用 查看   

@busy
这个主要是因为读者发现错误的时间有前后,所以勘误是追加的方式,以便于原先已经勘误过一部分的读者可以知道后面追加了哪些。抱歉了!
2011-11-02 17:19 | 伍迷      

#170楼  回复 引用   

@伍迷
也对,不过最好有两个版本,一个按页数排,一个按勘误时间排,呵呵~
2011-11-04 12:13 | busy[未注册用户]

#171楼  回复 引用 查看   

有个问题不是错误,但是让我纠结了很久
P197 最下面两行
则将这个左孩子的右孩子结点、右孩子的右孩子结点、右孩子的右孩子的右孩子结点
让我误解为
1.左孩子的右孩子结点
2.右孩子的右孩子节点
2011-11-06 23:44 | 小墨的童鞋      

#172楼  回复 引用 查看   

P329 倒数第二行,“结点58左子树高度为2”应该是“结点58左子树高度为3”
2011-11-09 07:57 | 小墨的童鞋      

#173楼  回复 引用 查看   

P330 那个图即使勘误也有些问题,因为在插入结点37之前,他就不平衡。。但是书上原文的潜台词是37导致的不平衡,所以这个图还是有些问题。。
2011-11-09 08:13 | 小墨的童鞋      

#174楼[楼主]  回复 引用 查看   

@小墨的童鞋
感谢您的指正,由于目前不是写作状态,这个错误更改有些仓促,没有仔细核对,目前已经修正到勘误。
2011-11-09 09:20 | 伍迷      

#175楼  回复 引用 查看   

@伍迷
虽然有些错误,但是不得不说还是一本相当好的书。最近准备软考,你这本书和大话设计模式都是重头戏
非常感谢!
2011-11-09 14:45 | 小墨的童鞋      

#176楼[楼主]  回复 引用 查看   

@小墨的童鞋
哈哈,我都没有参加过软考,估计也没精力去尝试。祝你成功!
2011-11-09 15:49 | 伍迷      

#177楼  回复 引用 查看   

@伍迷
前几天钱包丢了,证件都在里边呢,估计也考不成了
自己不是科班毕业,考软考也是给自己找个事情干干,补补基础知识,学学数据结构蛮有意思
如果不是这个扯淡的考试,估计我永远也不会去学数据结构啥的。。
2011-11-10 12:09 | 小墨的童鞋      

#178楼[楼主]  回复 引用 查看   

@小墨的童鞋
唉,你很不幸。我想说的是,付出不一定是马上回报,付出也不一定会是你想要的回报,但付出一定会有回报。加油!
2011-11-10 23:33 | 伍迷      

#179楼  回复 引用 查看   

@伍迷
说的对啊,我也一直这样想的..
2011-11-10 23:35 | 小墨的童鞋      

#180楼  回复 引用   

伍迷,你好,请问什么时候,哪个网上书店能买到第三次印刷的? 现在当当,京东的是第几次印刷的?
2011-11-23 11:07 | 心中有梦[未注册用户]

#181楼  回复 引用 查看   

引用心中有梦:伍迷,你好,请问什么时候,哪个网上书店能买到第三次印刷的? 现在当当,京东的是第几次印刷的?
2011-11-23 13:32 | 安颜      

#182楼[楼主]  回复 引用 查看   

@心中有梦
@安颜
据清华大学出版社的消息,目前当当和卓越都已经采购了第三次印刷的书。但是否他们已经将第二次印刷的库存销完还不太清楚,因为通常他们都是提前采购,以避免突然缺货。
2011-11-24 08:55 | 伍迷      

#183楼  回复 引用   

351页第6段里多有的 └m/2┘都应该是 ┌m/2┐
话说看你的这本破书真累,提心吊胆的,这么多错误,真怕你把人带到沟里!
2011-12-01 16:50 | 给你改错[未注册用户]

#184楼  回复 引用 查看   

第3章,链表实现上,malloc有些没有做是否为空的判断,不够严谨;
静态链表的实现上面,没有判断LENGTH是否超出了MAXSIZE(参考顺序表,里面会判断长度与MAXSIZE的大小),不够严谨
2011-12-02 11:03 | jacro      

#185楼[楼主]  回复 引用 查看   

@给你改错
感谢您的指正。我查看了我当时的初稿是没有错的,但经过几道出版社的美术编辑对符号的处理之后,由于不了解造成了这种不必要的错误。后期审查我也没有发现,非常抱歉。
2011-12-05 15:53 | 伍迷      

#186楼[楼主]  回复 引用 查看   

@jacro
感谢您的指正,希望您能够直接给出具体的错误位置和说明,以便于我更正,谢谢!
2011-12-07 10:17 | 伍迷      

#187楼  回复 引用 查看   

楼主,P108页倒数第4行的“是右括号或优先级低于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出”,这里有错误。应该改为“是右括号或优先级小于等于栈顶符号...则依次输出小于等于当前元素的栈顶元素”才对。我表达或许不是太好,大概是这个意思。麻烦你看一下,我调试过好几遍了
2011-12-07 21:31 | 大娘      

#188楼[楼主]  回复 引用 查看   

@大娘
我仔细阅读了你的建议,我想只是我们在对“低于”与“小于等于”的理解上不一致,那一段话是需要后面P108-P110的全面讲解来解释的。所以我的意思是不需要更改,您能理解明白就可以了。这一部分的真正比较严重的错误在下面,勘误中有,请注意修改。

P109,第6条,将第一个句号前的句子与第二个句号前的句子对调。结果为“紧接着是符号"X",因为此时的栈顶符号……因此不输出,"*"进栈。接着是数字3,输出,总的表达式为931-3。”
2011-12-08 09:17 | 伍迷      

#189楼  回复 引用   

我本来想买第二版,但是错误多了就一直没敢买,等着第三版出来。想问下第三版应该错误纠正了吧
2011-12-09 20:34 | buzy[未注册用户]

#190楼  回复 引用 查看   

想知道楼主用什么画图的?
想知道楼主用什么画图的?
2011-12-09 22:58 | wallwind      

#191楼[楼主]  回复 引用 查看   

@wallwind
Visio 2007
2011-12-12 08:57 | 伍迷      

#192楼  回复 引用 查看   

@伍迷

看来我的visio功力有待提升啊!
2011-12-12 08:59 | wallwind      

#193楼  回复 引用   

刚开始看 第一个代码 线性表的顺序存储
代码 SqList Lb; 定义放在后面
在c的标准里面是有问题的
变量的定义应该在代码前面
否则 vc 6.0 会报错
不懂作者为什么要在后面定义,
反正都要用定义到前面不行吗
有些编译器 就不能理解这个
就会报错
就好像我写驱动
上次就是变量定义位置导致的错误
让我找了半天

#194楼  回复 引用 查看   

2011年 12 月 第3次印刷的

大话数据结构里面
第61页

在 GetElem 函数中

下面这段


while(p&&j<i)
{
p = p->next;
++j;
}

if(!p || j>=i)
return ERROR; //这个函数 每次都会执行到这里,不知道我有没有理解错唔 请多多指教。
后面的几个操作函数,也有类似的代码。
2011-12-18 10:47 | kenly2007      

#195楼  回复 引用 查看   

程老师,第一版的P63,应该是在L中第i个位置之后插入新的数据元素吧。
2011-12-19 16:57 | shiney      

#196楼  回复 引用 查看   

楼上,那是j>i吧,第一版里面是j>i,是对的
2011-12-19 17:09 | shiney      

#197楼[楼主]  回复 引用 查看   

@一白三千里
感谢您的指正,我已经更改了下载的代码。
2011-12-20 09:05 | 伍迷      

#198楼[楼主]  回复 引用 查看   

@kenly2007
这个错误仅在第三次印刷中出现(是我和与编辑沟通出现的问题),感谢指正,已经在勘误中提交。
2011-12-20 09:29 | 伍迷      

#199楼  回复 引用   

P329, 最后一段, 第一句 “看图 8-7-2, 为什么图1是平衡二叉树,而图2却不是呢?” 图1 也不是平衡二叉树呀。 58, 88 的左右子树高度已经相差2了。
2011-12-24 15:11 | midgard[未注册用户]

#200楼  回复 引用   

第一版,P72 第一段倒数第二行,当整个链表为空时,则为02,如图3-12-1,
图上写的却是0

是否此处的02(0平方)应是0呢?
2012-01-15 16:17 | iristrice[未注册用户]

#201楼  回复 引用   

p74页 静态链表擦入新的元素 代码第11行
for(l=1;l<=i-1;l++)
k = L[k].cur;
这里是否可以不用循环实现?
因为静态链表是用数组实现的,数组中的每一个元素都是同类型也就是说内存中是定长的,所以寻址可以用数组下标实现.比如要在静态链表的第i位置擦入一个新的元素,就可以直接用i的前一个元素的cur值符给新元素的cur,然后i的前一个元素的cur值再改变为新的元素的下标.
L[新元素].cur = L[i-1].cur;
L[i-1].cur = L[新元素];
2012-01-15 17:13 | odgs[未注册用户]

#202楼[楼主]  回复 引用 查看   

@iristrice
这里的2其实是本页最下方的“注2”的意思,让您误解了,抱歉!
2012-01-17 09:28 | 伍迷      

#203楼[楼主]  回复 引用 查看   

@odgs
理论上,您说的也是有可能的。您不妨试着改造一下程序来测试一下。
2012-01-17 09:35 | 伍迷      

#204楼  回复 引用   

年三十晚上上来问一下
首先祝老师新年快乐!
下面是我的问题
p140页在用例子讲解kmp算法时看得我很郁闷
一个例子t串 ababaaaba
第6,7,8,9步完全没看懂,虽然看字面很容易理解前缀后缀相等 next数组元素的值就等于相同的元素个数加1,关键的问题是这个t串的前缀后缀怎么得来的啊!!
比如书上讲的"当j = 6时,j由1到j-1的串是ababa,由于前缀字符aba与后缀字符aba相等".注意,这里不是才说了j由1到j-1的串是ababa那前缀都用了三个了aba那后缀不就是ba了吗怎么还是aba啊?
"当j = 7时,j由1到j-1的串是ababaa,由于前缀字符ab与后缀字符aa不相等,只有a相等."这里的前缀ab不是接着跟他后面的ab相同吗?
还有下面一个例子"aaaaaaaab"
"当j=9时,"j由1到j-1的串是"aaaaaaaa",由于前缀字符"aaaaaaa"与后缀字符"aaaaaaa"相等" 前缀都用了7个a了那后缀不就是只有一个a了吗怎么还是7个a呢?

我的问题的关键就是这个前缀的长度是不固定的通过例子也没看出什么划定前缀长度的法则,看得很是郁闷
比如说就拿一个串ababaa来说,怎么划分它的前缀和后缀?前缀是从哪里到哪里?得来的原则是什么?
2012-01-22 22:23 | odgs[未注册用户]

#205楼  回复 引用   

KMP算法那个数学公式的推出太跳跃了,看不懂。网上查资料

#206楼  回复 引用   

KMP算法的描述太烂了,希望能更详细
2012-01-31 10:10 | study123[未注册用户]

#207楼  回复 引用   

引用伍迷:
@闫丰
我查看了一下,这两段代码应该没有问题。你要注意s.top1起始是-1。请设置断点跟踪调试来判断问题出在哪里。


源代码确实是有问题的(因为我自己编写测试发现确实是traverseStack)会把top1的最后一个元素忽略掉,main函数的测试代码已经说明了问题:for循环了5次,traverseStack的输出值:
“栈中元素依次为:1 2 3 4 18 19 20” top1 打印出了1~4,栈中确实插入了5,却没打印出来。

修改方法有两种:
1、 i=-1; // 和起始位置一样
2、 while循环加等号,多循环一次即可

length的函数没时间实现,按照您的代码的结果,应该也是有问题的,您再看看
2012-02-05 02:22 | iristrice[未注册用户]

#208楼[楼主]  回复 引用 查看   

@study123
@数据结构初学
@odgs
KMP算法是这本书中,第一个比较复杂的算法,本身有难度,您们可以查阅其他相关书籍,我是研究了市面绝大多数算法书后,写出的。应该说,我的写法已经是比较容易理解的了。
但是对于一个复杂算法,初学者学习有困难,其实还是很正常的。希望克服畏难情绪,沉下心来仔细琢磨,一定可以弄明白它的原理。我当年也是这样学过来的。
2012-02-07 09:51 | 伍迷      

#209楼[楼主]  回复 引用 查看   

@odgs
当j=6时,j由1到j-1就是指这个串T的前5个是ababa,通过观察,你会发现,前三个aba和后三个aba是相同的,所以next[6]=三个字母+1=4.
2012-02-07 09:55 | 伍迷      

#210楼[楼主]  回复 引用 查看   

@iristrice
@闫丰
二位,我仔细阅读了您们的建议,此处代码的确不严谨,应该是按照闫丰朋友的说法修改。感谢!
2012-02-07 10:27 | 伍迷      

#211楼  回复 引用 查看   

P234 图7-4-10 右下角那句“V2后再无V0的入边顶点,所以其taillink为空” taillink应该是headlink吧
2012-02-11 14:53 | 风碎月      

#212楼[楼主]  回复 引用 查看   

@风碎月
感谢指正,的确是错误。已经加入勘误!
2012-02-13 09:27 | 伍迷      

#213楼  回复 引用 查看   

P256 图7-6-12 i=6应该是i=9吧
2012-02-14 21:06 | 风碎月      

#214楼[楼主]  回复 引用 查看   

@风碎月
应该还是6.
2012-02-16 09:41 | 伍迷      
评论共3页: 上一页 1 2 3 
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 2081574 Gzt9e9iwzE0=

导航

公告

    《大话数据结构》第三次印刷已将勘误中的错误修正,预计在2011年12月在各大网上书店中有售。具体时间由网店决定,我也不清楚,如果有买到的朋友能否给我发封邮件呀。再次向已经购买第一二次印刷的读者说一声抱歉,给您要花时间修正错误添麻烦了,当然您们在花费二十多分钟的修改后就能尽早阅读本书,也算是有遗憾后值得欣慰的地方!


联系邮箱:chengjielong#163.com
(中间“#”换成“@”)


新浪微博:http://weibo.com/cj723


本人《大话数据结构》2011年6月简体中文版由清华大学出版社出版,繁体中文版由台湾悦知文化出版



简体中文版


繁体中文版


本人因《大话设计模式》而获得51CTO网站主办的"2008年十大IT图书最佳原创作者奖" ;《大话设计模式》获互动出版网评选的2008年度十大畅销经典第4名;当当网计算机/网络类2008年度畅销榜第6名



简体中文版


繁体中文版
昵称:伍迷
园龄:5年6个月
荣誉:推荐博客
粉丝:694
关注:18

搜索

 

常用链接

随笔分类(166)

随笔档案(139)

相册

朋友

积分与排名

  • 积分 - 536501
  • 排名 - 108

最新评论

阅读排行榜

推荐排行榜