早教吧 育儿知识 作业答案 考试题库 百科 知识分享
早教吧考试题库频道 --> 计算机类考试 -->软考中级 -->

阅读以下预备知识、函数说明和C代码,将应填入(n)处的字句写在对应栏内。 [预备知识] ①对给定的字符

题目

阅读以下预备知识、函数说明和C代码,将应填入(n)处的字句写在对应栏内。

[预备知识]

①对给定的字符集合及相应的权值,采用哈夫曼算法构造最优二叉树,并用结构数组存储最优二叉树。例如,给定字符集合{a,b,c,d}及其权值2、7、4、5,可构造如图3所示的最优二叉树和相应的结构数组Ht(数组元素Ht[0]不用)(见表5)。

结构数组HT的类型定义如下:

define MAXLEAFNUM 20

struct node {

char ch; / * 当前结点表示的字符,对于非叶子结点,此域不用*/

int weight; / * 当前结点的权值*/

int parent; / * 当前结点的父结点的下标,为0时表示无父结点*/

int Ichild, rchild

/ *当前结点的左、右孩子结点的下标,为0时表示无对应的孩子结点* /

} Ht[2 * MAXLEAFNUM];

②用"0"或"1"标识最优二叉树中分支的规则是:从一个结点进入其左(右)孩子结点,就用"0"("1")标识该分支(示例如图3所示)。

③若用上述规则标识最优二叉树的每条分支后,从根结点开始到叶子结点为止,按经过分支的次序,将相应标识依次排列,可得到由"0"、"1"组成的一个序列,称此序列为该叶子结点的前缀编码。如图3所示的叶子结点a、b、c、d的前缀编码分别是110、0、111、10。

【函数5.1说明】

函数void LeafCode (int root, int n)的功能是:采用非递归方法,遍历最优二叉树的全部叶子结点,为所有的叶子结点构造前缀编码。其中形参root为最优二叉树的根结点下标;形参 n为叶子结点个数。

在构造过程中,将Ht[p]. weight域用作被遍历结点的遍历状态标志。

【函数5.1】

char * * Hc;

void LeafCode (int root, int n)

{/*为最优二叉树中的n个叶子结点构造前缀编码,root是树的根结点下标* /

int i,p = root,cdlen =0;char code[20];

Hc=(char* * )malloc(.(n +]) *sizeof(char* )); /* 申请字符指针数组* /

for(i=1;i< =p;++i)

Ht[ i]. weight =0;/* 遍历最优二叉树时用作被遍历结点的状态标志*/

while(p) {/*以非递归方法遍历最优二叉树,求树中每个叶子结点的编码*/

if(Ht[p], weight ==0) { /*向左*/

Ht[ p]. weight =1

if (Ht[p],lchild !=0) { p=Ht[P].lchild; code[cdlen++] ="0";]

else if (Ht[p]. rchild ==0) {/* 若是叶子结点,则保存其前缀编码*/

Hc[p] = ( char * ) malloc( (cdlen + 1 ) * sizeof (char) );

(1); strcpy(He[ p] ,code);

}

}

else if (Ht[ pi, weight == 1) { /*向右*/

Ht[p]. weight =2;

if(Ht[p].rchild !=0) {p=Ht[p].rchild; code[cdlen++] ="1";}

}

else{/* Ht[p]. weight ==2,回退*/

Ht[p]. weight =0;

p=(2);(3); /*退回父结点*/

}

}/* while结束* /

}

【函数5.2说明】

函数void Decode(char*buff, int root)的功能是:将前缀编码序列翻译成叶子结点的字符序列并输出。其中形参root为最优二叉树的根结点下标;形参buff指向前缀编码序列。

【函数5.2】

void Decode( char * buff, int root)

Iint pre =root,p;

while ( * buff! = "\0") {

p = root;

while (p!=0){/*存在下标为p的结点*/

pre=p;

if((4))p=Ht[p].lchild; /*进入左子树*/

else p = Ht[p]. rchild; / *进入右子树*./

buff ++; / * 指向前缀编码序列的下一个字符* /

}

(5);

printf("%c", Ht [ pre]. ch);

}

}

参考答案
正确答案:(1)code[cdlen]='\0'或code[cdlen]=0(2)Ht[p].par- ent (3)--cdlen或等价形式(4)*buff=='0'或等价形式 (5)buff--或等价形式
(1)code[cdlen]='\0'或code[cdlen]=0(2)Ht[p].par- ent (3)--cdlen或等价形式(4)*buff=='0'或等价形式 (5)buff--或等价形式 解析:(1)根据注释的提示,可知此小段代码的作用是把code字符串保存起来,结合下一句,可知应给code字符串添加一个结束符'0'。(2)将指针指向当前结点的父结点。(3)将code指针前移一位。(4)如果前缀编码为,'0'进入左子树。(5)注意下一个语句,Prinf(“%c”,Ht[pre].ch);其参数是pre,内层循环中有pre=p,这样做的目的是当Ht[p].lchild或 Ht[p]. rchild等于0时,不把这—层链人结果。
看了阅读以下预备知识、函数说明和C...的网友还看了以下:

将下列句子合成一段完整的,合乎逻辑的话.正确的排序是?1有一些远虑,可以预见可以预做筹划,不妨就预 语文 2020-05-16 …

关于“企业所得税月(季)度预缴纳税申报表(A类)”的填写企业所得税月(季)度预缴纳税申报表(A类) 其他 2020-05-16 …

英语翻译客户要求我们在送货之前要填写他们的送货单和预约表,要在送货前提前至少一天以上的时间进行预约 英语 2020-05-16 …

按预算编制形式分类,政府预算可以为( )。A.平衡预算 B.复式预算 C.差额预算 D.零基预 财会类考试 2020-05-21 …

按预算编制形式分类,政府预算可以分为( )。 A.平衡预算 B.复式预算 C.差额预算 D.零基预算 财会类考试 2020-05-30 …

资产负债表中,应收,预付,应付,预收账款的填列问题这样写的:“应收账款”项目应根据“应收账款"和预 其他 2020-07-03 …

在3×3方格上做填字游戏,要求在空格上填上适当数字,使每行、每列以及对角线上三个方格内的数字之和都 其他 2020-08-01 …

下列各句中,没有语病的一项是()A.市民只要进入官方微信的“办事早预约”栏目,选择要办理预约的部门, 语文 2020-11-07 …

关于色谱柱色谱柱的预装柱和制备柱有什么区别预装柱里有填料吗?如果我用整体柱需不需要专门的填装工具 语文 2020-11-13 …

你认为人看书的明视距离应是:(填以下选项).A.10cmB.25cmC.50cmD.都可以如何预防眼 物理 2020-12-10 …