C:Huffman编码a

【问题描述】

给定一组字符的Huffman编码表(从标准输入读取),以及一个用该编码表进行编码的Huffman编码文件(存在当前目录下的in.txt中),编写程序实现对Huffman编码文件的解码,并按照后序遍历序列输出解码过程中Huffman树(规定树中左分支表示0,右分支表示1)中各结点的访问次数。

例如给定的一组字符的Huffman编码表为:

6

1:111

2:0

+:110

*:1010

=:1011

8:100

第一行的6表示要对6个不同的字符进行编码,后面每行中冒号(:)左边的字符为待编码的字符,右边为其Huffman编码,冒号两边无空格。对于该编码表,对应的Huffman树(树中左分支表示0,右分支表示1)应为:

假如给定的Huffman编码文件in.txt中的内容(由0和1字符组成的序列)为:

111011001010011001011111100

则遍历上述Huffman树即可对该文件进行解码,解码后的文件内容为:

12+2*2+2=18

解码过程中,经过Huffman树中各结点的遍边次数见下图中结点中的数字:

对该Huffman树中各结点的访问次数按照后序序列输出应为:

4 1 1 1 2 3 2 2 4 7 11 

【输入形式】

先从标准输入读入待编码的字符个数(大于等于2,小于等于50),然后分行输入各字符的Huffman编码(先输入字符,再输入其编码,字符和编码中间以一个英文字符冒号:分隔),编码只由0和1组成。

Huffman编码文件为当前目录下的in.txt文本文件,即:其中的0和1都是以单个字符的形式存储,文件末尾有一个回车换行符。

【输出形式】

先将解码后的文件内容输出到标准输出上(独占一行);然后以后序遍历序列输出解码过程中Huffman树中各结点的访问次数,各数据间以一个空格分隔,最后一个数据后也有一个空格。

【样例输入】

6

1:111

2:0

+:110

*:1010

=:1011

8:100

假如in.txt中的内容为:

111011001010011001011111100

【样例输出】

12+2*2+2=18

4 1 1 1 2 3 2 2 4 7 11 

【样例说明】

从标准输入读取了6个字符的Huffman编码,因为规定Huffman树中左分支表示0,右分支表示1,所以利用该编码表可构造上述Huffman树(见图1)。遍历该Huffman树对编码文件in.txt的进行解码,即可得到解码后的原文件内容,遍历过程中各树中结点的最终访问次数要按照后序遍历序列输出。

#include<stdio.h>
#include<stdlib.h>
typedef struct Node {char name;int time;int found;struct Node* LeftChild;struct Node* RightChild;
}Node;
void build(char name, char code[], Node* root) {//根据哈夫曼编码构造哈夫曼树Node* tree = root;int i = 0;for (i = 0; code[i] == '0' || code[i] == '1'; i++) {//通过01编码从根开始寻找字符对应结点,0代表左子结点,1代表右子结点if (code[i] == '0') {if (tree->LeftChild == NULL) {//若找不到此节点则新建节点tree->LeftChild = (Node*)malloc(sizeof(Node));tree = tree->LeftChild;tree->time = 0;tree->found = 0;tree->LeftChild = NULL;tree->RightChild = NULL;}else tree = tree->LeftChild;}if (code[i] == '1') {if (tree->RightChild == NULL) {tree->RightChild = (Node*)malloc(sizeof(Node));tree = tree->RightChild;tree->time = 0;tree->found = 0;tree->LeftChild = NULL;tree->RightChild = NULL;}else tree = tree->RightChild;}}tree->name = name;
}
Node* find(Node* tree) {if (tree->LeftChild != NULL && tree->LeftChild->found != 1) find(tree->LeftChild);if (tree->RightChild != NULL && tree->RightChild->found != 1) find(tree->RightChild);//后序遍历printf("%d ", tree->time);tree->found = 1;return tree;
}
int main() {Node* root = (Node*)malloc(sizeof(Node));int n;root->LeftChild = NULL;root->RightChild = NULL;root->found = 0;root->time = 0;scanf("%d", &n);getchar();char name[100];char code[100][50];for (int i = 0; i < n; i++) {scanf("%c:%s", &name[i], code[i]);getchar();build(name[i], code[i], root);}//输入编码表FILE* fp = fopen("in.txt", "r+");char a[1000];int num = 0;for (; fscanf(fp, "%c", &a[num]) != EOF; num++);//读入代码Node* tree = root;for (int i = 0; i < num; i++) {//根据读入的0,1编码从根节点开始搜寻,找到叶节点时输出叶节点对应字符if (a[i] == '0') {if (tree->LeftChild == NULL) {printf("%c", tree->name);tree->time++;//遍历经过某一节点是,++其被遍历次数tree = root->LeftChild;root->time++;}else {tree->time++;tree = tree->LeftChild;}}else if (a[i] == '1') {if (tree->RightChild == NULL) {printf("%c", tree->name);tree->time++;tree = root->RightChild;root->time++;}else {tree->time++;tree = tree->RightChild;}}}tree->time++;printf("%c", tree->name);printf("\n");for (; find(root) != root;);//后序遍历
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/587415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java开发岗面试】八股文—Java基础集合多线程

声明&#xff1a; 背景&#xff1a;本人为24届双非硕校招生&#xff0c;已经完整经历了一次秋招&#xff0c;拿到了三个offer。本专题旨在分享自己的一些Java开发岗面试经验&#xff08;主要是校招&#xff09;&#xff0c;包括我自己总结的八股文、算法、项目介绍、HR面和面试…

Python编程-面向对象基础与入门到实践一书的内容拓展

Python编程-面向对象基础与入门到实践一书的内容拓展 通过编程&#xff0c;模拟现实生活中的事物编程&#xff0c;叫做面向对象编程&#xff0c;此过程也叫做实例化编程 简单类的创建 class Test():def __init__ (self,id):self.id iddef print_id(self):print(self.id)这里建…

云原生Kubernetes系列 | Liveness和Readiness使用

云原生Kubernetes系列 | Liveness和Readiness使用 1. 为什么需要 Liveness和Readiness2. liveness probe2.1. command方式2.2. http方式2.3. tcpSocket方式3. readiness probe1. 为什么需要 Liveness和Readiness 通过deployment创建Pod非常方便。也有了高可用。    但是存在一…

minio命令行详解

客户端命令–mc NAME:mc - MinIO Client for object storage and filesystems.USAGE:mc [FLAGS] COMMAND [COMMAND FLAGS | -h] [ARGUMENTS...]COMMANDS:alias manage server credentials in configuration filels list buckets and objectsmb make a bu…

c++简易AI

今天小编一时雅兴大发&#xff0c;做了一个c的简易AI&#xff0c;还是很垃圾的&#xff01; 题外话&#xff08;每期都会有&#xff09;&#xff1a;我的蛋仔名叫酷影kuying&#xff0c;大家能加我好友吗&#xff1f; 上代码咯&#xff01; #include<bits/stdc.h> #in…

文件描述符

文件描述符 2.1 文件描述符 文件描述符&#xff08;File Descriptor&#xff09;是在Unix-like操作系统中用于标识和访问文件或I/O设备的抽象概念。它是一个非负整数&#xff0c;用于**唯一标识一个打开的文件、套接字&#xff08;socket&#xff09;或其他类型的I/O资源。**…

在简历中展示的专业技能

您的下一个角色无疑将与您之前的工作经历有所不同。因此&#xff0c;讲述您的成就的故事会暗示您的潜力&#xff0c;分享您更广泛的技能也同样会产生影响。 当您在简历中谈论一项技能时&#xff0c;它不需要与最近的成就联系起来。当然&#xff0c;这是理想的情况&#xff0c;…

Elasticsearch-8.11.1 (2+1)HA(高可用)集群部署

目录 一、环境描述 二、安装 ES 2.1 下载Elasticsearch 2.2 解压Elasticsearch 2.3 创建es服务账号/密码 2.3 修改服务器配置 2.4 配置节点 2.4.1 配置说明 2.4.2 配置高可用集群 2.4.2.1 maser节点服务配置 2.4.2.2 node1 节点服务配置 2.4.2.3 node2 节点服务配置…

redis的基本使用

一、 Redis简介 Redis是一个基于内存的 key-value 结构数据库。Redis是一款采用key-value数据存储格式的内存级NoSQL数据库&#xff0c;重点关注数据存储格式&#xff0c;是key-value格式&#xff0c;也就是键值对的存储形式。与MySQL数据库不同&#xff0c;MySQL数据库有表、…

Pearson correlation coefficient (Pearson’s r) 皮尔森相关系数

此图用的是箱状图&#xff0c;的纵轴是“Pearson’s r”&#xff0c;是实际观测值与机器学习模型预测值之间的相关性 Pearsons f得分&#xff0c;它是一个统计量&#xff0c;用来衡量两个变量之间线性相关性的强度。这个得分可能是用来衡量实际观测值与机器学习模型预测值之间的…

YOLOv8改进 | 检测头篇 | ASFF改进YOLOv8检测头(全网首发)

一、本文介绍 本文给大家带来的改进机制是利用ASFF改进YOLOv8的检测头形成新的检测头Detect_ASFF&#xff0c;其主要创新是引入了一种自适应的空间特征融合方式&#xff0c;有效地过滤掉冲突信息&#xff0c;从而增强了尺度不变性。经过我的实验验证&#xff0c;修改后的检测头…

基于51单片机的家用可燃气体报警器设计与实现

一、摘要 随着社会的发展&#xff0c;家庭用气设备越来越多&#xff0c;燃气泄漏事故也时有发生。为了保障人们的生命财产安全&#xff0c;设计一种基于单片机的家用可燃气体报警器是非常必要的。本文主要介绍了一种基于单片机的家用可燃气体报警器的设计与实现方法。该报警器…

Tomcat和Servlet

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Tomcat是什么&#xff1f;1.1下载&#xff1a;1.2 tomcat是什么1.3启动服务器&#xff1a; 二.部署三、Servlet3.1创建项目3.2引入依赖pom.xml的所有代码 3…

Tg-5511cb: tcxo高稳定性+105℃高温

爱普生推的一款TG-5511CB是一种高稳定的TCXO温补晶体振荡器&#xff0c;频率范围十分广泛从 10mhz ~ 54mhz&#xff0c;它的电源电压只需要3.3V&#xff0c;无论是手机还是其他电子设备&#xff0c;都能轻松提供稳定的电力支持。频率/温度特性表现出色&#xff0c;0.28 10^6Ma…

(2023,提示扩展,图像反演,文本到文本生成)自适应文本到图像生成的提示扩展

Prompt Expansion for Adaptive Text-to-Image Generation 公众&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 3. 提示扩展数据集 3.1 图像审美数据集 3.2 图像到文本反演 3.3 查…

Obsidian笔记软件无公网远程同步数据到群辉Webdav

文章目录 1. 群晖开启Webdav服务2. 群晖安装Cpolar3. 配置Webdav远程地址4. Obsidian 安装Remotely Save5. Obsidian远程连接Webdav6. 固定Cpolar公网地址7. PC和移动端笔记同步演示 Obsidian是一款笔记软件&#xff0c;它基于Markdown&#xff0c;支持Windows、macOS、iOS和An…

个人博客主题 vuepress-hope

文章目录 1. 简介2. 配置2.1 个人博客&#xff0c;社媒链接配置 非常推荐vuepress-hope 1. 简介 下面的我的博客文章的截图 通过md写博客并且可以同步到github-page上 2. 配置 2.1 个人博客&#xff0c;社媒链接配置 配置文件 .vuepress/theme.ts blog: {medias: {BiliB…

计算机毕业设计 基于HTML5+CSS3的在线英语阅读分级平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

dayjs

dayjs dayjs 是一个轻量级的日期和时间处理库&#xff0c;类似于 JavaScript 内置的 Date 对象&#xff0c;但提供了更丰富的功能和更友好的 API。它专注于提供简单易用、功能丰富的日期操作方法&#xff0c;以满足开发者在处理日期和时间方面的需求。 以下是一些 dayjs 提供…

C#编程-使用变量

使用变量 请考虑以下场景:您必须创建一个程序,接受来自用户的两个数字并在屏幕上显示着两个数字之和。现在,读取用户提供的数字时,您需要将这些数字存储在内存中的某个位置,以便您能对这些数字执行加操作。您可以使用变量将这些数字存储在内存中。 下图显示了使用变量将…