Huffman编码

来源:互联网 发布:数据分析师能力模型 编辑:程序博客网 时间:2024/04/20 03:39

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#define N 10
#define Min 10
#define M 2*N-1
int i,j=0;
char hc[N+1][N+1];
float p=0,a[N],c=0;
typedef struct
{
float weight;
int parent;
int lchild;
int rchild;
}huffman,huffmantree[M+1];

void read();
void px(int i,int j);
void huffmancode(huffmantree ht, int j);
void hu(huffmantree ht,float a[],int j);
void read()
{

FILE *read;
read=fopen("1.txt","r");
for(i=1;i<N;i++)
{
fscanf(read,"%f/t",&a[i]);
p+=a[i];
j++;
if(p==1.0)
break;
}

}
void px(int i,int j)//排序
{
int q;
float c=0;
for(i=1;i<=j;i++)
{
for(q=1;q<=j;q++)
{
if(a[q]<a[q+1])
{
c=a[q];
a[q]=a[q+1];
a[q+1]=c;
}
}
}
}
void select(huffmantree ht,int a,int *s1,int *s2)
{
float c1=Min;
float c2;
for(i=1;i<=a;i++)
{
if (ht[i].parent==0&&ht[i].weight<c1)
{
*s1=i;
c1=ht[i].weight;
}
}

c2=Min;
for(i=1;i<=a;i++)
{
if (ht[i].parent==0&&(*s1!=i)&&c2>ht[i].weight)
{
*s2=i;
c2=ht[i].weight;
}
}

}
void huffmancode(huffmantree ht, int j) /*建立编码*/
{
int i,c,p;
int start;
char *cd;
cd=(char *) malloc((j+1)*sizeof(char));
for(i=1;i<=j;i++)
{
start=j;
cd[start]='/0';
c=i;
p=ht[i].parent;
while(p!=0)
{
start--;
if(ht[p].lchild==c)
cd[start]='0';
else
cd[start]='1';

c=p;
p=ht[p].parent;
}
strcpy(hc[i],cd+start);
}
free(cd);
}
void hu(huffmantree ht,float a[],int j)
{

int m=2*j-1;
int s1,s2;
FILE *write;
write=fopen("2.txt","w");
ht=(huffman *)malloc((m)*sizeof(huffman));
for(i=1;i<=j;i++)
{
ht[i].weight=a[i];
ht[i].parent=0;
ht[i].lchild=0;
ht[i].rchild=0;
}

for(i=j+1;i<=m;i++)
{
ht[i].weight=0;
ht[i].parent=0;
ht[i].lchild=0;
ht[i].rchild=0;
}
for(i=j+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;/*建立树完毕*/
}
fprintf(write,"HT的终态:/n");
fprintf(write,"/nnumber weight/tparent lchild rchild/n");
for(i=1;i<=m;i++)
fprintf(write,"%d/t%1.2f/t%d/t%d/t%d/n",i,ht[i].weight,ht[i].parent,ht[i].lchild,ht[i].rchild);
huffmancode(ht,j);
fprintf(write,"/nhuffman编码如下:/n");
fprintf(write,"概率 huffman编码/n");
for(i=1;i<=j;i++)
fprintf(write," %1.2f/t%s/n",ht[i].weight,hc[i]);

}
int main()
{

huffmantree hfm;
read();
px(i,j);
hu(hfm,a,j);
}

原创粉丝点击