游程编码

来源:互联网 发布:农村淘宝网下载家乡版 编辑:程序博客网 时间:2024/05/16 11:36

游程编码:把编码长度在进行huffman编码

#include<stdio.h>
#include<math.h>
#define N 100
#define Min 10
#define M 2*N-1
char a[N];
char hc[N+1][N+1];
int b[N];
float p[N];
int num0[N],num1[N];
typedef struct
{
float weight;
int parent;
int lchild;
int rchild;
}huffman,huffmantree[M+1];
void huffmancode(huffmantree ht, int j);
void hu(huffmantree ht,float a[],int j);
void main()
{
huffmantree hfm;
FILE *read;
int i=0,j,k=0,l=0,t,nu,n=0;
//int sum0=0,sum1=0,sum=0;
float p0=0;
read=fopen("1.txt","r");
while(!feof(read))
{
a[i]=fgetc(read);
b[i]=a[i]-'0';
i++;
}
//n=i;
if (b[0]==0)
{ t=0;j=1;}
else
{ t=-1;j=0;}
i=0;
while(b!=NULL)
{
while(b[i]==0)
{
i++;
k++;
l=0;
num0[t]=k;
nu=t;
}
t=t+2;
while(b[i]==1)
{
i++;
l++;
k=0;
num0[j]=l;
nu=j;
}
j=j+2;
if(b[i]+49==0)
break;
}
num1[0]=num0[0];
k=0;
for (i=0;i<=nu;i++)
{
j=0;
while(j<=i &&num1[j]!=num0[i])
j++;
if(j>i)
{
k++;
num1[k]=num0[i];
}
}
t=0;
for(i=0;i<=k;i++)
{
for(j=0;j<=nu;j++)
{
if(num0[j]==num1[i])
t++;

}
p[i]=(1.0*t)/(1.0*(nu+1));
t=0;
}
hu(hfm,p,i);
}
void select(huffmantree ht,int a,int *s1,int *s2)
{
int i;
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) /*建立编码*/
{
FILE *write;
int i,c,p;
int start;
char *cd;
cd=(char *) malloc((j+1)*sizeof(char));
write=fopen("2.txt","w");
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);
fprintf(write,"/n数值/t概率/thuffman编码/n");
for(i=1;i<=j;i++)
{
//printf("%.4f/t %s/n",ht[i].weight,hc[i]);
fprintf(write,"%d/t%1.2f/t %s/n",num1[i-1],ht[i].weight,hc[i]);
}
}
void hu(huffmantree ht,float a[],int j)
{
int i;
int m=2*j-1;
int s1,s2;
ht=(huffman *)malloc((m)*sizeof(huffman));
for(i=1;i<=j;i++)
{
ht[i].weight=a[i-1];
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;/*建立树完毕*/
}
huffmancode(ht,j);

}

原创粉丝点击