《哈夫曼树编码译码实验报告》由会员分享,可在线阅读,更多相关《哈夫曼树编码译码实验报告(18页珍藏版)》请在金锄头文库上搜索。
1、1实 验 报 告一、 实验题目:哈夫曼编/译码系及其应用二、 实验地点:三、 实验目的:1.掌握哈夫曼树的概念、存储结构2.掌握建立哈夫曼树和哈夫曼编码的方法及带权路径长度的计算3.熟练掌握二叉树的应用四、 实验内容:实现哈夫曼树的生成,完成哈夫曼编/译码的输出。1.初始化,从数据文件DataFile.data中读入字符及每个字符的权值,建立哈夫曼树HuffTree;2.编码,用已建好的哈夫曼树,对文件ToBeTran.data中的文本进行编码形成报文,将报文写在文件Code.text中;3.译码,利用已建好的哈夫曼树,对文件CodeFile.data中的代码进行解码形成原文,结果存入文件Te
2、xtfile.txt中;4.输出,输出DataFile.data 中出现的字符以及各字符出现的频度(或概率);输出ToBeTran.data及其报文Code.text;输出CodeFile.data及其原文Textfile.txt。编写主程序,实现对各不同的算法调用。五、 实验环境(使用的软件):Visaul C+6.0六、 实验步骤及操作:打开VC+6.0创建工程/Win32 Console Application ,输入工程名:哈夫曼树,新建三个.h文件一个.cpp文件1将一些常量定义,系统函数原型声明和类型(Status)重定义,结果状态代码等放在一个头文件中:取名为huffermanp
3、ubuse.h。#include#include#include /* malloc()等*/#include /* INT_MAX 等*/#include /* EOF(=Z 或 F6),NULL */#include /* atoi() */#include /* eof() */#include /* floor(),ceil(),abs() */#include /* exit() */2/* 函数结果状态代码*/#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1/* #define
4、 OVERFLOW -2 因为在 math. h 中已定义 OVERFLOW 的值为 3,故去掉此行*/typedef int Status; /* Status 是函数的类型,其值是函数结果状态代码,如 OK 等*/typedef int Boolean; /* Boolean 是布尔类型,其值是 TRUE 或 FALSE */2将哈夫曼树存储结构定义放在一个头文件:取名为 huffermandef.h。typedef structchar ch;unsigned int weight;unsigned int parent,lchild,rchild;HTNode,*HuffmanTree
5、; /* 动态分配数组存储赫夫曼树*/typedef char *HuffmanCode; /* 动态分配数组存储赫夫曼编码表 */3.将哈夫曼树的基本操作算法也集中放在一个文件之中,取名为 huffermanalgo.h。int min1(HuffmanTree t,int i) /* 函数 void select()调用*/int j,flag;unsigned int k=UINT_MAX; /* 取 k 为不小于可能的值*/for(j=1;j*s2)j=*s1;*s1=*s2;3*s2=j;void HuffmanCoding(HuffmanTree &HT,HuffmanCode &
6、HC,int *w,char *ch,int n) /* 算法 6.12 */ /* w 存放 n 个字符的权值 (均0), 构造赫夫曼树 HT,并求出 n 个字符的赫夫曼编码 HC */int m,i,j,s1,s2,start;unsigned c,f;HuffmanTree p;char *cd;if(n1) :);scanf(%d,m=2*n-1;wt=(int*)malloc(n)*sizeof(int);chh=(char*)malloc(n)*sizeof(char);printf(请输入数据文件名:);scanf(%s,str1);WriteDataFile(str1);11R
7、eadDataFile(str1,wt,chh);HuffmanCoding(HT,HC,wt,chh,n);printf( node letter weight parent lchild rchild);printf(n);for(i=1;i=m;i+)printf( %4d %6c %7d %8d %8d %8d,i,HTi.ch,HTi.weight,HTi.parent,HTi.lchild,HTi.rchild);printf(n);printf(* 哈夫曼树编码译码 *n);printf(* 1.对哈夫曼树进行编码 *n);printf(* 2.对文本文件中的文本进行编码 *n)
8、;printf(* 2.对代码文件中的代码进行译码 *n);printf(* 3.感谢使用 *n);while(x)printf(请输入要实现功能的代码:n);scanf(%d,switch(y)case 1: printf(赫夫曼编码为:n);for(i=1;i=n;i+)printf(%c 的编码为:,*(chh+i-1);puts(HCi); break;case 2: printf(请输入文本文件名:);scanf(%s,str2);WriteToBeTran(str2);ReadToBeTran(str2,str);printf(请输入文本编码存放文件名:);scanf(%s,str
9、5);WriteCode(str2,str5,HT,HC,n);ReadCode(str5);break;case 3: printf(请输入代码文件名:);scanf(%s,str3);12WriteCodeFile(str3);ReadCodeFile(str3,str4);yima(HT,n,str4,hh);printf(请输入译文存放文件名:);scanf(%s,str6);WriteTextFile(str6,hh);ReadTextFile(str6);break;case 4:printf(感谢使用!n);x=0;break;default: printf(error!);break;保存,编译,连接,运行。七、 实验结果:1314151617八、 实验总结及心得体会:九、 对本实验过程及方法、手段的改进建议:报告评分:指导教师签字: 批阅日期: 18注意: 实验报告以纸质文档形式上交。实验报告将记入平时成绩; 每次实验开始时,交上一次的实验报告,否则将扣除此次实验成绩。