哈夫曼编码实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档