#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{
char ch;
int weight;
int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char ** HuffmanCode;
void Select(HuffmanTree HT,int n,int &s1,int &s2){
int min1,min2,i;
min1=min2=999;
s1=s2=0;
for(i=1;i<=n;i++){
if(!HT[i].parent){
if(HT[i].weight<min1){
min2=min1;
s2=s1;
min1=HT[i].weight;
s1=i;
}
else if(HT[i].weight<min2){
min2=HT[i].weight;
s2=i;
}
}
}
}
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int w[],int n,char str[]){
int i,m,s1,s2;
int start,f,c;
char *cd;
if(n<=1)
exit(0);
m=2*n-1; //结点数
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//0单元不用
HT[0].ch=' ';
HT[0].lchild=0;
HT[0].weight=0;
HT[0].parent=0;
HT[0].rchild=0;
for(i=1;i<=n;i++){
HT[i].ch=str[i-1];
HT[i].weight=w[i-1];
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
for(;i<=m;i++){
HT[i].ch=' ';
HT[i].weight=0;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
for(i=n+1;i<=m;i++){ //建树
Select(HT,i-1,s1,s2);
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
printf("标号 电文字符 权值 左孩子 右孩子 父母\n");
for(i=1;i<=m;i++)
printf("%d\t%3c%7d\t%d\t%d\t%d\t\n",i,HT[i].ch,HT[i].weight,HT[i].lchild,HT[i].rchild,HT[i].parent);
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
cd=(char*)malloc(n*sizeof(char));
cd[n-1]='\0';
for(i=1;i<=n;i++){
start=n-1;
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
if(HT[f].lchild==c)
cd[--start]='0';
else
cd[--start]='1';
HC[i]=(char *)malloc((n-start)*sizeof(char));
strcpy(HC[i],&cd[start]);
}
free(cd);
}
int main(){
HuffmanTree HT;
HuffmanCode HC;
char str[20];
int w[20],i,j;
printf("输入字符个数\n");
scanf("%d",&j);
getchar();
printf("请输入字符\n");
gets(str);
printf("输入字符权值\n");
for(i=0;i<j;i++)
scanf("%d",&w[i]);
HuffmanCoding(HT,HC,w,j,str);
printf("哈夫曼编码:\n");
for(i=1;i<=j;i++){
printf("%c --> ",str[i-1]);
puts(HC[i]);
}
return 0;
}
C语言实现哈夫曼编码
最新推荐文章于 2022-11-08 22:53:14 发布