{//初始化霍夫曼树数组!参数: Huffman树数组,要编码的数据字符串,数据字符串长度
int j = 0;
同时(* str)
{//初始化有效的数组元素
hfmtree-> date = * str; //要编码的数据
hfmtree-> min = true; //是否为叶节点
hfmtree-> quanzhi = * str; //重量
str ++;
hfmtree ++;
j ++;
}
同时(j <= 2 * i-2)
{
//初始化无效的数组元素
hfmtree-> min = false; //所有非叶子节点
j ++;
hfmtree ++;
}
//注意: 此功能的权重根据字符ascll代码来判断!初始化功能可以根据实际情况重新定义!
}
char * hfmbm(char * str)
{//霍夫曼编码函数参数: 要编码的字符串!
int i = 0; //统计字符串中的字符数
int j = i;
char * p = str; //备份字符串的第一个地址
while(* str)//统计字符数
{
i ++;
str ++;
}
// printf(“%d”,i);
tree * hfmtree =(tree *)malloc(sizeof(tree)*(2 * i-1)); //根据字符数打开可用空间
str = p;
tree * pp = hfmtree; //备份霍夫曼数组的第一个地址
chushihuahmf(hfmtree,str哈夫曼树节点,i); //根据ascll代码制定权重并相应地构造数组(可以根据实际情况进行修改)
hfmtree = pp;
gettree(hfmtree,2 * i-1,i); //构造霍夫曼树
tre =&hfmtree [2 * i-2]; //获取霍夫曼树
bianltree(tre); //由霍夫曼树编码并保存在代码中
char * restr =(char *)malloc(sizeof(char)* i * 11); //打开编码的字符串地址
int k = 0;
p = restr;
同时(k
{//通过遍历编码映射表来编码字符编码字符映射表中的字符匹配后返回编码
int b = 0;
同时(b
{
if(hfm [b] .date == str [k])
{
for(int j = 0; j
{
* restr = hfm [b] .bianm [j];

restr ++;
}
休息;
}
b ++;
}
k ++;
}
* restr ='';
restr = p;
printf(“编码完成: n%sn”,restr);
return restr;
}
voidhfmjm(char * hmf)
{//霍夫曼解码参数霍夫曼编码数据串
树* p = tre; //获取霍夫曼树
同时(* hmf)
{
if(* hmf =='0')//编码为0,以便在左侧子树中行走
{
tre = tre-> zuo;
如果(tre-> min)//是叶节点
{
printf(“%c”,tre->日期); //输出编码
tre = p;
}
hmf ++;
继续;
}
if(* hmf =='1')//编码为1个向右行走的子树
{
tre = tre->您;
如果(tre->分钟)
{
printf(“%c”,tre->日期);
tre = p;
}
hmf ++;
继续;
}
printf(“无法识别的代码: %cn”,* hmf);
返回;
}
printf(“ n”);
tre = p; //恢复霍夫曼树
//注意: 此解码基于霍夫曼树解码. 该程序也可以根据编码映射表进行解码
}
int_tmain(int argc,_TCHAR * argv [])
{
char * ch =“ abcd @#$ 3456asd”;
printf(“要编码的数据位: %sn”,ch);
printf(“编码格式: n”);
char * str = hfmbm(ch);
printf(“ decode: n”);
hfmjm(str);
//////解码测试: 只要输入编码映射表的编码(struct shmf结构),就可以实现解码!
printf(“ n解码测试: 请根据现有编码格式输入编码n”);
char hmf [100];
得到(hmf);
printf(“ decode: n”);
hfmjm(hmf);
返回0;
}
测试效果1:
测试效果2:
功能描述:
char * hfmbm(char * str)函数是用于完成霍夫曼树构造的函数. 用户只需要传递编码的字符串即可. 该函数可以根据字符串打开数组空间并构造Ha Fuman树.
voidchushihuahmf(tree * hfmtree,char * str,int i)函数是用于初始化Huffman树的权重的函数,因为我们在构造时需要指定构造规则(即权重),因此该函数使用ascll为了方便起见,直接将代码构造为权重,可以根据实际情况修改此功能.
voidhfmjm(char * hmf)函数是一种解码函数,它通过传递有效的编码来解码字符串!
从效果图中,我们发现相同的元素具有不同的编码,但这不会影响编码和解码,但是从空间和时间的角度来看,应避免这种情况. 由于存在映射表,因此可以通过遍历映射表来删除所有重复元素.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-212392-2.html
估计更差