重要提示: 请勿将账号共享给其他人使用,违者账号将被封禁!
查看《购买须知》>>>
当前位置: 首页 > 计算机类考试 > 软考中级
网友您好, 请在下方输入框内输入要搜索的题目:
搜题

题目

[主观题]

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

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

【预备知识】

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

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

图3最优二叉树

表5 结构数组Ht

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

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

define MAXLEAFNUM 20

struct node{

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

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

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

int lchild,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+1)*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[p].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)

{ int 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);

}

}

查看参考答案
赏学吧APP
TOP
重置密码
账号:
旧密码:
新密码:
确认密码:
确认修改
购买搜题卡查看答案
购买前请仔细阅读《购买须知》
请选择支付方式
微信支付
支付宝支付
点击支付即表示你同意并接受《服务协议》《购买须知》
立即支付
搜题卡使用说明

1. 搜题次数扣减规则:

功能 扣减规则
基础费
(查看答案)
加收费
(AI功能)
文字搜题、查看答案 1/每题 0/每次
语音搜题、查看答案 1/每题 2/每次
单题拍照识别、查看答案 1/每题 2/每次
整页拍照识别、查看答案 1/每题 5/每次

备注:网站、APP、小程序均支持文字搜题、查看答案;语音搜题、单题拍照识别、整页拍照识别仅APP、小程序支持。

2. 使用语音搜索、拍照搜索等AI功能需安装APP(或打开微信小程序)。

3. 搜题卡过期将作废,不支持退款,请在有效期内使用完毕。

请使用微信扫码支付(元)
订单号:
遇到问题请联系在线客服
请不要关闭本页面,支付完成后请点击【支付完成】按钮
遇到问题请联系在线客服
恭喜您,购买搜题卡成功 系统为您生成的账号密码如下:
重要提示: 请勿将账号共享给其他人使用,违者账号将被封禁。
发送账号到微信 保存账号查看答案
怕账号密码记不住?建议关注微信公众号绑定微信,开通微信扫码登录功能
警告:系统检测到您的账号存在安全风险

为了保护您的账号安全,请在“赏学吧”公众号进行验证,点击“官网服务”-“账号验证”后输入验证码“”完成验证,验证成功后方可继续查看答案!

- 微信扫码关注赏学吧 -
警告:系统检测到您的账号存在安全风险
抱歉,您的账号因涉嫌违反赏学吧购买须知被冻结。您可在“赏学吧”微信公众号中的“官网服务”-“账号解封申请”申请解封,或联系客服
- 微信扫码关注赏学吧 -
请用微信扫码测试
温馨提示
每个试题只能免费做一次,如需多次做题,请购买搜题卡
立即购买
稍后再说
赏学吧