第1关:统计报文中各个字符出现的次数

任务描述

本关任务: 给定一串文本,统计其中各个字符出现的次数;

测试说明

平台会对你编写的代码进行测试:

测试输入:` abcdeabcdeabcdabcdabcdabcbccc

预期输出: a 6 b 7 c 9 d 5 e 2

代码:

//第一关
//(2)统计message所指一串报文中的所有不同字符及其出现次数
Precord computeChar(char *message)
{//补充代码//补充代码int i;Precord rcd=(Precord)malloc(sizeof(struct record));//初始化rcdrcd->m=0;for (i=0;i<N;i++){rcd->data[i].ww=0; //初始化各字符出现的次数为0}//统计for (i=0;i<strlen(message);i++){for (int j=0;j<=rcd->m;j++){if (rcd->data[j].ww==0){rcd->data[j].ww++;rcd->data[j].ch=message[i];rcd->m++;break;}else if (rcd->data[j].ch==message[i]){rcd->data[j].ww++;break;}}}return rcd;
}

第2关:对第一关报文中的各个字符进行哈夫曼编码

任务描述

本关任务:以第一关计算得到的各个字符的出现次数作为权值,构建哈夫曼树,并对各个字符进行哈夫曼编码。输入一串字符,输出各个字符及其出现的次数,该字符在哈夫曼树中是作为左分支还是右分支、该字符的哈夫曼编码。

输入

abcdeabcdeabcdabcdabcdabcbccc

输出

字符: a 出现次数:6 左or右:0 哈夫曼编码:00

字符: b 出现次数:7 左or右:1 哈夫曼编码:01

字符: c 出现次数:9 左or右:1 哈夫曼编码:11

字符: d 出现次数:5 左or右:1 哈夫曼编码:101

字符: e 出现次数:2 左or右:0 哈夫曼编码:100

代码:

//第二关
//(3)初始化哈夫曼树PHtTree initHuffman(Precord r){//补充代码int i;int n=2*(r->m)-1;PHtTree ht = (PHtTree)malloc(sizeof(struct HtTree));ht -> htable = (struct HtNode*)malloc(sizeof(struct HtNode)*n);ht -> m = r -> m;for(i=0; i<n; i++){ht->htable[i].ww = ht->htable[i].parent = ht->htable[i].llink = ht->htable[i].rlink = -1;}for(i=0; i<r->m; i++){ht -> htable[i].ww = r->data[i].ww;}return ht;}// 第二关
//(4)构造哈夫曼树。 根据报文中出现的各字符及其出现次数,构造哈夫曼树
//约定:构造过程中每次选的根结点值最小的子树作为左子树,根结点值次小的子树作为右子树
void createHuffman(PHtTree ht,Precord r)
{//补充代码int min1, min2, s1, s2;int i, j;int n=r->m;for(i=0; i<n; i++){min1=min2 = 255;s1=s2= -1;for(j=0; j<n+i; j++){if(ht->htable[j].ww < min1 && ht->htable[j].parent == -1){min2 = min1; s2 = s1; min1 = ht->htable[j].ww; s1 = j;}else if(ht->htable[j].ww < min2 && ht->htable[j].parent == -1){min2 = ht->htable[j].ww; s2=j;}}if(n+i != 2*n-1){ht -> htable[s1].parent = n+i;ht -> htable[s2].parent = n+i;}ht -> htable[n+i].ww = min1+min2;ht -> htable[n+i].llink = s1;ht -> htable[n+i].rlink = s2;}ht -> root = 2*n-2;}// 第二关
//(5)编码
void coding(PHtTree ht,Precord r)
{//补充代码int i,j;int n=r->m;int p, q;char str[5];for(i=0; i<n; i++){p = i;q = 0;while(ht->htable[p].parent != -1){if(ht->htable[ht->htable[p].parent].llink == p){str[q] = '0';q++;}else{str[q] = '1';q++;}p = ht->htable[p].parent;}str[q] = '\0';if(ht->htable[ht->htable[i].parent].llink == i)r->data[i].branch_code = '0';elser->data[i].branch_code = '1';p=q-1;for(j=0; j<q; j++){r->data[i].codes[j]=str[p];p--;}}}

第3关:哈夫曼译码

任务描述

本关任务:对第二关的字符串所得到的二进制编码串进行译码,输出译码后的原文。

输入:

00011110110000011110110000011110100011110100011110100011101111111

输出:

abcdeabcdeabcdabcdabcdabcbccc

代码:

// 第三关
//(6)译码
void decoding(char *codes,char *codesToMessage,PHtTree ht,Precord r)
{//补充代码int i=0,j=0; int p=0;int n=r->m;while(codes[j] != '\0'){p=2*n-2;while(ht->htable[p].llink != -1 && ht->htable[p].rlink != -1){if(codes[j] == '0')p = ht -> htable[p].llink;elsep = ht -> htable[p].rlink;j++;}codesToMessage[i] = r->data[p].ch;i++;}codesToMessage[i] = '\0';}

数据结构与算法--哈夫曼树应用相关推荐

  1. 数据结构与算法 / 霍夫曼树、霍夫曼编码和解码

    一. 诞生原因 找出存放一串字符所需的最少的二进制编码. 二. 构造方法 首先统计出每种字符出现的频率,即:概率.权值. 例如:频率表 A:60,    B:45,   C:13   D:69   E ...

  2. 数据结构与算法--哈夫曼树及其应用

    一.哈夫曼树的基本概念 1) 路径: 从树中一个结点到另一个结点之间的分支构成这两个结点间的路径 2) 结点的路径长度: 两结点间路径上的分支数           3) 树的路径长度:从树根到每一个 ...

  3. 数据结构与算法——赫夫曼树基本实现

    目录 一.赫夫曼树 1.1 基本介绍 1.2 赫夫曼树创建步骤图解 1.3  代码实现 二.赫夫曼编码 2.1 基本介绍 2.1.1  通讯领域 - 定长编码 - 举例说明 2.1.2  通讯领域 - ...

  4. 数据结构与算法(赫夫曼树,赫夫曼编码)

    赫夫曼树 基本介绍: (1)给定n个权值作为n给叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称哈夫曼树(HuffmanTree),还有的树翻译为霍夫 ...

  5. 数据结构实验之——哈夫曼树的实现

    数据结构实验之--哈夫曼树的实现 目录 说明 代码 测试用例 目录 说明 哈夫曼树的这个实验我是采用常用的左'0'右'1'来实现的,输入是用文本输入的,大家在用之前目录下要记得创建"HT.t ...

  6. 数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)

    目录 什么是哈夫曼树 哈夫曼树的定义 哈夫曼树的构造 图解操作 代码实现 代码解析 哈夫曼树的特点 哈夫曼编码 不等长编码 二叉树用于编码 哈夫曼编码实例 什么是哈夫曼树 我们先举个例子: 要将百分制 ...

  7. 数据结构实验——基于哈夫曼树的数据压缩算法

    /* 注:输入为多行字符串,以"0"结尾:例:abc def 0 此程序无法执行由单个字符组成的字符串. */ #include<iostream> #include& ...

  8. 【数据结构Note5】-哈夫曼树

    文章目录 哈夫曼树 1. 构造哈夫曼树 2. 哈夫曼树的性质 3. 哈夫曼编码 哈夫曼树 结点的权:有某种显示含义的数值(如:表示结点的重要性等) 结点的带权路径长度:从树的根到该结点的路径长度(经过 ...

  9. 【数据结构-N】哈夫曼树带权路径计算

    那个闪闪发光的人 会在某一天的雨后,不经意地出现在你的迷茫路口. 目录: 哈夫曼树的构建 带权路径长度计算 >>构建 哈夫曼树,又称最优二叉树,是一类带权路径长度最短的树. 构建哈夫曼树的 ...

最新文章

  1. 函数 —— strncpy() (内存重叠) memcpy() memmove() 一个字符串拷贝给另一个字符串
  2. java.net.SocketException四大异常解决方案---转
  3. Python学习笔记6(列表生成式)
  4. VMware 7.1.4安装Mac.OS.X.Lion.操作系统 key:安装 系统
  5. c++学习书籍推荐《Advanced C++》下载
  6. Wordpress固定链接伪静态
  7. java 遗传算法_遗传算法的基本概念和实现(附 Java 实现案例)
  8. leetcode76. Minimum Window Substring
  9. 201507152326_《Javascript实现跨域有4种方法——介绍jsonp和html5方法》
  10. [C/C++] C++中new的语法规则
  11. 详解离线安装Python库
  12. 优雅的解决Springboot:BindingException: Invalid bound statement (not found):异常
  13. fantastic-matplotlib:案例集合:
  14. Linux+C 开发基础
  15. 信用评分模型中的滚动率分析
  16. 0 1随机数C语言程序,C语言产生随机数的方法
  17. DCDC电源SW波形负压以及轻载振荡问题
  18. 基于Arduino和AIDA64的lcd1602显示电脑状态
  19. 关于死锁你了解多少,通过“让APP随手机壳改变颜色,程序员和产品经理大家”这一事,了解下死锁可好?
  20. HTML学习笔记(实体+meta标签+块、行内元素+语义化标签+布局标签)

热门文章

  1. 图像超分辨率论文笔记
  2. 【HMS core】【Wallet Kit】【解决方案】华为钱包的客户端示例代码为何无法运行
  3. 7.27 web前端-淘宝首页设计3
  4. APS高级排程在钣金冲压行业的应用
  5. 如何禁止NavigationController的向右滑动返回
  6. 纯CSS Material Design风格按钮
  7. Android Zebra斑马打印机 打印面单不清楚 解决方法
  8. Gavin Wood的故事:神级黄皮书、出走以太坊、乱世成名与三代区块链
  9. BLE-NRF51822教程2-工程初始化流程
  10. 微信支付 postman_支付宝微信刷脸支付系统搭建服务商平台怎么做