如题.最好有明确的题目,和注释!
谢谢~~
參考答案:我编的一个哈夫曼树,你参考参考
#include <stdio.h>
int m[15],z=0; /*code*/
int i=0,js; /*ecode*/
int e=53; /*ecode*/
typedef struct hf{
int l,r,p,w;}elem,*def;
/*----------初始化-set------------*/
set(def h){
int w[27]={186,64,13,22,32,103,21,15,47,57,1,5,32,20,57,63,15,1,48,51,80,23,8,18,1,16,1};
int i,j;
h=(def)malloc(55*sizeof(elem));
for(i=0;i<27;i++){
h[i+1].w=w[i];
h[i+1].l=h[i+1].r=h[i+1].p=0;}
for(i=27;i<54;i++){
h[i+1].l=h[i+1].r=h[i+1].p=h[i+1].w=0;}
return h;
}
/*-------------创建哈夫曼树-create-----------*/
create(def h){
FILE *fp;
int w1,w2;
int i1,i2;
int k=27,i,j;
fp=fopen("hafmtree.txt","w+");
w1=w2=2000;
i1=i2=0;
while(k<=52){
for(i=0;i<=k;i++){
if(h[i].p==0){
if(h[i].w<=w1){
w2=w1;w1=h[i].w;
i2=i1;i1=i;
}
else{
if(h[i].w>w1&&h[i].w<=w2)
{w2=h[i].w;i2=i;}
}
}
}
h[k+1].w=w1+w2;
h[i1].p=h[i2].p=k+1;
h[k+1].l=i1;
h[k+1].r=i2;
k++;
w2=w1=2000;
}
h[53].p=0;
for(j=1;j<54;j++){
fprintf(fp,"jiedian (%d): l--%d,r--%d,p--%d,w--%d\n",j,h[j].l,h[j].r,h[j].p,h[j].w);}
}
/*----------------编码-code-----------------*/
code(int n,def h){
int q=h[n].p; /*找父节点*/
if(n==h[q].l) /*判断左右孩子*/
m[z]=1;
else
m[z]=0;
z++;
if(q!=0) /*是否为根节点*/
{n=q;
code(n,h);
}
}
/*-----------------译码-ecode---------------*/
ecode(char ec,def h){
if(ec=='1')
e=h[e].l;
else
if(ec=='0'&&ec!='\n')
e=h[e].r;
js=0;
return e;
}
/*------------------打印print-------------------*/
print(def h){
FILE *fp;
int a,n,i,j=256,x=0,y=256;
int s[20][512]={0};
fp=fopen("treeprint.txt","w");
for(i=1;i<54;i++){
a=i;
while(h[a].p!=0){
if(a==h[h[a].p].l)
m[z]=1;
else m[z]=0;
a=h[a].p;
z++;
}
for(n=z-1;n>=0;n--){
j=j/2;
if(m[n]==1)
y=y-j;
else
y=y+j;
x+=2;
}
/*if(s[x][y]==0){*/
if(h[i].l==0)
s[x][y]=i+95;
else
s[x][y]=i;
z=0;
j=256;
x=0;y=256;
}
for(i=0;i<20;i++){
for(j=0;j<512;j++){
if(s[i][j]!=0){
if(s[i][j]>95)
fprintf(fp,"%c",s[i][j]);
else fprintf(fp,"%d",s[i][j]);
}
else fprintf(fp,"_");
}
fprintf(fp,"\n");
}
}
/*--------------main------------*/
main(){
/*+++++++++++++++定义各种变量++++++++++++++++++++++++*/
def h;
FILE *fp1,*fp2,*fp3,*fp,*fp5;
int n,j,k=0;
char ec;
char a[27];
/*++++++++++++++++读出tobetran中的字符++++++++++++++++++++++++*/
h=set(h); /*初始化*/
create(h); /*创建哈夫曼树*/
print(h);
fp3=fopen("tobetran.txt","r");
for(i=0;i<27;i++){
fscanf(fp3,"%c",&a[i]);
}
/*===========将报文的编码写入codefile中去===================*/
fp1=fopen("codefile.txt","w+");
fp2=fopen("codefile.txt","r");
for(i=0;i<=26;i++){
if(a[i]==' ') n=1;
else n=a[i]-95;
code(n,h); /*编码*/
for(j=z-2;j>=0;j--){
fprintf(fp1,"%d",m[j]);
}
fprintf(fp1,"\n");
z=0;
}
fclose(fp1);
/*==========将codefile中的编码翻译成字符,并写入textfile中===*/
j++;
fp=fopen("textfile.txt","w");
fp5=fopen("cprint.txt","w");
while(k==0){
fscanf(fp2,"%c",&ec);
e=ecode(ec,h);
if(h[e].l==0){
if(e!=1)
fprintf(fp,"%c",e+95);
else
fprintf(fp," ");
js=1;
}
if(js==1)
e=53;
/*-------每行50个写入cprint.txt--------*/
if(ec!='\n')
fprintf(fp5,"%c",ec);
j++;
if(j%50==0)
fprintf(fp5,"\n");
k=feof(fp2);
}
fclose(fp2);
fclose(fp);
}