什么是 精馏的理论板
这个到底是什么问题。。。。。。。。
我这里倒是有HUFFMAN法的文件压缩过程:
#include
#include
#include
#include
#include
struct htnode
{
char ch;
int weight,parent,lchild,rchild;
};
struct hc
{
char *code;
char word;
int size;
};
void select(struct htnode * ht,int n,int& s1, int& s2)
{
int small1=9999, small2=9999,i;
for(i=1;i<=n-1...全部
这个到底是什么问题。。。。。。。。
我这里倒是有HUFFMAN法的文件压缩过程:
#include
#include
#include
#include
#include
struct htnode
{
char ch;
int weight,parent,lchild,rchild;
};
struct hc
{
char *code;
char word;
int size;
};
void select(struct htnode * ht,int n,int& s1, int& s2)
{
int small1=9999, small2=9999,i;
for(i=1;i<=n-1;i++)
{
if(ht[i]。
weight parent==0)
{
small2=ht[i]。weight;
s2=i;
}
}
}
void reduce()
{
FILE *fpin,*fpout;
int cut[32768];
int i,k;
char flag;
double j=0;
for(i=0;i<=32768;i++)
cut[i]=0;
fpin=fopen("code。
txt","r");
fpout=fopen("reduce。txt","wb");
i=0;
while(fread(&flag,sizeof(char),1,fpin))
{
if(flag=='1')
{
cut[i]=(cut[i])|(int)(pow(2,(14-j)));
}
j=j+1;
if(j==15)
{
j=0;
i++;
}
}
for(k=0;k<=i;k++)
{
fwrite(&cut[k],sizeof(int),1,fpout);
}
printf("\n");
fclose(fpin);
fclose(fpout);
}
void unreduce()
{
FILE *fpin;
fpin=fopen("reduce。
txt","r");
double j=0;
int flag,uncut[32768],k=0,i;
while(fread(&flag,sizeof(int),1,fpin))
{
for(j=0;j<=14;j=j+1)
if(flag&(int)(pow(2,(14-j))))
uncut[k++]=1;
else
uncut[k++]=0;
}
for(i=0;i txt","r");
fpout=fopen("translate。txt","w");
while(!feof(fpin))
{
text[k++]=fgetc(fpin);
for(i=1;i<=n;i++)
if(strcmp(text,hcc[i]。
code)==0)
{
fprintf(fpout,"%c",hcc[i]。word);
for(j=0;j txt","w");
struct hc *hcc;
char *cd;
int i,c,f,start,k=0,s1,s2;
struct htnode *ht;
int m=2*n-1;
if(n<=1) return;
ht=(struct htnode *)malloc(sizeof(struct htnode)*(m+1));
for(i=1;i<=n;i++)
{
ht[i]。
ch=word[i-1];
ht[i]。parent=0;
ht[i]。lchild=0;
ht[i]。rchild=0;
ht[i]。weight=w[ht[i]。ch];
}
for(i=1;i<=n;i++)
printf("%c,%d",ht[i]。
ch,ht[i]。weight);
printf("\n");
for(i=n+1;i<=m;i++)
{
ht[i]。ch=word[i-n];
ht[i]。parent=0;
ht[i]。
lchild=0;
ht[i]。rchild=0;
ht[i]。weight=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;
}
hcc=(struct hc *)malloc((n+1)*sizeof(struct hc));
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';
hcc[i]。
code=(char *)malloc((n-start)*sizeof(char));
strcpy(hcc[i]。code,&cd[start]);
hcc[i]。word=ht[i]。
ch;
hcc[i]。size=n-start-1;
}
free(cd);
for(i=1;i<=n;i++)
fprintf(fp,"%c:%s",hcc[i]。word,hcc[i]。
code);
fclose(fp);
fpp=fopen("code。txt","wb");
while(text[k]!='\0')
{
for(i=1;i<=n;i++)
if(text[k]==hcc[i]。
word)
{
fwrite(hcc[i]。code,sizeof(char)*hcc[i]。size,1,fpp);
}
k++;
}
fclose(fpp);
for(i=1;i<=n;i++)
printf("%c:%s\n",hcc[i]。
word,hcc[i]。
code);
translate(hcc,n);
reduce();
unreduce();
}
void main()
{
FILE *fpin;
char file[20];
printf("请输入要压缩的文件名\n");
gets(file);
fpin=fopen(file,"r");
int w[32768],i,j,k,m=0,flag,n=0;
for(i=0;i<=32767;i++) w[i]=0;
i=k=0;
char ch,word[32768],text[32768],code[32768];
while(!feof(fpin))
code[m++]=fgetc(fpin);
fclose(fpin);
code[--m]='\0';
m=0;
while(code[m])
{
ch=code[m];
m++;
text[k++]=ch;
flag=0;
w[ch]++;
for(j=0;j<=32767;j++)
if(word[j]==ch)
flag=1;
if(flag==0)
{
word[i]=ch;
n++;
i++;
}
}
word[i]='\0';
text[k]='\0';
huffmancodeing(w,word,n,text);
}。收起