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

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. Oracle 控制文件(CONTROLFILE)

    一.Oracle 控制文件 为二进制文件,初始化大小由CREATE DATABASE指定,可以使用RMAN备份 记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等 ...

  2. lua排序算法

    SEED = ; --随机序列 可任取 NUM = ; --排序规模 --随机序列 初始数据 function GenRnd( seed, n ) --生成随机数 data = {}; local r ...

  3. [bzoj2141][排队] (分块大法好)

    Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的 ...

  4. String replaceAll 正则注意事项及特殊用法(xjl456852原创)

    我们知道String replaceAll(参数a, 参数b) 参数a是需要些正则表达式的. 但是今天试了试,发现参数b也有一些其它特性. 查看源码后,发现有些特性是平时不怎么用的.下面我来介绍一下这 ...

  5. SRAM的简单概念

    CY7C138 版权声明:本文为博主原创文章,未经博主允许不得转载.

  6. DataFrame NaN 替换为零

    一个DataFrame 其中有空值NaN,将其替换为0: df.fillna(0) 如果将第一列替换为0: df[1].fillna(0,inplace=True)

  7. [luoguP1069] 细胞分裂(数论)

    传送门 分解质因数,不说了 这题坑了我2个多小时 教训 不熟悉位运算的优先级一定要加括号!!!! #include <cstdio> #include <iostream> # ...

  8. NEU 1351 Goagain and xiaodao's romantic story I

    题目描述 Do you know goagain? If the answer is “no”, well, you can leave NEUACM. Goagain is the most per ...

  9. Uva10562

    Professor Homer has been reported missing. We suspect that his recent research works might have had ...

  10. T1462 素数和 codevs

    题目描述 Description 给定2个整数a,b 求出它们之间(不含a,b)所有质数的和. 输入描述 Input Description 一行,a b(0<=a,b<=65536) 输 ...