1、1第 1 章 绪 论2 . ( 1 ) ( 2 ) ( 3 ) 3 . ( 1) A ( 2 ) C( 3) C5 . 计算下列程序中 x=x+1 的语句频度f o r ( i = 1 ; i n e x t = S ;B P - n e x t = P - n e x t - n e x t ;C P - n e x t = S - n e x t ;D S - n e x t = P - n e x t ;E S - n e x t = L ;F S - n e x t = N U L L ;G Q = P ;H wh i l e ( P - n e x t ! = Q ) P = P -
2、 n e xt ;I wh i l e ( P - n e x t ! = NU L L ) P = P - n e xt ;J P = Q ;K P = L ;L L = S ;3M L = P ;( 3 ) D( 4 ) D( 5 ) D( 6 ) A7 试 分别 以不 同 的存 储结 构 实现 单线 表 的就 地逆 置 算法 ,即 在 原表 的存 储 空间 将线 性 表( a 1 , a2 , , a n )逆置为 ( a n , an - 1 , , a 1 ) 。【解答】( 1 )用一维数组作为存储结构voi d i n ver t ( S e q L i st * L , i n
3、t * n u m)i n t j ;E l e mT ype t mp ;f o r ( j = 0 ; j n e x t = = N U L L ) r e t u r n ; / * 链表为空 * /p = L - n e x t ;q = p - n e x t ;p - n e x t = N U L L ; / * 摘下第一个结点,生成初始逆置表 * /w h i l e ( q ! = NU L L ) / * 从第二个结点起依次头插入当前逆置表 * / r = q - n e x t ;q - n e x t = L - n e x t ;L - n e x t = q ;q
4、 = r ;1 1 将 线 性 表 A = ( a 1 , a 2 , a m) , B = ( b 1 , b 2 , b n ) 合 并 成 线 性 表 C ,C = ( a 1 , b 1 , a m, b m, b m+ 1 , . b n ) 当 m n 时 , 线性表 A、 B、 C 以单链表作为存储结构 , 且 C 表利用 A 表和 B 表中的结点空间构成。注意:单链表的长度值 m 和 n 均未显式存储。【解答】算法如下:L i n kLi st me r g e ( L i n kLi st A , L i n kLi st B , L i n kLi st C ) No d
5、e * p a , * q a , * p b , * q b , * p ;p a = A - n e x t ; / * p a 表示 A 的当前结点 * /p b = B - n e x t ;p = A ; / * 利用 p 来指向新连接的表的表尾,初始值指向表 A 的头结点 * /wh i l e ( p a ! = N U L L q b = q b - n e x t ;p - n e x t = p a ; / * 交替选择表 A 和表 B 中的结点连接到新链表中; * /p = p a ;p - n e x t = p b ;p = p b ;4p a = q a ;p b
6、= q b ;i f ( p a ! = NU L L ) p - n e x t = p a ; / * A 的长度大于 B 的长度 * /i f ( p b ! = NU L L ) p - n e x t = p b ; / * B 的长度大于 A 的长度 * /C = A ;R e t u r n ( C ) ;实习题实习题实习题实习题约瑟夫环问题约瑟夫 问题的一种 描述为:编 号 1 , 2 , , n 的 n 个人按 顺时针方向 围坐一圈, 每个人持有 一个密码(正整数)。一开始任选一个报数上限值 m, 从第一个人开始顺时针自 1 开始顺序报数 , 报到 m 时停止报数 。 报 m
7、 的人出列 , 将他的密码作为新的 m 值 , 从他在顺时针方向上的下一个人开始重新从 1 报数 , 如此下去 , 直至所有的人全部出列为止 。 试设计一个程序 ,求出出列顺序 。 利用单向循环链表作为存储结构模拟此过程 , 按照出列顺序打印出各人的编号。例 如 m 的初值 为 2 0; n = 7 , 7 个人的密码依次是 : 3 , 1 , 7 , 2 , 4 , 8 , 4 , 出列顺序 为 6 , 1 , 4 , 7 , 2 , 3 , 5 。【解答】算法如下:t ype d e f st r u ct No d e i n t p a sswo r d ;i n t n u m;st
8、 r u ct N o d e * n e xt ; No d e , * L i n kl i st ;voi d J o sep h u s( )L i n kl i st L ;No d e * p , * r , * q ;i n t m, n , C , j ;L = ( No d e * ) ma l l o c( si zeo f ( No d e ) ) ; / * 初始化单向循环链表 * /i f ( L = = NU L L ) p r i n t f ( “ n 链表申请不到空间 ! “ ) ; r e t u r n ; L - n e x t = N U L L ;r
9、 = L ;p r i n t f ( “ 请输入数据 n 的值 ( n 0 ) : “ ) ;scan f ( “ %d “ , f o r ( j = 1 ; j p a sswo r d = C ;p - n u m= j ;r - n e x t = p ;r = p ;r - n e x t = L - n e x t ;5p r i n t f ( “ 请输入第一个报数上限值 m( m 0 ) : “ ) ;scan f ( “ %d “ , p r i n t f ( “ * * * * * * * * * * * * * * * * * * * * * * * * * * *
10、* * * * * * * * * * * * * * n “ ) ;p r i n t f ( “ 出列的顺序为 : n “ ) ;q = L ;p = L - n e x t ;wh i l e ( n ! = 1 ) / * 计算出列的顺序 * / j = 1 ;w h i l e ( j n e x t ;j + + ;p r i n t f ( “ %d - “ , p - n u m) ;m= p - p a sswo r d ; / * 获得新密码 * /n - - ;q - n e x t = p - n e x t ; / * p 出列 * /r = p ;p = p - n
11、 e x t ;f r e e ( r ) ;p r i n t f ( “ %d n “ , p - n u m) ;第 3 章 限定性线性表栈和队列第三章答案1 按 3 . 1 ( b ) 所示铁道(两侧铁道均为单向行驶道)进行车厢调度,回答:( 1 ) 如进站的车厢序列为 1 2 3 ,则可能得到的出站车厢序列是什么?( 2 ) 如进站的车厢序列为 1 2 3 4 5 6 , 能否得到 4 3 5 6 1 2 和 1 3 5 4 2 6 的出站序列 , 并说明原因(即写出以 “ S” 表示进栈 、 “ X ” 表示出栈的栈序列操作 ) 。【解答】( 1 )可能得到的出站车厢序列是: 1
12、2 3、 1 3 2、 2 1 3 、 2 3 1、 3 2 1 。( 2 ) 不能得到 4 3 5 6 1 2 的出站序列。因为 有 S ( 1 ) S ( 2 ) S ( 3 ) S ( 4 ) X( 4 ) X ( 3 ) S ( 5 ) X( 5 ) S ( 6 ) S ( 6 ) ,此 时按 照 “ 后进 先出 ” 的原则,出栈的顺序必须为 X ( 2 ) X( 1 ) 。能得到 1 3 5 4 2 6 的出站序列。因为有 S ( 1 ) X( 1 ) S ( 2 ) S ( 3 ) X ( 3 ) S ( 4 ) S ( 5 ) X( 5 ) X( 4 ) X ( 2 ) X( 1
13、 ) 。3 给出栈的两种存储结构形式名称,在这两种栈的存储结构中如何判别栈空与栈满?【解答 】 ( 1 )顺序栈 ( t o p 用来存放栈顶元素的下标)判断栈 S 空:如果 S - t o p = = - 1 表示栈空。判断栈 S 满:如果 S - t o p = = S t a ck_S i ze- 1 表示栈满。( 2 ) 链栈( t o p 为栈顶指针,指向当前栈顶元素前面的头结点)判断栈空:如果 t o p - n e x t = = N U L L 表示栈空。判断栈满:当系统没有可用空间时,申请不到空间存放要进栈的元素,此时栈满 。4 照四则运 算加、减、乘、 除和幂运算的优先 惯
14、例,画出对下 列表达式求值时操 作数栈和运算符栈的变化过程: A - B * C / D + E F6【解答】5 写一个算法 , 判断依次读入的一个以 为结束符的字母序列 , 是否形如 序列 1 C h a r ch, t e mp ;I n i t S t a ck(P r i n t f ( “ n 请输入字符序列: ” ) ;C h = g e t cha r ( ) ;Wh i l e ( ch! = ch= g e t cha r ( ) ;d o / * 判断序 列 2 是否是序 列 1 的逆序列 * / ch= g e t cha r ( ) ;P o p ( i f ( ch!
15、 = t e mp ) / * 序列 2 不是序列 1 的逆序列 * / r e t u r n ( F A L S E ) ; p r i n t f ( “ n NO ” ) ; wh i l e ( ch! = p r i n t f ( “ n Y E S ” ) ; / * 序列 2 是序列 1 的逆序列 * /e l se r e t u r n ( F A L S E ) ; p r i n t f ( “ n NO ” ) ; / * I sHu i We n ( ) * /8 要求循环队列不损失一个空间全部都能得到利用,设置一个标志 t a g , 以 t a g 为 0 或
16、 1 来区分头尾指针相同时的队列状态的空与满,请编写与此相应的入队与出队算法。【解答】 入队算法:i n t E n t e r Q u e u e ( S e q Q u e u e * Q , Q u e u e E l e me n t T ype x ) / * 将元素 x 入队 * /7i f ( Q - f r o n t = = Q - f r o n t i f ( Q - f r o n t = = Q - f r o n t Q - e l e me mt Q - r e a r = x ;Q - r e a r = ( Q - r e a r + 1 ) %MA X S
17、I Z E ; / * 设置队尾指针 * /R e t u r n ( T R UE ) ;出队算法:i n t D e l e t e Q u e u e ( S e q Q u e u e * Q , Q u e u e E l e me n t T ype * x) / * 删除队头元素,用 x 返回其值 * /i f ( Q - f r o n t = = Q - r e a r * x=Q - e l e me n t Q - f r o n t ;Q - f r o n t = ( Q - f r o n t + 1 ) %M A X S I Z E ; / * 重新设置队头指针
18、* /i f ( Q - f r o n t = = Q - r e a r ) t a g = 0 ; / * 队头元素出队后队列为空,重新设置标志域 * /R e t u r n ( T UU E ) ;第 4 章 串第四章答案1 设 s= I A M A S T U D E N T , t = G O O D , q = WO R K E R 。给出下列操作的结果:【解答】 S t r L e n g t h ( s) = 1 4 ;S u b S t r i n g ( sub 1 , s, 1 , 7 ) sub 1 = I A M A ;S u b S t r i n g ( su
19、b 2 , s, 7 , 1 ) sub 2 = ;S t r I n d e x( s, 4 , A ) = 6 ;S t r R e p l a ce( s, S T UD E N T , q ) ; s= I A M A WO R K E R ;S t r C a t ( S t r C a t ( sub 1 , t ) , S t r C a t ( sub 2 , q ) ) sub 1 = I A M A G O O D WO R K E R 。2 编写算法 , 实现串的基本操作 S t r R e p l a ce( S , T , V ) 。【解答】算法如下:i n t st
20、 r R e p l a ce( S S t r i n g S , S S t r i n g T , S S t r i n g V ) / * 用串 V 替换 S 中的所有子串 T * /i n t p o s, i ;p o s=st r I n d e x ( S , 1 , T ) ; / * 求 S 中子串 T 第一次出现的位置 * /i f ( p o s = = 0 ) r e t u r n ( 0 ) ;w h i l e ( p o s! = 0 ) / * 用串 V 替换 S 中的所有子串 T * / swi t ch( T . l e n - V. l e n )c
21、ase 0 : / * 串 T 的长度等于串 V 的长度 * /f o r ( i = 0 ; i ch p o s+i = V. ch i ;case 0 : / * 串 T 的长度大于串 V 的长度 * /f o r ( i = p o s+t . i e n ; i l e n ; i - - ) / * 将 S 中子串 T 后的所有字符S - ch i - t . l e n + v . l e n = S - ch i ; 前移 T . l e n - V. l e n 个位置 * /f o r ( i = 0 ; i ch p o s+i = V. ch i ;8S - l e n
22、 = S - l e n - T . l e n + V. l e n ;case l e n - T . l e n + V. l e n ) l e n - T . l e n + V. l e n ; i = p o s+T . l e n ; i - - )S - ch i = S - ch i - T . l e n + V. l e n ;f o r ( i = 0 ; i ch p o s+i = V. ch i ;S - l e n = S - l e n - T . l e n + V. l e n ; e l se / * 替换后串长 MA X L E N , 但串 V 可
23、以全部替换 * /i f ( p o s+V. l e n = p o s+T . l e n ; i - - )S - ch i = s- ch i - T . l e n + V . l e n f o r ( i = 0 ; i ch p o s+i = V. ch i ;S - l e n = MA X L E N ; e l se / * 串 V 的部分字符要舍弃 * / f o r ( i = 0 ; i ch i + p o s = V. ch i ;S - l e n = MA X L E N ; / * swi t ch( ) * /p o s=S t r I n d e x
24、 ( S , p o s+V . l e n , T ) ; / * 求 S 中下一个子串 T 的位置 * / / * w h i l e ( ) * /r e t u r n ( 1 ) ; / * S t r R e p l a ce( ) * /第五章第五章第五章第五章数组和广义表数组和广义表数组和广义表数组和广义表第五章答案1 . 假设有 6 行 8 列的二维 数组 A ,每个元 素占用 6 个字节, 存储器按字节编 址。已知 A 的基地址为 1 0 0 0 ,计算:( 1 ) 数组 A 共占用多少字节; ( 2 8 8 )( 2 ) 数组 A 的最后一个元素的地址; ( 1 2 8
25、2)( 3 ) 按行存储时,元素 A 3 6 的地址; ( 1 1 2 6)( 4 ) 按列存储时,元素 A 3 6 的地址; ( 1 1 9 2)4 . 设有三对角矩阵 An n , 将其三条对角线上的元素逐行的存于数组 B 1 . . 3 n - 2 中,使 得B k = a i j ,求 : ( 1 )用 i , j 表示 k 的下标变换公式 ; ( 2 )用 k 表示 i 、 j 的下标变换公式。【解答 】 ( 1 ) k=2 ( i - 1 ) + j( 2 ) i = k/ 3 + 1 , j = k/ 3 + k%3 ( 取整, %取余)5 . 在稀疏矩阵的快速转置算法 5 .
26、2 中,将计算 p o si t i o n col 的方法稍加改动,使算法只占用一个辅助向量空间。【解答】 算法(一)F a st T r a n spo seT S Ma t r i x ( T S M a r t r i x A , T S Ma t r i x * B ) / * 把矩阵 A 转置到 B 所指向的矩阵中去,矩阵用三元组表表示 * /i n t col , t , p , q ;i n t p o si t i o n MA X S I Z E ;B - l e n = A . l e n ; B - n = A . m; B - m= A . n ;i f ( B -
27、l e n 0 )9p o si t i o n 1 = 1 ;f o r ( t = 1 ; t d a t a q . r o w= A . d a t a p . col ;B - d a t a q . col = A . d a t a p . r o w;B - d a t a q . e = A . d a t a p . e ;P o si t i o n col + + ;算法 ( 二 )F a st T r a n spo seT S Ma t r i x ( T S M a r t r i x A , T S Ma t r i x * B )i n t col , t ,
28、 p , q ;i n t p o si t i o n MA X S I Z E ;B - l e n = A . l e n ; B - n = A . m; B - m= A . n ;i f ( B - l e n 0 ) f o r ( col = 1 ; col 0 ; col - - ) t = t - p o si t i o n col ;p o si t i o n col = t + 1 ;f o r ( p = 1 ; p d a t a q . r o w= A . d a t a p . col ;B - d a t a q . col = A . d a t a
29、p . r o w;B - d a t a q . e = A . d a t a p . e ;P o si t i o n col + + ;8 . 画出下面广义表的两种存储结构图示 :( ( ( ( a ) , b ) ) , ( ( ( ) , d ) , ( e , f ) ) )【解答】10第一种存储结构第二种存储结构9 . 求下列广义表运算的结果:( 1 ) H E A D ( ( a , b ) , ( c, d ) ) ; ( a , b )( 2 ) T A I L ( ( a , b ) , ( c, d ) ) ; ( ( c, d ) )( 3 ) T A I L H
30、 E A D ( ( a , b ) , ( c, d ) ) ; ( b )( 4 ) H E A D T A I L H E A D ( ( a , b ) , ( c, d ) ) ; b( 5 ) T A I L H E A D T A I L ( ( a , b ) , ( c, d ) ) ; ( d )第六章第六章答案6 1 分别画出具有 3 个结点的树和 3 个结点的二叉树的所有不同形态。【解答】11具有 3 个结点的树 具有 3 个结点的二叉树6 . 3 已知一 棵度为 k 的树中 有 n 1 个度为 1 的结点 , n2 个度为 2 的结点 , , n k 个度为 k的结点
31、,则该树中有多少个叶子结点?【解答】 设树中结点总数为 n , 则 n = n0 + n 1 + + n k树中分支数目为 B , 则 B = n 1 + 2 n 2 + 3 n3 + + knk因为除根结点外,每个结点均对应一个进入它的分支,所以有 n = B + 1即 n 0 + n 1 + + n k = n1 + 2 n 2 + 3 n3 + + knk + 1由上式可得叶子结点数为: n 0 = n 2 + 2 n 3 + + ( k-1 ) nk + 16 . 5 已知二叉树有 5 0 个叶子结点,则该二叉树的总结点数至少应有多少个?【解答】 n 0 表示叶子结点数, n 2 表示
32、度为 2 的结点数,则 n 0 = n 2 + 1所以 n 2 = n 0 1 = 4 9 ,当二叉树中没有度为 1 的结点时,总结点数 n = n 0 + n 2 = 9 96 . 6 试分别找出满足以下条件的所有二叉树 :( 1 ) 前序序列与中序序列相同 ;( 2 ) 中序序列与后序序列相同 ;( 3 ) 前序序列与后序序列相同。【解答】( 1 ) 前序与中序相同:空树或缺左子树的单支树;( 2 ) 中序与后序相同:空树或缺右子树的单支树;( 3 ) 前序与后序相同:空树或只有根结点的二叉树。6 . 9 假设通讯的电文仅由 8 个字母组成,字母在电文中出现的频率分别为:0 . 0 7,
33、0 . 1 9, 0 . 0 2 , 0 . 0 6, 0 . 3 2, 0 . 0 3, 0 . 2 1 , 0 . 1 0请为这 8 个字母设计哈夫曼编码。【解答】构造哈夫曼树如下:12哈夫曼编码为:I1 : 11111 I5 : 1100I2 : 11110 I6 : 10I3 : 1110 I7 : 01I4 : 1101 I8 : 006.11画出如下图所示树对应的二叉树。【解答】136 . 1 6 分别写出算法,实现在中序线索二叉树 T 中查找给定结点 * p 在中序序列中的前驱与后继。 在先序线 索二叉树 T 中,查找 给定结点 * p 在先序序 列中的后继。在后 序线索二叉树
34、T中,查找给定结点 * p 在后序序列中的前驱。( 1 )找结点的中序前驱结点B i T N o d e * I n P r e ( B i T No d e * p )/ * 在中序线索二叉树中查找 p 的中序前驱结点,并用 p r e 指针返回结果 * / i f ( p - L t a g = = 1 ) p r e = p - L C h i l d ; / * 直接利用线索 * /e l se / * 在 p 的左子树中查找 “ 最右下端 ” 结点 * /f o r ( q = p - L C h i l d ; q - R t a g = = 0 ; q = q - R C h i
35、 l d ) ;p r e = q ;r e t u r n ( p r e ) ;( 2 )找结点的中序后继结点B i T N o d e * I n S u cc ( B i T No d e * p )/ * 在中序线索二叉树中查找 p 的中序后继结点,并用 succ 指针返回结果 * / i f ( p - R t a g = = 1 ) succ = p - R C h i l d ; / * 直接利用线索 * /e l se / * 在 p 的右子树中查找 “ 最左下端 ” 结点 * /f o r ( q = p - R C h i l d ; q - L t a g = = 0
36、; q = q - L C h i l d ) ;14succ= q ;r e t u r n ( succ);( 3 ) 找结点的先序后继结点B i T N o d e * P r e S u cc ( B i T No d e * p )/ * 在先序线索二叉树中查找 p 的先序后继结点,并用 succ 指针返回结果 * / i f ( p - L t a g = = 0 ) succ = p - L C h i l d ;e l se succ= p - R C h i l d ;r e t u r n ( succ);( 4 ) 找结点的后序前驱结点B i T N o d e * S
37、u ccPr e ( B i T No d e * p )/ * 在后序线索二叉树中查找 p 的后序前驱结点,并用 p r e 指针返回结果 * / i f ( p - L t a g = = 1 ) p r e = p - L C h i l d ;e l se p r e = p - R C h i l d ;r e t u r n ( p r e ) ;6 . 2 0 已知二叉 树按照二叉链表方 式存储,利用栈 的基本操作写出先 序遍历非递归形 式的算法。【解答】V o i d P r e O r d e r ( B i T r e e r o o t ) / * 先序遍历二叉树的非递归
38、算法 * /I n i t S t a ck(p = r o o t ;w h i l e ( p ! = NU L L | | ! I sEm p t y( S ) ) i f ( p ! = N U L L )V i si t ( p - d a t a ) ;p u sh( p = p - L chi l d ;e l seP o p ( p = p - R C h i l d ;6 . 2 6 二叉树按照二叉链表方式存储,编写算法将二叉树左右子树进行交换。【解答】算法 ( 一 )V o i d e x cha n g e ( B i T r e e r o o t )p = r o o
39、 t ;i f ( p - L C h i l d ! = NU L L | | p - R C h i l d ! = N U L L )15t e mp = p - L C h i l d ;p - L C h i l d = p - R C h i l d ;p - R C h i l d = t e mp ;e x cha n g e ( p - L C h i l d ) ;e x cha n g e ( p - R C h i l d ) ;算法 ( 二 )V o i d e x cha n g e ( B i T r e e r o o t )p = r o o t ;i f (
40、 p - L C h i l d ! = NU L L | | p - R C h i l d ! = N U L L )e x cha n g e ( p - L C h i l d ) ;e x cha n g e ( p - R C h i l d ) ;t e mp = p - L C h i l d ;p - L C h i l d = p - R C h i l d ;p - R C h i l d = t e mp ;第八章第八章答案8 1 【解答】 5A S L s u c c =( 1 + 2 X 2 + 3 X 4 + 4 X 3 ) / 1 0 = 2 . 98.5 【解
41、答】16( 1)A S LS U C C = ( 1+2 X 2 + 3 X 3 + 4 X 3 + 5 X 2 + 6 ) / 12=3.5( 2) 排序为: A pr , Aug,D e c , F e b,J a n, J uly,J une, Ma r , Ma y,N ov, O c t , S e p折半查找 A S L S U C C = ( 1+2 X 2 + 3 X 4 + 4 X 5 ) / 12=37/128 . 1 2 【解答】A S LS U C C = ( 1 X4 + 2 X3 + 6 ) / 8=2A S LU N S UC C = ( 2+1+8+7+6+5+4+3+2+1+1) / 1 1=40/1 1