哈夫曼编码译码系统的实现,主要包含三部分:

1、创建哈夫曼树

2、编码函数

3、译码函数

编写代码时为了方便,在这里混用了c++的输入输出流。主体用c语言实现。

下面时代码部分:

1、头文件,以及储存结构:

#include<stdio.h>
#include<iostream>
using namespace std;
#define MAX 2000
typedef char ElemType;
typedef struct{
ElemType data;
int w;
int parent,lchild,rchild;
}HFMTNode;

2、哈夫曼树的创建,Ht储存全部节点的权值,n代表叶子节点数量。

void menu(HFMTNode Ht [],int n);//原型声明
void CreatHFMTree(HFMTNode Ht[],int n)//创建哈夫曼树
{
int i,j,k,lmin,rmin;
int min1,min2,m1;
for(i=;i<*n;i++)
{
Ht[i].parent=Ht[i].lchild=Ht[i].rchild=-;
}
for(i=n+;i<*n;i++)
{
min1=min2=MAX;
lmin=rmin=-;
for(k=;k<i;k++)
{
if(Ht[k].parent==-)//只在尚未构造的二叉树节点中运行
{
if(Ht[k].w<min1)
{
min2=min1;
rmin=lmin;
min1=Ht[k].w;
lmin=k;
}
else
{
if(Ht[k].w<min2)
{
min2=Ht[k].w;
rmin=k;
}
}
}
else{
if(Ht[k].w<min2&&k>m1)//与创建好的二叉树节点比较,选取w小的一个
{
min2=Ht[k].w;
rmin=k;
m1=k;
}
}
}
Ht[lmin].parent=i;//对选择出的结点进行连接
Ht[rmin].parent=i;
Ht[i].w=Ht[lmin].w+Ht[rmin].w;
Ht[i].lchild=lmin;
Ht[i].rchild=rmin;
}
printf("HFMTree have been created\n");
}

3、编码译码函数、主函数:

 void encoding(HFMTNode Ht [],int n)//编码
{
int k;
fflush(stdin);
printf("Please input what you want to encode with the ending of'#' :\n");
char ch;
ch=getchar(); //读取字符
while (ch!='#')
{
for(k=;k<=n;k++)
{
if(Ht[k].data==ch)
{
break;
}
} //找到字符位置
HFMTNode temp1,temp=Ht[k];
int flag=;
int a[n];
while(temp.w!=Ht[*n-].w)
{
temp1=temp;
temp=Ht[temp.parent];
if(Ht[temp.lchild].w==temp1.w )
{
a[flag]=;
flag++;
}
else if(Ht[temp.rchild].w==temp1.w )
{
a[flag]=;
flag++;
}
} //用数组记录路径
for(int f=flag-;f>=;f--)
{
printf("%d",a[f]);
} //编码输出
ch=getchar();
}
printf("\nencoding have finished\n");
system("pause");
system("cls");
menu(Ht,n);
}
void decoding(HFMTNode Ht [],int n)//译码
{
int k=*n-;
fflush(stdin);
printf("Please input what you want to decode with the ending of'#' :\n");
char ch;
ch=getchar(); //依次读取01字符
HFMTNode temp=Ht[*n-];
while (ch!='#')
{
if(ch=='')
{
if(temp.rchild==-)
{
printf("%c",temp.data); //根据01向左右寻找,到达叶子节点时输出
temp=Ht[*n-];
continue;
}
else
{
temp=Ht[temp.rchild ];
ch=getchar();
}
}
else if(ch=='')
{
if(temp.lchild==-)
{
printf("%c",temp.data);
temp=Ht[*n-];
continue;
}
else
{
temp=Ht[temp.lchild ];
ch=getchar();
}
}
}
printf("%c",temp.data); //输出要译码的最后一个字符
printf("\ndecoding have finished\n");
system("pause");
system("cls");
menu(Ht,n);
}
void menu(HFMTNode Ht [],int n)
{
int j;
printf("Input your choice:\n");
printf("1.encoding 2.decoding 0.exit\n");
cin>>j;
switch (j)
{
case :encoding(Ht,n);break;
case :decoding(Ht,n);break;
case :break;
}
}
int main()
{
printf("Please input the amount of the node:\n");
int i;
scanf("%d",&i);
HFMTNode Ht[*i];//储存各个节点的数据
for(int k=;k<=i;k++)
{
printf("Ht[%d]:Please input data :",k);
cin>>Ht[k].data;
printf("Ht[%d]:Please input w :",k);
cin>>Ht[k].w;
}
CreatHFMTree(Ht,i);
menu(Ht,i);
return ;
}

上面代码放在一起即可直接运行,本人水平有限,如有错误,欢迎大神指正。

哈夫曼编码译码系统(c/c++)的更多相关文章

  1. 基于python的二元霍夫曼编码译码详细设计

    一.设计题目 对一幅BMP格式的灰度图像(个人证件照片)进行二元霍夫曼编码和译码 二.算法设计 (1)二元霍夫曼编码: ①:图像灰度处理: 利用python的PIL自带的灰度图像转换函数,首先将彩色图 ...

  2. c++实验8 哈夫曼编码-译码器

    哈夫曼编码-译码器 此次实验的注释解析多加不少---若对小伙伴们有帮助 希望各位麻烦点个关注 多谢 1.哈夫曼树构造算法为: (1)由给定的n个权值{w1,w2,…,wn}构造n棵只有根结点的二叉树, ...

  3. C++实现哈夫曼编码/译码器(数据结构)

    设计一个哈夫曼编码.译码系统.对一个ASCII编码的文本文件中的字符进行哈夫曼编码,生成编码文件:反过来,可将编码文件译码还原为一个文本文件.(1) 从文件中读入任意一篇英文短文(文件为ASCII编码 ...

  4. 哈夫曼(huffman)树和哈夫曼编码

    哈夫曼树 哈夫曼树也叫最优二叉树(哈夫曼树) 问题:什么是哈夫曼树? 例:将学生的百分制成绩转换为五分制成绩:≥90 分: A,80-89分: B,70-79分: C,60-69分: D,<60 ...

  5. 使用F#来实现哈夫曼编码吧

    最近算法课要求实现哈夫曼编码,由于前面的问题都是使用了F#来解决,偶然换成C#也十分古怪,报告也不好看,风格差太多.一开始是打算把C#版本的哈夫曼编码换用F#来写,结果写到一半就觉得日了狗了...毕竟 ...

  6. 【Matlab编程】哈夫曼编码的Matlab实现

    在前年暑假的时候,用C实现了哈夫曼编译码的功能,见文章<哈夫曼树及编译码>.不过在通信仿真中,经常要使用到Matlab编程,所以为了方便起见,这里用Matlab实现的哈夫曼编码的功能.至于 ...

  7. 霍夫曼编码(Huffman Coding)

    霍夫曼编码(Huffman Coding)是一种编码方法,霍夫曼编码是可变字长编码(VLC)的一种. 霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符 ...

  8. 哈夫曼(Huffman)树+哈夫曼编码

    前天acm实验课,老师教了几种排序,抓的一套题上有一个哈夫曼树的题,正好之前离散数学也讲过哈夫曼树,这里我就结合课本,整理一篇关于哈夫曼树的博客. 主要摘自https://www.cnblogs.co ...

  9. 哈夫曼编码与解码的C++实现:建立哈夫曼树、进行哈夫曼编码与解码

    最近完成了数据结构课程设计,被分到的题目是<哈夫曼编码和解码>,现在在这篇博文里分享一下自己的成果. 我在设计时,在网上参考了很多老师和前辈的算法和代码,向他们表示感谢!他们的成果给了我很 ...

随机推荐

  1. UVA - 10723 Cyborg Genes (LCS)

    题目: 思路: 求两个串的最长公共子序列,则这个最短的串就是给出的两个串的长度和减去最长公共子序列的长度. 状态转移方程: 如果s[i-1]==t[j-1]就有dp[i][j] = dp[i-1][j ...

  2. Navicat for MySQL(Ubuntu)过期解决方法

    推荐购买正版软件,尊重版权  [官网在这里] Navicat for MySQL(Ubuntu系统)免费版试用过期解决方法: Step1. 直接删除 /home目录下的  .navicat文件夹(64 ...

  3. 后台工具screen

    之前在putty之类的远程命令行操作服务器的时候,遇到关闭软件,对应的操作就会关闭.很多时候,就是开着电脑,然后挂在那里,虽然不用电脑跑,但是也耗电...主要是putty这些软件有时候会伴随黑屏崩掉. ...

  4. 洛谷 2213 [USACO14MAR]懒惰的牛The Lazy Cow_Sliver

    [题解] 每个格子可以到达的区域是一个菱形,但是我们并不能快速的求和,所以我们可以把原来的草地旋转45度,用二维前缀和快速处理菱形的区域的和. #include<cstdio> #incl ...

  5. 天猫双11红包前端jQuery

    [01]   浏览器支持:IE10+和其他现代浏览器.   效果图:       步骤:   HTML部分:   <div class="opacity" style=&qu ...

  6. scrapy——中间件UserAgent代理

    pip install fake-useragent 使用说明:from fake_useragent import UserAgent# 实例化一个UserAgent对象ua = UserAgent ...

  7. [51Nod1089] 最长回文子串 V2(Manacher算法)

    1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题   回文串是指aba.abba.cccbccc.aaaa这种左右对称 ...

  8. [bzoj1582][Usaco2009 Hol]Holiday Painting 节日画画_线段树

    Holiday Painting 节日画画 bzoj-1582 Usaco-2009 Hol 题目大意:给定两个n*m的01网格图.q次操作,每次将第二个网格图的子矩阵全部变成0或1,问每一次操作后两 ...

  9. 23、Java并发性和多线程-重入锁死

    以下内容转自http://ifeve.com/reentrance-lockout/: 重入锁死与死锁和嵌套管程锁死非常相似.锁和读写锁两篇文章中都有涉及到重入锁死的问题. 当一个线程重新获取锁,读写 ...

  10. golang 的GOPATH设置的问题

    go run footer.go 的时候呢, go会依次去GOPATH 和GOROOT设置的对应路径下面找对应的包(目录和文件) 找的时候呢, 会在GoPATH 和GOROOT对应的目录后面再加一层路 ...