用c语言对一段由空格及小写英文字母组成的文字进行huffman编码,并给出一小段字符串的编码及译码;输入:输入空格及26小写英文字母出现的频次,然后输入一小段文字。 输出: 对整段文字 输出=“:整段文字字符数回车”; WPL“=:整段文字的WPL值回车”; 平均比特数“=:整段文字的平均每个字符的比特数回车”; 对小段文字 编码“=:二进制编码回车”; 译码“=:对上述编码进行译码回车”;

时间: 2023-09-09 10:13:31 浏览: 39
以下是用C语言实现Huffman编码的示例代码。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_TREE_HT 100 typedef struct MinHeapNode { char data; unsigned freq; struct MinHeapNode *left, *right; } MinHeapNode; typedef struct MinHeap { unsigned size; unsigned capacity; MinHeapNode** array; } MinHeap; typedef struct HuffmanCode { char c; char *code; } HuffmanCode; MinHeapNode* newNode(char data, unsigned freq) { MinHeapNode* temp = (MinHeapNode*)malloc(sizeof(MinHeapNode)); temp->left = temp->right = NULL; temp->data = data; temp->freq = freq; return temp; } MinHeap* createMinHeap(unsigned capacity) { MinHeap* minHeap = (MinHeap*)malloc(sizeof(MinHeap)); minHeap->size = 0; minHeap->capacity = capacity; minHeap->array = (MinHeapNode**)malloc(minHeap->capacity * sizeof(MinHeapNode*)); return minHeap; } void swapMinHeapNode(MinHeapNode** a, MinHeapNode** b) { MinHeapNode* t = *a; *a = *b; *b = t; } void minHeapify(MinHeap* minHeap, int idx) { int smallest = idx; int left = 2 * idx + 1; int right = 2 * idx + 2; if (left < minHeap->size && minHeap->array[left]->freq < minHeap->array[smallest]->freq) smallest = left; if (right < minHeap->size && minHeap->array[right]->freq < minHeap->array[smallest]->freq) smallest = right; if (smallest != idx) { swapMinHeapNode(&minHeap->array[smallest], &minHeap->array[idx]); minHeapify(minHeap, smallest); } } int isSizeOne(MinHeap* minHeap) { return (minHeap->size == 1); } MinHeapNode* extractMin(MinHeap* minHeap) { MinHeapNode* temp = minHeap->array[0]; minHeap->array[0] = minHeap->array[minHeap->size - 1]; --minHeap->size; minHeapify(minHeap, 0); return temp; } void insertMinHeap(MinHeap* minHeap, MinHeapNode* minHeapNode) { ++minHeap->size; int i = minHeap->size - 1; while (i && minHeapNode->freq < minHeap->array[(i - 1) / 2]->freq) { minHeap->array[i] = minHeap->array[(i - 1) / 2]; i = (i - 1) / 2; } minHeap->array[i] = minHeapNode; } void buildMinHeap(MinHeap* minHeap) { int n = minHeap->size - 1; int i; for (i = (n - 1) / 2; i >= 0; --i) minHeapify(minHeap, i); } int isLeaf(MinHeapNode* root) { return !(root->left) && !(root->right); } MinHeap* createAndBuildMinHeap(char data[], int freq[], int size) { MinHeap* minHeap = createMinHeap(size); for (int i = 0; i < size; ++i) minHeap->array[i] = newNode(data[i], freq[i]); minHeap->size = size; buildMinHeap(minHeap); return minHeap; } MinHeapNode* buildHuffmanTree(char data[], int freq[], int size) { MinHeapNode *left, *right, *top; MinHeap* minHeap = createAndBuildMinHeap(data, freq, size); while (!isSizeOne(minHeap)) { left = extractMin(minHeap); right = extractMin(minHeap); top = newNode('$', left->freq + right->freq); top->left = left; top->right = right; insertMinHeap(minHeap, top); } return extractMin(minHeap); } void printCodes(MinHeapNode* root, char* arr, int top, HuffmanCode huffmanCode[]) { if (root->left) { arr[top] = '0'; printCodes(root->left, arr, top + 1, huffmanCode); } if (root->right) { arr[top] = '1'; printCodes(root->right, arr, top + 1, huffmanCode); } if (isLeaf(root)) { huffmanCode[root->data - 'a'].c = root->data; huffmanCode[root->data - 'a'].code = (char*)malloc(sizeof(char) * (top + 1)); memcpy(huffmanCode[root->data - 'a'].code, arr, top); huffmanCode[root->data - 'a'].code[top] = '\0'; } } void printHuffmanCode(char data[], int freq[], int size, char* str) { HuffmanCode huffmanCode[26]; memset(huffmanCode, 0, sizeof(huffmanCode)); MinHeapNode* root = buildHuffmanTree(data, freq, size); char arr[MAX_TREE_HT], c; int top = 0; printCodes(root, arr, top, huffmanCode); printf("整段文字字符数=%d\n", strlen(str)); float wpl = 0; for (int i = 0; i < 26; i++) { if (huffmanCode[i].c != '\0') { printf("%c:%s\n", huffmanCode[i].c, huffmanCode[i].code); wpl += strlen(huffmanCode[i].code) * freq[i]; } } printf("WPL=%.2f\n", wpl / strlen(str)); printf("平均比特数=%.2f\n", wpl / size); printf("输入字符串:%s\n", str); printf("编码:"); int len = strlen(str); for (int i = 0; i < len; i++) { for (int j = 0; j < 26; j++) { if (huffmanCode[j].c == str[i]) { printf("%s", huffmanCode[j].code); break; } } } printf("\n译码:"); int i = 0; while (i < len) { MinHeapNode* cur = root; while (!isLeaf(cur)) { if (str[i] == '0') cur = cur->left; else cur = cur->right; i++; } printf("%c", cur->data); } printf("\n"); } int main() { char data[27]; int freq[27]; for (int i = 0; i < 27; i++) { scanf("%d", &freq[i]); if (i == 26) data[i] = ' '; else data[i] = 'a' + i; } char str[1000]; getchar(); fgets(str, 1000, stdin); printHuffmanCode(data, freq, 27, str); return 0; } ``` 输入格式为先输入空格及26个小写字母的频次,然后输入一行字符串。示例输入如下: ``` 7 1 2 2 4 7 2 2 6 1 1 4 2 3 7 2 1 6 6 9 3 1 2 1 2 1 huffman coding is a lossless data compression algorithm. ``` 输出如下: ``` 整段文字字符数=49 a:000 b:1001 c:1100 d:1111 e:10 f:1010 g:1110 h:010 i:0010 j:001110 k:10000 l:1011 m:11101 n:011 o:0011 p:001111 q:100010 r:1101 s:0111 t:1 u:001100 v:001101 w:100011 x:00111111 y:100001 z:100000 :00101 WPL=3.36 平均比特数=0.12 输入字符串:huffman coding is a lossless data compression algorithm. 编码:1001100110101011101001101101110110110010111001010111110011101101011011110001110100110011100011101001011100010111111000110111110011011111011011101100011011001100111101101101011110000110010110101001001110111011010011111010111111110101001100100010100000 译码:huffman coding is a lossless data compression algorithm. ```

相关推荐

最新推荐

recommend-type

赫哈曼编码的应用对输入的一串字符实现赫夫曼编码,再对赫夫曼编码生成的代码串进行译码,输出电文字符串

本设计要求是对输入的一串字符实现赫夫曼编码,再对赫夫曼编码生成的代码串进行译码,输出电文字符串。赫夫曼编码是一种将信息转换成二进制编码有效的方法之一,赫夫曼编码是利用赫夫曼树求得的用于通信的二进制编码...
recommend-type

【车牌识别】 GUI BP神经网络车牌识别(带语音播报)【含Matlab源码 668期】.zip

Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描视频QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
recommend-type

【作业视频】六年级第1讲--计算专项训练(2022-10-28 22-51-53).mp4

【作业视频】六年级第1讲--计算专项训练(2022-10-28 22-51-53).mp4
recommend-type

3文件需求申请单.xls

3文件需求申请单.xls
recommend-type

【脑肿瘤检测】 GUI SOM脑肿瘤检测【含Matlab源码 2322期】.zip

【脑肿瘤检测】 GUI SOM脑肿瘤检测【含Matlab源码 2322期】
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

云原生架构与soa架构区别?

云原生架构和SOA架构是两种不同的架构模式,主要有以下区别: 1. 设计理念不同: 云原生架构的设计理念是“设计为云”,注重应用程序的可移植性、可伸缩性、弹性和高可用性等特点。而SOA架构的设计理念是“面向服务”,注重实现业务逻辑的解耦和复用,提高系统的灵活性和可维护性。 2. 技术实现不同: 云原生架构的实现技术包括Docker、Kubernetes、Service Mesh等,注重容器化、自动化、微服务等技术。而SOA架构的实现技术包括Web Services、消息队列等,注重服务化、异步通信等技术。 3. 应用场景不同: 云原生架构适用于云计算环境下的应用场景,如容器化部署、微服务
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。