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

C语言实现哈夫曼编码

2016-02-04 18:22 441 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: