c语言-哈夫曼编码实验报告,C语言哈夫曼编码代码.doc

253b171540df25e1b84436cbe50dfc72.gifC语言哈夫曼编码代码.doc

include include include int m,s1,s2; typedef struct unsigned int weight; unsigned int parent,lchild,rchild; HTNode,*HuffmanTree; 动态分配数组存储哈夫曼树 typedef char *HuffmanCode; 动态分配数组存储哈夫曼编码表 void SelectHuffmanTree HT,int n int i,j; fori 1;i n;i ifHTi.parents1 i;break; forj i1;j n;j ifHTj.parents2 j;break; fori 1;i HTi.weight forj 1;j HTj.weight void HuffmanCodingHuffmanTree char *cd; int p; int cdlen; if n1 return; m 2 * n - 1; HT HuffmanTreemallocm1 * sizeofHTNode; 0 号 单元未用 for i1; in; i 初始化 HTi.weightwi-1; HTi.parent0; HTi.lchild0; HTi.rchild0; for in1; im; i 初始化 HTi.weight0; HTi.parent0; HTi.lchild0; HTi.rchild0; puts“n 哈夫曼树的构造过程如下所示“; printf“HT 初态n 结 点 weight parent lchild rchild“; for i1; im; i printf“n4d8d8d8d8d“,i,HTi.weight, HTi.parent,HTi.lchild, HTi.rchild; printf“ 按任意键,继续 .“; getchar; for in1; im; i 建哈夫曼树 在 HT1i-1中选择 parent 为 0 且 weight 最小的两个结点, 其序号分别为 s1 和 s2。 SelectHT, i-1; HTs1.parent i; HTs2.parent i; HTi.lchild s1; HTi.rchild s2; HTi.weight HTs1.weight HTs2.weight; printf“nselect s1d s2dn“, s1, s2; printf“ 结点 weight parent lchild rchild“; for j1; ji; j printf“n4d8d8d8d8d“,j,HTj.weight, HTj.parent,HTj.lchild, HTj.rchild; printf“ 按任意键,继续 .“; getchar; 无栈非递归遍历哈夫曼树,求哈夫曼编码 cd char *mallocn*sizeofchar; 分配求编码的工作空间 p m; cdlen 0; for i1; im; i 遍历哈夫曼树时用作结点状态标志 HTi.weight 0; while p if HTp.weight0 向 左 HTp.weight 1; if HTp.lchild 0 p HTp.lchild; cdc dlen 0; else if HTp.rchild 0 登记叶子 结点的字符的编码 HCp char *malloccdlen1 * sizeofchar; cdcdlen 0; strcpyHCp, cd; 复制编码串 else if HTp.weight1 向右 HTp.weight 2; if HTp.rchild 0 p HTp.rchild; cdc dlen 1; else HTp.weight2,退回退到父结点,编码长度 减 1 HTp.weight 0; p HTp.parent; cdlen; HuffmanCoding int main HuffmanTree HT;HuffmanCode *HC;int *w,n,i; puts“输入结点数“; scanf“d“, getchar; HC HuffmanCode *mallocn*sizeofHuffmanCode; w int *mallocn*sizeofint; printf“输入d 个结点的权值n“,n; fori 0;i n;i scanf“d“, getchar; HuffmanCodingHT,HC,w,n; puts“n 各结点的哈夫曼编码“; fori 1;i n;i printf“2d4dsn“,i,wi-1,HCi; getchar;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值