您的位置:首页 > 编程语言 > C语言/C++

哈弗曼编码的c语言实现代码

2013-10-25 16:39 363 查看
#include <stdio.h>
#include <stdlib.h>
int count=0;                   //节点数
int frequent[10]={0};         //存储所有字符的频率的字符串
typedef struct huff
{
int left;
int right;
int freq;
char ch;
int level;       //用来进行huffcode
}HuffNode,*HuffTree;
//select 函数
void select(HuffNode *t,int len,int *a,int *b)
{
int i=1;
if(t[1].freq<t[2].freq)
{
*a=1;
*b=2;
}
else
{
*a=2;
*b=1;
}
for(i=3;i<=len;i++)
{
if(t[i].freq<t[*a].freq)
{
*b=*a;
*a=i;
}
else if(t[i].freq<t[*b].freq)
*b=i;
}
}
//建立哈弗曼树
HuffTree buildHufftree(int *freq)
{
int i,m;  //m用来暂存count的值
int m1,m2;
HuffNode *node;
for(i=0;i<256;i++)
if(freq[i])
count++;
m=count;
node=(HuffNode *)malloc((2*count)*sizeof(HuffNode));
//建立所有节点,一共是2count-1个
for(i=0;i<256;i++)
{
if(freq[i])	                 //count 表示了节点的数目,所以节点是从node[1]开始
{
node[m].freq=freq[i];
node[m].ch=(char)i;
node[m].left=0;
node[m].right=0;
m--;
}
}
//建立树,count-1次循环,通过select函数选出当前freq最小的两个节点
for(i=0;i<count-1;i++)
{
select(node,count+i,&m1,&m2);   //从前count+i个节点中选出最小的两个
node[count+i+1].freq=node[m1].freq+node[m2].freq;
node[m1].freq=1000000;          //将原先的叶子排除在下次的选择范围中
node[m2].freq=1000000;
node[count+i+1].left=m1;
node[count+i+1].right=m2;
//	printf("%d--%d freq:%d\n",m1,m2,node[count+i+1].freq);
}
return node;
}
//生成huffcode
void huffcode(HuffTree t)
{
int i,j;
int *temp;
t[2*count-1].level=0;
t[2*count-1].freq=0;      //这里将freq 当做 sum来使用,计数每个点的值,用来生成huffcode
for(i=2*count-1;i>count;i--)
{
t[t[i].left].level=t[i].level+1;
t[t[i].right].level=t[i].level+1;
t[t[i].left].freq=t[i].freq*2;
t[t[i].right].freq=t[i].freq*2+1;
}
for(i=count;i>=1;i--)
{
printf("  %c  freq:%d   HuffCode:\t",t[i].ch,frequent[t[i].ch]);
temp=(int *)malloc(t[i].level*sizeof(int)); //用temp来存储编码
for(j=0;j<t[i].level;j++)
{
temp[t[i].level-1-j]=t[i].freq%2;
t[i].freq/=2;
}
for(j=0;j<t[i].level;j++)
printf("%d",temp[j]);
//	free(temp);
printf("\n");
}
}
void main (){
char *str="my name is veim,i like coding";    //输入你想要进行编码的字符串
printf("被编码字符串为:");
puts(str);
int i=0;
HuffTree T;
while(*str!='\0')
{
frequent[*str++]++;
}
T=buildHufftree(frequent);
huffcode(T);
}


[/code]
运行结果如图:


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: