#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
//本程序为对初始数组进行排序,而是在编码的过程中动态寻找最小的两个节点。
typedef struct
{
int weight;
int parent,lchild,rchild;
}HuffNode,*HuffTree;
void select(HuffTree HT,int n,int &s1,int &s2);//s1、s2为搜索到的未被访问过的节点中权值最小的两个节点的标号
void HuffCoding(HuffTree &HT,int *w,int n);//w为要编码的数据,n为数据的大小。
int w[]={4,2,13,3,7,10,8,23,22,35,52,31};//数据数值大小作为频率大小。
void select(HuffTree HT,int n,int &s1,int &s2)
{//寻找值最小的两个节点,&s1,&s2是引用,这样才此处修改s1,s2的值后主程序中的值也相应改变。如果是临时变量的话则需要返回值,略麻烦。
s1=s2=0;
int b1,b2=9999;
for (int i=0;i<n;++i) //寻找未被访问过的第一个节点
if (HT[i].parent==0){
b1=HT[i].weight;
break;
}
for(int i=0;i<n;i++)//寻找值最小的节点
if(HT[i].parent==0)
if(HT[i].weight<=b1){
b1=HT[i].weight;
s1=i;
}
HT[s1].parent=1;//将上面找到的最小的节点的父节点设置为1(其实任意值都行,因为之后主程序会对其重新赋值,此处只是起标记的作用)
for(int i=0;i<n;i++)//寻找值第二小的节点
if(HT[i].parent==0)
if(HT[i].weight<b2){
b2=HT[i].weight;
s2=i;
}
}
void HuffCoding(HuffTree &HT,int *w,int n)
{
//w[]={4,2,13,3,7,10,8};
int m=2*n-1;//m为总节点数目
HT=(HuffNode*)malloc(m*sizeof(HuffNode));//创建m个节点,作为Huffman树
int s1=0,s2=0;//权值最小的两个节点
memset(HT,0,m*sizeof(HuffNode));//将所有节点的值初始化
for(int i=0;i<n;i++)
HT[i].weight=w[i];//将需要编码的节点的值赋值给二叉树的叶子节点。
for(int i=n;i<m;i++)
{
select(HT,i,s1,s2);//每次寻找节点时包括新生成的节点,注意此处i值是一直变化的。
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
HT[s1].parent=HT[s2].parent=i;
}
for(int i=0;i<n;i++)
{
int a=i,j=0;
string temp;
while(HT[a].parent!=0)
{
if(a==HT[HT[a].parent].lchild)
temp+='0';//左树编码为0
else if(a==HT[HT[a].parent].rchild)
temp+='1';//右树编码为1
j++;
a=HT[a].parent;
}
reverse(temp.begin(),temp.end());
cout<<"第"<<i+1<<"个数的huffman编码是:"<<temp<<"\t";
cout<<endl;
}
free(HT);
}
void main()
{
int len=sizeof(w)/sizeof(w[0]);//获取数组长度
for(int i=0;i<len;i++)
cout<<w[i]<<"\t";
cout<<endl;
HuffTree HT;
HuffCoding(HT,w,len);
system("pause");//在程序运行结束后等待,否则程序运行后会闪退。
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
利用c++实现了Huffman编码,并对代码进行了注释,保证可读性。 {4,2,13,3,7,10,8,23,22,35,52,31} 下面是编码结果: 第1个数的huffman编码是:00000 第2个数的huffman编码是:000010 第3个数的huffman编码是:0110 第4个数的huffman编码是:000011 第5个数的huffman编码是:01110 第6个数的huffman编码是:0001 第7个数的huffman编码是:01111 第8个数的huffman编码是:010 第9个数的huffman编码是:001 第10个数的huffman编码是:111 第11个数的huffman编码是:10 第12个数的huffman编码是:110
资源推荐
资源详情
资源评论
收起资源包目录
Huffman.rar (28个子文件)
Huffman
Huffman
huffman.cpp 2KB
Huffman.vcxproj.user 143B
Huffman.vcxproj.filters 945B
Debug
vc100.idb 299KB
CL.write.1.tlog 802B
CL.read.1.tlog 10KB
mt.read.1.tlog 1KB
mt.command.1.tlog 966B
Huffman.log 2KB
cl.command.1.tlog 1KB
link.write.1.tlog 1KB
link.command.1.tlog 2KB
Huffman.exe.intermediate.manifest 381B
Huffman.write.1.tlog 0B
link.read.1.tlog 5KB
Huffman.vcxprojResolveAssemblyReference.cache 713B
mt.write.1.tlog 614B
huffman.obj 139KB
Huffman.lastbuildstate 133B
vc100.pdb 244KB
Huffman.vcxproj 3KB
Huffman.sln 888B
Huffman.suo 11KB
ipch
huffman-af2c8e9d
huffman-8d78b291.ipch 13.94MB
Debug
Huffman.exe 56KB
Huffman.pdb 619KB
Huffman.ilk 435KB
Huffman.sdf 5.39MB
共 28 条
- 1
资源评论
- 陈游泳2023-07-24这个文件介绍了如何使用C语言实现Huffman编码,很实用,值得一读。
- 张盛锋2023-07-24作者在解释Huffman编码的原理时用了很多实例来帮助读者理解,很实用。
- daidaiyijiu2023-07-24这个文件提供了一种简洁而高效的Huffman编码算法,能够有效压缩数据。
- SLHJ-Translator2023-07-24这个文件很详细地介绍了Huffman编码的实现方法,对于初学者来说非常友好。
- 书看不完了2023-07-24作者用通俗易懂的语言解释了Huffman编码的思想,让人一目了然。
勤奋的清风
- 粉丝: 445
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功