1、 数据结构 课程设计报告 专 业 计算机科学与技术 班 级 (1) 姓 名 学 号 指导教师 起止时间 2011.102011.12 课程设计课程设计:赫夫曼编码器赫夫曼编码器 一、一、 任务任务描述描述 (1)建立一个文本文件,统计该文件中各字符频率,对各字符进行 Huffman 编码, 将该文件翻译成 Huffman 编码文件,再将 Huffman 编码文件翻译成原文件。 (2) “压缩文件”即:读文件、统计文件中的字符个数、对文件进行哈夫曼编码和 译码、并将编码译码后的字符存储在文件中。 要求:要求:根据以上任务说明,设计程序完成功能。 二、二、问题分析问题分析 1、功能分析功能分析 分
2、析设计课题的要求,要求编程实现以下功能: (1) I:初始化(Initialization) 。从终端读入字符集大小 n,以及 n 个字符和 n 个权值,建立 赫夫曼树,并将它存于文件 hfmTree 中。 (2) E:编码(Encoding) 。利用已建好的赫夫曼树(如不在内存,则从文件 hfmTree 中读入) , 对文件 ToBeTran 中的正文进行编码,然后将结果存入文件 CodeFile 中。 (3) D:译码(Decoding) 。利用已建好的赫夫曼树将文件 CodeFile 中的代码进行译码,结果 存入文件 Textfile 中。 三、数据结构设计三、数据结构设计 .哈夫曼树节
3、点的数据类型定义为: typedef struct /赫夫曼树的结构体 char ch; int weight; /权值 int parent,lchild,rchild; htnode,*hfmtree; 四、功能设计四、功能设计 (一)主控菜单设计 为实现通信录管理的操作功能, 首先设计一个含有多个菜单项的主控菜单程序, 然后再 为这些菜单项配上相应的功能。 程序运行后,给出 6 个菜单项的内容和输入提示,如下: 1. 一个功能函数对 ASCII 码的初始化并需要一个数组来保存它们; 2. 定义代表森林的数组, 在创建哈夫曼树的过程当中保存被选中的字符, 即给定报文 中出现的字符,模拟哈夫
4、曼树选取和删除左右子树的过程; 3. 自底而上地创建哈夫曼树,保存根的地址和每个叶节点的地址,即字符的地址,然 后自底而上检索,首尾对换调整为哈夫曼树实现哈弗曼编码; 4. 从哈弗曼编码文件当中读入字符, 根据当前字符为 0 或者 1 的状况访问左子树或者 右孩子,实现解码; 5. 使用文件读写操作哈夫曼编码和解码结果的写入; (二)程序模块结构 由课题要求可将程序划分为以下几个模块(即实现程序功能所需的函数) : (1) int main() 主函数: 利用已建好的哈夫曼树(如不在内存,则从文件 hfmtree.txt 中读入) 对文件中的正文进行编码,然后将结果存入文件 codefile.txt 中。如果正文中没有要编码 的字符,则键盘读入并存储到 ToBeTran 文件中。读入 ToBeTran 中将要编码的内容,将编码 好的哈夫曼编码存储到 CodeFile 中。 (2) Encoding 编码功能:对输入字符进行编码 (3