哈夫曼编码译码(数据结构课程设计)

本文详细介绍了如何设计一个哈夫曼编码和译码系统,包括需求分析、概要设计和详细设计。首先,阐述了哈夫曼树的构造、权值最小结点选择、编码和译码的基本流程。接着,详细描述了存储结构设计,如哈夫曼树节点的定义以及哈夫曼编码的存储方式。最后,提供了各个功能算法的设计,包括构造哈夫曼树、选择权值最小结点、生成哈夫曼编码、编码和译码的实现方法。
摘要由CSDN通过智能技术生成

1.需求分析

1.1问题描述

设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。

1.2 基本要求

将权值数据存放在数据文件(文件名为data.txt,位于执行程序的当前目录中

分别采用动态和静态存储结构

初始化:键盘输入字符集大小nn个字符和n个权值,建立哈夫曼树;

编码:利用建好的哈夫曼树生成哈夫曼编码;

输出编码;

设字符集及频度如下表:

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

频度 186 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.3进一步完成内容

译码功能;

显示哈夫曼树;

界面设计的优化。

2.概要设计

2.1存储结构设计

typedef struct HTNode{

char c;

int weight;

int parent,lchild,rchild;

}HTNode,*HuffmanTree;

定义一个结构体表示哈夫曼树,结构体中包括输入的字符、该字符的权值,以及结点的双亲、左孩子、右孩子的下标变量。将哈夫曼树的各结点存储在由HuffmanTree定义的动态分配的数组中。

typedef char **HuffmanCode;

由于每个哈夫曼编码是变长编码,使用一个指针数组来存放每个字符编码串的首地址,各字符的哈夫曼编码存储在由HuffmanCode定义的动态分配的数组HC中,数组的0号单元不使用,从1号单元开始使用。

2.2功能算法设计

基于VC++6.0,注意:用的是邻接表而非邻接多重表,如果老师比较严格就不要用这份了,如果出错就找到c_file文件重新加载就可以了 基于哈夫曼(Huffmen)编码的通信系统的设计与实现 【问题描述】 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传输数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼的编/译码系统。 【基本要求】 一个完整的系统应具有以下功能: 1.I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。 2.E:编码Encoding)。利用以建好的哈夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。 3.D:译码(Decoding)。利用已经建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。 4.P:打印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码,同时将此字符形式的编码写入文件CodePrint中。 5.T:打印哈夫曼树(Tree printing)。将已经在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值