哈夫曼编码实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
哈夫曼编码实验报告:
数据结构的某项实验
①问题描述:给定n个字符的权值数组w,根据哈夫曼编码与译码规则,实现一个哈夫曼编/译码系统(利用实验指导书上的27个字符的数据进行实验)。
②利用顺序表存储Huffman树,编码结果的存储方式采用书上的结构。
③Huffman树的构造约定如下:
根的权值较小的子树作为左子树,当权值相等时,则先生成的子树是左子树;
按照结点的生成次序选择权值较小的两棵子树构造Huffman 树;
从叶子结点到根结点逆向求出每个字符的Huffman编码,不采用递归方法;
从根结点开始实现译码,要求被译码的字符数大于20个字符。
④采用文件方式存储n个权值和待翻译的二进制代码,其余数据均不采用文件存储。
序号字符权值双亲结点左孩子右孩子
1□186 0 0 0
2 A 64 0 0 0
3 B 13 0 0 0
4 C 22 0 0 0
6 E 103 0 0 0
7 F 21 0 0 0
8 G 15 0 0 0
9 H 47 0 0 0
10 I 57 0 0 0
11 J 1 0 0 0
12 K 5 0 0 0
13 L 32 0 0 0
14 M 20 0 0 0
15 N 57 0 0 0
16 O 63 0 0 0
17 P 15 0 0 0
18 Q 1 0 0 0
19 R 48 0 0 0
20 S 51 0 0 0
21 T 80 0 0 0
22 U 23 0 0 0
23 V 8 0 0 0
24 W 18 0 0 0
25 X 1 0 0 0
26 Y 16 0 0 0
1.实验过程与结果
完整代码:(实验环境codeblock)
#include
#include
#include
//左0右1
typedef struct
{
unsigned int weight;
unsigned int parent,lchild,rchild;
char c;
int length;
}HTNode,*HuffmanTree;
typedef char**HuffmanCode;
void save(int n,int w[],char code[],char ch[]) {
FILE*fp;
char filename[20];
int i;
printf("请输入要保存的文件名称:\n"); scanf("%s",filename);
if((fp=fopen(filename,"wb"))==NULL)//打开输出文件
{
printf("cannot open file:\n");
return;
}
for(i=0;i<=n;i++)
{
if(fwrite(&w[i],sizeof(int),1,fp)!=1)//数组向磁盘文件写入各叶子节点权值
printf("file write error!\n");
}
for(i=0;i<=n;i++)
{
if(fwrite(&ch[i],sizeof(char),1,fp)!=1)//数组向磁盘文件写入各叶子字母代表
printf("file write error!\n");
}
for(i=0;i<=strlen(code);i++)
{
if(fwrite(&code[i],sizeof(char),1,fp)!=1)//数组向磁盘文件写入待破解电码代码
printf("file write error!\n");
}
printf("保存文件成功!!!");
fclose(fp);
}
void read(int n,int w[],char code[],char ch[])
{
FILE*fp;
char filename[20];
int i;
printf("请输入读入的文件名:\n");
scanf("%s",filename);
if((fp=fopen(filename,"rb"))==NULL)//以只读方式打开二进制文件
{printf("can not open file\n");
fclose(fp);
}
for(i=0;i<=n;i++)
fread(&w[i],sizeof(int),1,fp);//磁盘文件向数组读入
for(i=0;i<=n;i++)
fread(&ch[i],sizeof(char),1,fp);
for(i=0;i<=strlen(code);i++)
fread(&code[i],sizeof(char),1,fp);
printf("读入数据成功!!!!");
fclose(fp);
}
void createHuffmanTree(HuffmanTree\*HT,int w[],int n,char ch[])
{
int m=2*n-1;
int s1,s2,i;
\*HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(i=1;i<=n;i++)
{(\*HT)[i].weight=w[i];(\*HT)[i].lchild=0;
(\*HT)[i].parent=0;(\*HT)[i].rchild=0;
(\*HT)[i].c=ch[i];(\*HT)[i].length=0;
}
for(i=n+1;i<=m;i++)
{(\*HT)[i].weight=0;(\*HT)[i].lchild=0;
(\*HT)[i].parent=0;(\*HT)[i].rchild=0;
(\*HT)[i].c='\0';(\*HT)[i].length=0;
}
printf("\n构建哈夫曼树:\n");
for(i=n+1;i<=m;i++)
{select(HT,i-1,&s1,&s2);(\*HT)[s1].parent=i;