69,371
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
FILE *hfmTree,*CodeFile;
typedef struct
{
unsigned int weight ;
unsigned int parent,LChild,RChild;
}HuffmanTree;
void select(HuffmanTree *ht,int n,int *s1,int *s2)
{ int i; int min;
for(i=1; i<=n; i++)
{
if(ht[i].parent == 0)
{
min = i; i = n+1;
}
}
for(i=1; i<=n; i++)
{
if(ht[i].parent == 0)
{
if(ht[i].weight < ht[min].weight)
min = i;
}
}
*s1 = min;
for(i=1; i<=n; i++)
{
if(ht[i].parent == 0 && i!=(*s1))
{
min = i; i = n+1;
}
}
for(i=1; i<=n; i++)
{
if(ht[i].parent == 0 && i!=(*s1))
{
if(ht[i].weight < ht[min].weight)
min = i;
}
}
*s2 = min;
}
void CreatHuffmanTree(HuffmanTree *ht,int *w, int n)
{
int m=2*n-1;
int i;
int s1,s2;
for(i=1;i<=m;i++)
{
if(i<=n)
{
ht[i].weight=w[i-1];
}
else
{
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[i].weight=ht[s1].weight+ht[s2].weight;
ht[s1].parent=i;
ht[s2].parent=i;
ht[i].LChild=s1;
ht[i].RChild=s2;
}
}
void outputHuffman(HuffmanTree *HT, int m)
{
if(m!=0)
{
printf("%d ", HT[m].weight);
fprintf(hfmTree,"%d ",HT[m].weight);
outputHuffman(HT,HT[m].LChild);
outputHuffman(HT,HT[m].RChild);
}
}
void search(int a,int m,HuffmanTree *t,char *s,int collation[100][100]){
int i,b=a,coding[100],j;
for(i=0;b!=m;i++){
if(t[t[b].parent].RChild==b)
coding[i]=1;
else
coding[i]=0;
b=t[b].parent;}
printf("letters:%c,weight:%d编码为",s[a-1],t[a].weight);
for(j=0,i--;i>=0;i--,j++){
printf("%d",coding[i]);
collation[a-1][j]=coding[i]+1;}
printf("\n");
}
void output(char *cod,char *s,HuffmanTree *t,int n){
int i;
HuffmanTree p;
p=t[2*n-1];
for(i=0;cod[i]!='\0';i++){
if(cod[i]=='0')
p=t[p.LChild];
else
p=t[p.RChild];
if(p.LChild==0&&p.RChild==0){
if(cod[i]=='1')
printf("%c",s[t[p.parent].RChild-1]);
else
printf("%c",s[t[p.parent].LChild-1]);
p=t[2*n-1];}
}
}
int main(){
hfmTree=fopen("D:\\我的文档\\hfmTree.txt","w");
CodeFile=fopen("D:\\我的文档\\CodeFile.txt","w");
int a[100],collation[100][100]={},n,i,j,k;
HuffmanTree t[100];
char s[100],cod[100],word[100];
while(printf("输入元素个数:(输入0结束)\n"),scanf("%d",&n),n){
printf("依次输入元素(字符串)\n");
getchar();
for(i=0;i<n;i++)
scanf("%c",&s[i]);
printf("依次输入元素的权值\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
CreatHuffmanTree(t,a,n);
outputHuffman(t,2*n-1);
printf("\n");
for(i=1;i<=n;i++)
search(i,2*n-1,t,s,collation);
printf("\n输入原文:\n");
getchar();
gets(word);
printf("%s\n",word);
for(i=0;word[i]!='\0';i++){
for(j=0;j<n;j++){
if(word[i]==s[j]){
for(k=0;collation[j][k]!=0;k++){
printf("%d",collation[j][k]-1);
fprintf(CodeFile,"%d",collation[j][k]-1);}
break;}
}
}
printf("\n输入哈夫曼编码:\n");
scanf("%s",cod);
output(cod,s,t,n);
printf("\n\n");
}
fclose(hfmTree);
fclose(CodeFile);
return 0;
}