C 哈弗曼编码实验报告
学院, 计算机科学与技术 专业,计算机科学与技术学号, 班级, 姓名,
2010-12-25
题目:哈弗曼编码
一、 需求分析:
1) I:初始化。从文件读入字符集大小n,以及n个字符和n个权
值,建立Huffman树,。
2) E:编码(encoding)。利用以建好的HuffmanTree(如不在内在,
则从文件hfmzifu中读入),对用户给定文件中正文进行编码,
然后将结果存入用户给定文件中。
3) D:译码(decoding)。利用已建好的HuffmanTree对输入的文件
中的代码进行译码,结果存入用户给定文件中。 4) T:印HuffmanTree。将已在内在中的HuffmanTree以直观的方
式显示在终端上。
二、 详细设计
1) 源文件:Huffmantree.cpp
2) 函数有主函数main();求最小的权值minl(HuffmanTree.int i); 选
择函数Silect (HuffmanTree t,int i,int *s1,int *s2);哈弗曼编码函
数HuffmanCoding(HuffmanTree *HT,HuffmanCode *HC,int
*w,int n);
源程序
#include
#include
#include
using namespace std;
typedef struct
{
int weight;
int parent;
int lchild;
int rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;
int minl(HuffmanTree t,int i); void HuffmanCoding(HuffmanTree *HT,HuffmanCode *HC,int *w,int n);
void select(HuffmanTree t,int i,int *s1,int *s2);
//--------------------------------------------------------------------------
void main()
{
HuffmanTree HT;
HuffmanCode HC;
ifstream in("hfmzifu.txt");
int *w,n,i;
cout<<"从文件hfmzifu.txt输入字符的个数,字符,权值,#代表空格"<>n;
char *ch;
ch=(char *)malloc((n+1)*sizeof(char));
w=(int *)malloc(n*sizeof(int));
for (i=0;i>ch[i+1];
in>>w[i];
}//给w赋值。
HuffmanCoding(&HT,&HC,w,n);//建哈弗曼树
cout<<"--------------------------------------------------------"<>c;
if (c==0)
{
cout<<"退出系统~"<4||c<0)
{
cout<<"你输入有误请重新输入:"<>c;
}
fstream file;
ofstream outfile;
ifstream printfile;
ifstream codefile;
ofstream Myoutput;
if(c==1)
{
cout<<"哈弗曼树为:"<n)
{
outfile<=1&&flag<=n) //判断停止的条件
{
Myoutput<*s2)
{
j=*s1;
*s1=*s2;
*s2=j;
}
}
void HuffmanCoding(HuffmanTree *HT,HuffmanCode *HC,int *w,int n)
{
if(n<=1)
return;
int s1,s2,start;
char *cd=NULL;
int m=2*n-1;
*HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
HuffmanTree p;
int i,c,f;
for(p=(*HT)+1,i=1;i<=n;i++,p++,w++)
{
(*p).weight=*w;
(*p).parent=0;
(*p).rchild=0;
(*p).lchild=0;
}
for(;i<=m;i++,p++)
{
(*p).weight=0;
(*p).parent=0;
(*p).rchild=0;
(*p).lchild=0;
}
for(i=n+1;i<=m;i++)
{
Select(*HT,i-1,&s1,&s2);//找出两个权值最小的节点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;
}
//----从叶子到根逆向求每个字符的哈弗曼编码----
(*HC)=(HuffmanCode)malloc((n+1)*sizeof(char *));
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';
}
(*HC)[i]=(char *)malloc((n-start)*sizeof(char));
strcpy((*HC)[i],&cd[start]);
}
free(cd);
}
(3)程序执行结果:
本文档为【C 哈弗曼编码实验报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。