资源简介

用c语言实现的哈夫曼编码译码器,是数据结构中的经典案例。里面含有设计报告和源代码。把好的东西贡献出来,供大家参考一下。

资源截图

代码片段和文件信息

#include
#include
#include
#include
typedef struct {
int weight;
int parent;
int lchild;
int rchild;
} HTNode*HuffmanTree;
typedef char* *HuffmanCode;
void InitCreation(int nint *wchar *a FILE *H)
{   
int iq*s;
char p;
printf(“  要编码的所有字母为\n“);
    H=fopen(“hfmTree““r“);

for(i=1;i<=n;i++)
{
    p=fgetc(H);
a[i]=p;

}

a[n+1]=‘\0‘;
putchar(‘  ‘);
for(i=1;i {   

putchar(a[i]);
}
printf(“空格\n“);
    
for(i=0s=w;i {   
fscanf(H“%d“&q);
*s=q;
}
printf(“  要编码的字符的所有权值为\n“);
    printf(“  “);
for(i=0;i {
printf(“%d “*(w+i));
}
printf(“\n“);
   fclose(H);
}



int Select(HuffmanTree HTint pint r)
{
int ijmin;
for(i=1min=10000;i<=p;i++)
{
if(i!=r)
{
if(HT[i].parent==0&&min>HT[i].weight)
{
min=HT[i].weight;

                j=i;
}
}

}
    
    
return(j);

}

void HuffmanCoding(HuffmanTree HTHuffmanCode HCint nchar *aint *w)
{
HuffmanTree p;
int mirsfcstart;
char *cd;
if(n<=1) return;
m=2*n-1;
for(p=HT+1i=1;i<=n;++p++i++w)
{
p->weight=*w;
p->parent=0;
p->lchild=0;
p->rchild=0;
}


for(;i<=m;++i++p)
{
p->weight=0;
p->parent=0;
p->lchild=0;
p->rchild=0;

}
   
     
 for(i=n+1;i<=m;++i)
{
r=Select(HTi-10);
s=Select(HTi-1r);
HT[r].parent=i;
HT[s].parent=i;
HT[i].lchild=r;
HT[i].rchild=s;
HT[i].weight=HT[r].weight+HT[s].weight;
}
 printf(“HT数组中所有的数据为\n“);
 printf(“HT weight parent lchild rchild\n“);
 for(p=HT+1i=1;i<=m;++p++i)
 {
 printf(“   %d       %d       %d       %d\n“p->weight p->parent p->lchildp->rchild );//输出数组中所有的数据
 }
    


cd=(char*)malloc(n*sizeof(char));
cd[n-1]=‘\0‘;
    printf(“所有字符的编码为\n“);
for(i=1;i<=n;i++)
{
start=n-1;
for(c=if=HT[i].parent;f!=0;c=ff=HT[f].parent)
{
if(HT[f].lchild==c)
cd[--start]=‘0‘;
else
cd[--start]=‘1‘;
}
        HC[i]=(char*)malloc((n-start)*sizeof(char));
strcpy(HC[i]&cd[start]);
if(i==n)
{
printf(“空格“);
}
else
{
printf(“%c“a[i]);
}
printf(“%s\n“HC[i]);

}



}
void HuffmanCreat(HuffmanCode HCFILE *TFILE *Cint n)
{   
char ab*p;
int i;
printf(“  对ToBeTran文件加密后的内容为\n“);
T=fopen(“ToBeTran““r“);
C=fopen(“CodeFile““w“);
a=fgetc(T);
while(a!=EOF)
{
    if(a==‘ ‘)
{
i=n;
}
else
{
i=a-96;
}
    p=HC[i];
    b=*p;
    p=p+1;
for(;b!=‘\0‘;p++)
{   
fputc(bC);
b=*p;
}
printf(“%s“HC[i]);
a=fgetc(T);

}
fclose(T);
    fclose(C);
printf(“\n“);
}
void HuffmanChange(HuffmanTree HTchar *aFILE *CFILE *F)
{
     int imrt;

     char q;
    t=0;
for(i=1;t==0;i++)
{
if(HT[i].parent ==0)
{
t=i;
}
}
printf(“  对CodeFile解密后的内容为\n“);
m=1;
C=fopen(“CodeFile““r“);
F=fopen(“TextFile““w“);

do
{  
if(m!=0

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件        102  2009-06-30 10:52  哈夫曼编译码器\Debug\hfmTree

     文件     196715  2009-07-20 17:32  哈夫曼编译码器\Debug\sdfsdfas.exe

     文件     205320  2009-07-20 17:32  哈夫曼编译码器\Debug\sdfsdfas.ilk

     文件      15652  2009-07-20 17:32  哈夫曼编译码器\Debug\sdfsdfas.obj

     文件     197584  2009-07-17 11:19  哈夫曼编译码器\Debug\sdfsdfas.pch

     文件     484352  2009-07-20 17:32  哈夫曼编译码器\Debug\sdfsdfas.pdb

     文件         96  2009-06-30 15:51  哈夫曼编译码器\Debug\ToBeTran

     文件      33792  2009-07-20 17:32  哈夫曼编译码器\Debug\vc60.idb

     文件      53248  2009-07-20 17:32  哈夫曼编译码器\Debug\vc60.pdb

     文件        102  2009-06-30 10:52  哈夫曼编译码器\hfmTree

     文件       4460  2009-07-17 11:18  哈夫曼编译码器\sdfsdfas.c

     文件         96  2009-06-30 15:51  哈夫曼编译码器\ToBeTran

     文件     266752  2011-05-25 20:00  哈夫曼编译码器\哈夫曼编译码器.doc

     目录          0  2011-05-25 18:56  哈夫曼编译码器\Debug

     目录          0  2011-05-25 20:01  哈夫曼编译码器

----------- ---------  ---------- -----  ----

              1458271                    15


评论

共有 条评论