资源简介
通过查询文件中的字符以及各个字符的权值(出现次数),对某个字符串进行哈夫曼编码和解码,代码则会通过生成哈夫曼二叉树计算出各个字符的编码,存在一个文件中,这时输入要编码的字符串就可以得到其哈夫曼编码,还可以反向对01数据传解码。
代码片段和文件信息
#include
#include
#include
#include
#define MAXNUM 60
typedef struct
{
char ch;
int weight; //权值,这个字符出现的频率
int parent;
int left;
int right;
}HuffNode;
typedef struct
{
char code[MAXNUM];
int start;
}HuffCode;
HuffNode ht[MAXNUM*2]; //存放哈夫曼树
HuffCode hcd[MAXNUM]; //存放ht数组中对应的字符的编码
int n; //字符的个数
//初始化哈夫曼树ht
void initHt()
{
FILE * fp;
char ch;
int i=0;
//从文件document/character.txt中读出要编码的字符和权值
if((fp=fopen(“document/character.txt““r“))==NULL){
printf(“can not open the file character.txt“);
exit(0);
}
ht[i].left=ht[i].right=ht[i].parent=-1;
while((ch=fgetc(fp))!=EOF){
if(ch==‘\n‘){
i++;
ht[i].left=ht[i].right=ht[i].parent=-1;
}
else if((ch>=‘a‘ && ch<=‘z‘)||(ch>=‘A‘ && ch<=‘Z‘))
ht[i].ch=ch;
else if(ch>=‘0‘&&ch<=‘9‘)
ht[i].weight=ht[i].weight*10+ch-‘0‘;
}
n=i+1;
if(fclose(fp)){
printf(“can not close the file character.txt“);
exit(0);
}
}
//构造哈夫曼树看成有n棵树,选择权值最小的两棵树合并
void createHuffTree()
{
int i=0k;
int minIminJ;
int f=0;
minI=minJ=-1; //minI for(k=n;k<2*n-1;k++){
//寻找ht中权值最小且无父结点的两个结点
i=0;
f=0;
while(ht[i].ch!=‘\0‘){
if(ht[i].parent==-1){
if(f==0){
minI=i;
f++;
}else if(f==1){
if(ht[i].weight minJ=minI;
minI=i;
}else
minJ=i;
f++;
}else{
if(ht[i].weight minJ=minI;
minI=i;
}else if(ht[i].weight minJ=i;
}
}
i++;
}
//合并两个结点
ht[k].ch=‘#‘;
ht[k].left=minI;
ht[k].right=minJ;
ht[k].weight=ht[minI].weight+ht[minJ].weight;
ht[k].parent=-1;
ht[minI].parent=ht[minJ].parent=k;
}
}
//将一个字符串反转
void reverse(char *str)
{
int ij;
char ch;
for(i=0j=strlen(str)-1;i ch=str[i];
str[i]=str[j];
str[j]=ch;
}
}
//哈夫曼编码,通过父节点从下往上找
void createHuffCode()
{
int ijlength;
FILE * fp;
for(i=0;i length=0;
j=i;
//给每个字符进行编码
while(ht[j].parent!=-1){
if(ht[ht[j].parent].left==j){
hcd[i].code[length++]=0+‘0‘;
}else
hcd[i].code[length++]=1+‘0‘;
j=ht[j].parent;
}
- 上一篇:眼睛试戴源码
- 下一篇:利用CE318太阳光度计数据处理反演AOD和水汽含量wv
相关资源
- eil51.tsp.txt
- SM4密码算法.pdf
- 基于RSSI的无线传感器网络三角形质心
- 蜂窝最短路径
- 粗糙集约简RDDM算法举例
- KNN算法预测鸢尾花的种类,源码以及
- 一种OFOMA实时子载波分配算法及仿真
- 基于PCL开源库fpfh+icp算法实现点云配准
- 图像加密解密算法
- αβ剪枝算法五子棋
- 遗传算法的各种应用含源码
- 一种新的LFM信号参数估计算法
- SM2和SM3算法
- 45个经典的算法Flash动画演示
- NcutClustering图像分割算法
- 基于K-中心点算法实现
- 各排序算法比较课程设计报告
- 动态优先数高者进程调度算法
- AdaBoost算法实现
- Bursa 7参数的精确算法
- SHA-1算法的Flash演示
- 银行家算法课程设计报告
- 常用哈希算法代码实现
- 4阶斐波那契数列算法使用循环队列实
- 中国科学院遥感应用研究所 硕士研究
- RandomForest随机森林算法
- 基于模拟退火的粒子群优化算法
- 小波变换算法
- Computing Discrete Fr´echet Distance
- 制作动画GIF的VC源代码,八叉树算法生
评论
共有 条评论