📄 哈夫曼编码.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxValue 10
#define MaxBit 10
#define MaxN 10
#include"Haffman.h"
typedef struct
{
char zimu;
int cishu;
float pinlv;
}xinyuan;
void pinlvtongji(char wenben[],xinyuan x[],int *m) //英文文本频率统计
{
int i,p,j,k;
int flag;
k=0;
p=strlen(wenben);
x[0].zimu=wenben[0];
x[0].cishu=1;
k++;
for(i=1;i<p;i++)
{
flag=0;
for(j=0;j<k;j++)
{
if(x[j].zimu==wenben[i])
{
x[j].cishu++;
flag=1;
break;
}
}
if(flag==0)
{
x[k].zimu=wenben[i];
x[k].cishu=1;
k++;
}
}
for(i=0;i<k;i++)
x[i].pinlv=(float)x[i].cishu/p;
printf("输出英文文本统计后的各种字母:");
printf("\n");
for(i=0;i<k;i++)
printf("%c ",x[i].zimu);
printf("\n");
printf("\n");
printf(" 输出各种字母对应的出现次数:");
printf("\n");
for(i=0;i<k;i++)
printf("%d ",x[i].cishu);
printf("\n");
printf("\n");
printf("输出各种字母出现的频率:");
printf("\n");
for(i=0;i<k;i++)
printf("%f ",x[i].pinlv);
printf("\n");
printf("\n");
*m=k ;
}
void main(void)
{
int i,j,k,n;
int m;
char english[100];
xinyuan aaa[24];
int weight[24];
printf("请输入英文文本:");
printf("\n");
scanf("%s",english);
n=strlen(english);
printf("\n");
pinlvtongji(english,aaa,&m);
for(i=0;i<m;i++)
weight[i]=aaa[i].cishu;
HaffNode *myHaffTree=(HaffNode *)malloc(sizeof(HaffNode)*(2*m+1));
Code *myHaffCode =(Code *)malloc(sizeof(Code)*m);
Haffman(weight,m,myHaffTree);
HaffmanCode(myHaffTree,m,myHaffCode);
printf("输出各种英文字母对应的哈夫曼编码:");
printf("\n");
/*输出每个叶节点饿哈夫曼编码*/
for(i=0;i<m;i++)
{
/* printf("weight =%d Code=",myHaffCode[i].weight); */
for(j=myHaffCode[i].start;j<m;j++)
printf("%d",myHaffCode[i].bit[j]);
printf(" ");
}
printf("\n");
printf("\n");
printf("输出英文文本对应的哈夫曼编码:");
/*英文压缩,即输出英文文本对应的编码*/
for(k=0;k<n;k++)
{
for(i=0;i<m;i++)
{
if(aaa[i].zimu==english[k])
{
for(j=myHaffCode[i].start;j<m;j++)
printf("%d",myHaffCode[i].bit[j]);
printf(" ");
}
}
}
printf("\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -