电子科大C语言作业提交1,电子科大嵌入式作业3-用C语言实现Huffman编码

《电子科大嵌入式作业3-用C语言实现Huffman编码》由会员分享,可在线阅读,更多相关《电子科大嵌入式作业3-用C语言实现Huffman编码(8页珍藏版)》请在人人文库网上搜索。

1、题目:用语言实现Huffman编码,并计算本节中块的编码长度(以位为单位),计算uffman编码的压缩比。/主程序:#define _CRT_SECURE_NO_WARNINGS /预编时处理一下,加个宏让其忽略安全检测#include#includetypedefstructHfTreeNodeint weight; /权重int parent; /父节点intlchild, rchild; /两个子节点Struct, *HfStruct;typedefstructchar code10;int start;HCodeType;voidquanDCT(short(*data)8, short。

2、(*result)8);/量化函数intcalWeight(short(*result), int(*Node), int(*Weight);/权重计算voidprint_data_screen(short data88);/数据打印/待编码数据shortDctData88 = 1149, 38, -43, -10, 25, -83, 10, 40 , -81, -3, 114, -73, -6, -2, 21, -5 , 13, -11, 0, -42, 25, -3, 16, -38 , 1, -61, -13, -12, 35, -23, -18, 4 , 43, 12, 36, -4,。

3、 9, -21, 6, -8 , 35, -11, -9, -4, 19, -28, -21, 13 , -19, -7, 20, -6, 2, 2, 11, -21 , -5, -13, -11, -17, -4, -1, 6, -4 ;HfStructcreate_HuffmanTree(int *WeightPoint, int n);/霍夫曼树创建函数voidHuffmanCoding(HfStruct HT, HCodeTypeHuffCode, int n);/霍夫曼编码函数void main()inti, j;/循环变量int Length;/编码节点数inttotalbits 。

4、= 0;/计算编码后的总的比特数int Node64;/节点数组int Weight64;/权重数组shortQuanResult88;/量化结果存储quanDCT(DctData, QuanResult);/数据量化printf(量化后的数据:n);/打印量化数据print_data_screen(QuanResult);Length = calWeight(*QuanResult, Node, Weight);/计算量化数据的节点与权重,并返回节点数int *maNode = (int*)malloc(Length*sizeof(int);/按有效节点进行分配int *maWeight =。

5、 (int*)malloc(Length*sizeof(int);/按有效节点进行分配for (i = 0; iLength; i+)*(maNode + i) = Nodei;/拷贝有效节点*(maWeight + i) = Weighti;/拷贝有效权重/根据权重与有效节点数创建霍夫曼树HfStruct p = create_HuffmanTree(maWeight, Length);/打印霍夫曼树printf(霍夫曼树:n);for (i = 0; i2 * Length - 1; i+)printf(父节点:%3d,左子节点:%3d,右子节点:%3d,权重:%3dn, pi.paren。

6、t, pi.lchild, pi.rchild, pi.weight);HCodeTypecode9;/依据霍夫曼树进行编码HuffmanCoding(p, code, Length);/霍夫曼编码/打印出编码结果printf(n编码结果:n);for (i = 0; iLength; i+)printf(节点:%3d,权重:%3d,编码:, *(maNode + i), *(maWeight + i);for (j = codei.start + 1; j Length; j+)printf(%c, codei.codej);printf(n);/计算编码后的总的比特数,计算压缩比for (。

7、i = 0; iLength; i+)j = Length - 1 - codei.start;totalbits = totalbits + maWeighti * j;printf(n编码后的总位数为:%d,压缩比为:%4.2fn, totalbits, (double)(64 * 8) / totalbits);while (1);shortQuanTable88 = 16, 11, 10, 16, 24, 40, 51, 61 , 12, 12, 14, 19, 26, 58, 60, 55 , 14, 13, 16, 24, 40, 57, 69, 56 , 14, 17, 22, 。

8、29, 51, 87, 80, 62 , 18, 22, 37, 56, 68, 109, 103, 77 , 24, 35, 55, 64, 81, 104, 113, 92 , 49, 64, 78, 87, 103, 121, 120, 101 , 72, 92, 95, 98, 112, 100, 103, 99 ;/量化表voidprint_data_screen(shortdata88)/数据打印int x, y;for (x = 0; x8; x+)for (y = 0; y8; y+)printf(%d, dataxy);if (y = 7)if (x = 7)printf(n。

9、n);elseprintf(n);elseprintf(,);voidquanDCT(short(*data)8, short(*result)8)/数据量化int x, y;for (x = 0; x8; x+)for (y = 0; y8; y+)*(*(result + x) + y) = (short)(double(*(*(data + x) + y) / QuanTablexy + 0.5);intcalWeight(short(*result), int *Node, int *Weigh)/计算权重int x, y, i, find = 0;for (x = 0; x64; x。

10、+)Nodex = 0;Weighx = 0;Node0 = (*result);Weigh0 = 1;i = 0;for (x = 1; x64; x+)for (y = 0; y = i; y+)if (*(x + result) = Nodey)Weighy+;find = 1;break;if (find)find = 0;continue;elsei+;Nodey = *(x + result);Weighy+;returni + 1;/*从HtStruct选出权重最小,并且没有父节点的节点*/intWeightMinNode(HfStructHtStruct, intMum)int。

11、i = 0; /序号, 循环用int min; /最小权重序号intMinWeight; /最小权重/首先选择一个节点,用于比较出最小的一个while (HtStructi.parent != -1)i+;MinWeight = HtStructi.weight;min = i;/选出weight最小且parent为-1的元素,并将其序号赋给min for (; iMum; i+)if (HtStructi.weightMinWeight&HtStructi.parent = -1)MinWeight = HtStructi.weight;min = i;/选出weight最小的元素后,将其p。

12、arent置1,使得下一次比较时将其排除在外。HtStructmin.parent = 1;return min;/*从HtStruct数组的前k个元素中选出weight最小且parent为-1的两个,分别将其序号保存在min1和min2中*/void ChoseMinium2(HfStructHtStruct, intMum, int *min1, int *min2)*min1 = WeightMinNode(HtStruct, Mum);*min2 = WeightMinNode(HtStruct, Mum);/*根据给定的n个权值构造一棵赫夫曼树*/HfStructcreate_Huf。

13、fmanTree(int *WeightPoint, intn)/一棵有n个叶子节点的赫夫曼树共有2n-1个节点intAllNodeNum = 2 * n - 1;HfStruct HT = (HfStruct)malloc(AllNodeNum*sizeof(Struct);inti;/叶子节点初始化,将传入的数据加载到叶子节点上for (i = 0; in; i+)HTi.parent = -1;HTi.lchild = -1;HTi.rchild = -1;HTi.weight = *WeightPoint;WeightPoint+;/HTn,HTn+1.HT2n-2中存放的是中间构造出。

14、的每棵二叉树的根节点for (; iAllNodeNum; i+)HTi.parent = -1; /父节点初始化HTi.lchild = -1; /左子节点初始化HTi.rchild = -1; /右子节点初始化HTi.weight = 0; /权重初始化int min1, min2;int *ad_min1 = &min1;/用于传递最小权重的节点int *ad_min2 = &min2; /用于传递最小权重的节点/每一轮比较后选择出min1和min2构成一课二叉树,最后构成一棵赫夫曼树for (i = n; iAllNodeNum; i+)ChoseMinium2(HT, i, ad_m。

15、in1, ad_min2); /选出权重最小的两个节点HTmin1.parent = i; /父节点赋值HTmin2.parent = i; /父节点赋值HTi.lchild = min1; /左子节点赋值HTi.rchild = min2; /右子节点赋值HTi.weight = HTmin1.weight + HTmin2.weight; /权重为两个子节点权重之和return HT;/*从叶子节点到根节点逆向求赫夫曼树HT中n个叶子节点的赫夫曼编码,并保存在code中*/voidHuffmanCoding(HfStructHT, HCodeTypeHuffCode, intn)HCode。

16、Type cd;inti,j,current,father;for (i = 0; in; i+)cd.start = n - 1;current = i; /定义当前访问的节点father = HTi.parent; /当前节点的父节点/从叶子节点向上搜索while (father != -1)if (HTfather.lchild = current) /如果是左子节点,则编码为0 cd.codecd.start- = 0;else/如果是右子节点,则编码为1 cd.codecd.start- = 1;current = father;father = HTfather.parent;for (j = cd.start + 1; j n; j+)HuffCodei.codej = cd.codej;HuffCodei.start = cd.start。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值