哈夫曼树的应用数据结构课程设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数据结构》课程设计报告

题目:哈夫曼树应用

学生姓名:**

学号: ************

专业班级:计科13102

同组姓名:赵丽娜

指导教师:***

设计时间:2014年下学期第18周

指导老师意见:

评定成绩: 签名: 日期:

目录

一、需求分析 (3)

1. 分析问题 (3)

2. 确定解决方案 (3)

3. 输入的形式和输入值的范围 (3)

4.输出的形式 (3)

5.程序所能达到的功能 (3)

二、概要设计 (4)

1. 主程序的流程图: (4)

2.程序中数据类型的定义: (5)

3.各程序模块之间的层次(调用)关系: (5)

三、详细设计 (6)

1.哈夫曼树存储及类的定义: (6)

2.哈夫曼树的基本操作: (6)

3.主函数 (6)

四、调试分析和测试结果. (8)

1. 测试数据及其输出结果: (8)

2. 调试过程中遇到的问题及解决办法: (12)

五、总结 (13)

六、参考文献 (13)

七、致谢 (13)

八、附录 (13)

一、需求分析

1.分析问题

利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。为这样的信息收发站写一个哈夫曼码的编/译码系统。

2.确定解决方案

设计建立带权的哈夫曼树,确定哈夫曼树的类与成员函数,以及各函数之间的调用关系,采用动态数组的存储结构存储所需要的数据,通过不同的函数来实现编码,译码以及打印二进制编码、哈夫曼树,把不同的数据存入不同的txt文件中,通过主函数调用来实现功能检测。

3.输入的形式和输入值的范围

手动或者从文本中读入数据的形式初始化哈夫曼树,从键盘中或者文件中读入数据,以字母A-Z代表结点,以自然数代表权值,字符串提示使用者所要执行的操作。

4.输出的形式

在显示器界面上或者以文本的形式来实现程序调试的输出。

5.程序所能达到的功能

(1)I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n 个权值,建立哈夫曼树,并将它存于文件hfmTree中。

(2)E:编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。

(3)D:译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。

(4)P:打印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每

行50个代码。同时将此字符形式的编码文件写入文件CodePrin中。

测试数据:

(1)利用下面这道题中的数据调试程序。某系统在通信联络中只可能出现八种字符,其概率分别为0.25,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试设计哈夫曼编码。

(2)用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAM IS MY FA VORITE”。

字符空格 A B C D E F G H I J K L M

频度64 13 22 32 103 21 15 47 57 1 5 32 20

字符N O P Q R S T U V W X Y Z

频度57 63 15 1 48 51 80 23 8 18 1 16 1

实现提示:

(1)编码结果以文本方式存储在文件CodeFile中。

(2)用户界面可以设计为“菜单”方式:显示上述功能符号,再加上“Q”,表示退出运行Quit。请用户键入一个选择功能符。此功能执行完毕后再显示此菜单,直至某次用户选择了“Q”为止。

(3)在程序的一次执行过程中,第一次执行I,D或E命令之后,哈夫曼树已经在内存了,不必再读入。每次执行中不一定执行I命令,因为文件hfmTree 可能早已建好。

二、概要设计

1.

2.程序中数据类型的定义:

用到三组结构体,分别是哈夫曼树的动态数组存储结构*HuffmanTree,哈夫曼编码表的存储结构HuffmanCode,字符结点的动态数组存储结构wElem 以及哈夫曼树类定义class Huffman。

3.各程序模块之间的层次(调用)关系:

主函数main()调用初始化,编码,译码,打印二进制编码,打印哈夫曼树这五个子函数;进入初始化功能后调用手动输入,文本读入,默认文本这三个函数;进入编码功能后调用手动编码,文本读入编码这两个函数;进入译码功能后调用手动译码,文本读入译码这两个函数(如图2所示)。

三、详细设计

1.哈夫曼树存储及类的定义:

#include

#include

#include

#include

#include

using namespace std;

#define MAXN 60

#define INF 9999

int date[40]={INF,64,13,22,32,103,21,15,47,57,1,5,32,

20,57,63,15,1,48,51,80,23,8,18,1,6,1,INF,INF,INF,INF,INF,INF,INF,186};

//字符c的频率存放在date[65-c+i]中

int n=27;

typedef struct node{

int fa,lchild,rchild,w; //父亲,左孩子,右孩子,权值;

}hfmTree;

char info[30];

typedef struct{

char code[50];

int start;

}Hfmcode;

Hfmcode hfmcode[MAXN]; //哈夫曼编码

hfmTree hfmtree[MAXN]; //哈夫曼树

void inithead(int n,char d[]) ; //初始化表

void initialization(int n,char d[]); //建树

void encoding(int n) ; //编码

void decoding(); //译码

void print() //打印编码代码

2.哈夫曼树的基本操作:

void inithead(int n,char d[]) //初始化表

void initialization(int n,char d[]) //建树

void encoding(int n) //编码

void decoding(); //译码

void print() //打印编码代码

void face() //输出菜单界面

3.主函数

int main()

{

相关文档
最新文档