仲 恺 农 业 工 程 学 院
课 程 设 计 报 告
课程名称: 数据结构
院 (系): 信息科学与技术学院
专业班级:
号:
学
名:
姓
指导老师:
1
承诺书
郑重声明:本人所呈交的课程设计是本人在导师指导下独立撰写并完成的,课程设
计没有剽窃、抄袭、造假等违反学术道德、学术规范和侵权行为。本课程设计不包含任
何其他个人或集体已经发表或撰写过的研究成果,如果引用则标识出了出处。对本课程
设计的研究做出贡献的个人和集体,均已在文中以明确方式标明。
课程设计与资料若有不实之处,本人承担一切相关责任。特此声明。
签名:
年
月 日
2
目 录
一 . 需 求 分 析 ................................... 4
1 . 问 题 描 述 ....................................... 4
2 . 功 能 要 求 ....................................... 4
二 . 系 统 总 框 图 和 功 能 模 块 说 明 ... 5
1 . 系 统 总 框 图 ................................... 5
2 . 功 能 模 块 说 明 ............................... 5
2 . 功 能 模 块 说 明 ............................... 5
3 . 系 统 设 计 ....................................... 5
3 . 1 主 要 链 表 .................................... 5
3 . 2 主 要 功 能 函 数 ............................ 7
3 . 3 关 键 函 数 的 流 程 图 .................... 7
4 . 系 统 调 试 : ................................. 1 0
5 . 总 结 ............................................. 1 4
6 . 源 程 序 : ..................................... 1 4
3
一.需求分析
1.问题描述
哈夫曼编/译码器
利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,
这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信
息收发站写一个哈夫曼编/译码系统。
2.功能要求
I:初始化(Initialization)。从终端读入字符集大小 n,以及 n 个字符和 n 个权值,建立哈夫曼
树,并将它存于文件 hfmTree 中。
E:编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件 htmTree 中读入),对文件
ToBeTran 中的正文进行编码,然后将结果存入文件 CodeFile 中。
D:译码(Decoding)。利用已建好的哈夫曼树将文件 CodeFile 中的代码进行译码,结果存入文件
TextFile 中。
P:印代码文件(Print)。将文件 CodeFile 以紧凑格式显示在终端上,每行 50 个代码。同时将此字
符形式的编码写入文件 CodePrint 中。
T:印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示
在终端上,同时将此字符形式的哈夫曼树写入文件 TreePrint 中。
4
二.系统总框图和功能模块说明
1.系统总框图
哈夫曼编/译码器
印
代
码
文
件
印
哈
夫
曼
树
建
立
哈
夫
曼
树
对
代
码
进
行
译
码
对
文
件
中
正
文
进
行
编
码
图 1. 系统总框图
2.功能模块说明
(1).初始化;
Initialization(LiHTNode *&ht);
(2).编码;
Encoding(LiHTNode *&ht,LeafCode *&lc);
(3).译码;
Decoding(LeafCode *&lc);
(4).印代码模块; Print();
(5).印哈夫曼树。 Tree_Printing(LiHTNode *&ht);
3.系统设计
3.1 主要链表
struct LiHTNode
//用于建立哈夫曼树
{
char data;
double weight;
char code;
//节点
//权值
//编码
5
LiHTNode *parent;
LiHTNode *lchild;
LiHTNode *rchild;
};
存储结构如图所示
//双亲
//左孩子
//右孩子
parent
code
weight
data
lchild
rchild
图 2. 哈夫曼树节点存储结构
struct LeafCode
//用于存储叶子节点和哈夫曼编码
{
};
char leaf;
//叶子
char code[N];
//叶子到根节点的编码串
int top;
//栈顶指针
LeafCode *next;
存储结构如图所示
Leaf
code[N]
top
图 3. 叶子哈夫曼编码存储结构
6
3.2 主要功能函数
Initialization(LiHTNode *&ht)
//初始化
Encoding(LiHTNode *&ht,LeafCode *&lc)
//编码
Decoding(LeafCode
*&lc)
Print()
//译码
Tree_Printing(LiHTNode *&ht)
3.3 关键函数的流程图
//印代码模块
//印哈夫曼树
(1). Initialization(LiHTNode *&ht)
//初始化
开始
存入 ASCLL 码和各字
符权重,字符集大小 n
设置为 128
创建哈夫曼树
存 入 文 件
htmTree
结束
7
(2). Encoding(LiHTNode *&ht,LeafCode *&lc)
//编码
图 4. 初始化
开始
文
对
件
ToBeTran 中 正
将 结 果 存 入 文 件
CodeFile 中
结束
图 5. 编码
(3). Decoding(LeafCode *&lc)
//译码
开始
利用已建好的哈夫曼树
将 文 件 CodeFile 中 的
代码进行译码
结 果 存 入 文 件
结束
8