数据结构课程设计报告
赫哈曼编码的应用
课
姓
学
题:
名:
号:
专业班级:
指导教师:
孙叶枫
设计时间:
评阅意见:
评定成绩:
指导老师签名:
年 月 日
1
目
录
一、需求分析………………………………………3
二、设计原理与概要………………………………4
三、程序流程图…………………………………....6
四、程序源代码……………………………………8
五、运行结果与验证...............................................14
六、设计总结……………………………………....16
七、参考文献………………………………………17
2
第一部分 需求分析
本设计要求是对输入的一串字符实现赫夫曼编码,再对赫夫曼编码生成的代
码串进行译码,输出电文字符串。
在当今信息爆炸的时代,如何采用有效的数据压缩技术节省数据文件的存储
空间和计算机网络的传送时间已越来越引起人们的重视,赫夫曼编码正是一种应
用广泛且非常有效的数据压缩技术。
赫夫曼编码的应用很广泛,如在音乐、电影、摄影、通信等领域都有它应用
的身影,存储、分析、加工、处理是它们制作的第二阶段,怎样使制作出来的作
品质量最好、体积最少,是关系产品受到青睐的原因之一。体积的大小也就是它
所占据存储空间,在保证文件质量最好,又有效的节省存储空间,需要用最好的
压缩存储解码算法,而赫夫曼编码是一种将信息转换成二进制编码有效的方法之
一,赫夫曼编码是利用赫夫曼树求得的用于通信的二进制编码。而这次我们的课
程设计对编码译码的要求不是太高,只是将大写字母或小写字母转化成二进制编
码,或将二进编码转化成大写字母或小写字母,虽然功能有一点局限,但也是一
次成功的尝试,能满足一般的需求。
根据设计要求和分析,要实现本设计,必须实现以下几个方面的功能:
(1) 赫夫曼树的建立;
(2) 赫夫曼的编码生成;
(1) 编码文件的译码;
3
二 设计原理与概要
树中从根到每个叶子都有一条路径,对路径上的个分支约定:指向左子树的
分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”
的序列作为和各个叶子对应的字符编码,这就是赫夫曼编码。
通常我们把数据压缩的过程称为编码,解压缩的过程就是解码。电报通信是
传递文字的二进制形式的字符串。但在信息传递时,总希望长度尽可能短,即采
用最短码。假设每种字符在电文中出现的次数为 Wi,编码的长度为 Li,电文中
有 n 种字符,则电文编码的总长度为ΣWiLi,若将此对应到二叉树上,Wi 为叶结
点的权,Li 为根结点到叶结点的路径长度。那么,ΣwiLi 恰好为二叉树上带权
路径的长度。
#define n 100
#define m 2*n-1
typedef struct
{
char ch;
char bits[9];
int len;
}CodeNode;
//叶子结点数
//赫夫曼树中结点总数
//存放编码位串
//编码长度
typedef CodeNode HuffmanCode[n+1];
typedef struct
{ int weight;
//权值
int lchild,rchild,parent;
//左右孩子及双亲指针
}HTNode;
//树中结点类型
typedef HTNode HuffmanTree[m+1];
//0 号单元不用
4
定义各种变量
输入需要编码的字符串(为大写或小写)
统计字符的种类及各种字符出现的频率
建立赫夫曼树
生成赫夫曼编码
建立各种字符的赫夫曼编码及编码文件
从文件中读编码文件译码
输出译码后的字符串
总流程 图(1)
5
建立正文的编码文件的流图
Int
i,j;
FILE b*fp;
真
For
i=1
to num
*str
假
真
假
HC[i].ch==*str
For j=0 to HC[i].len
Fputc(HC[i].bits[j],fp)
j++
break++
str++
for
i=1
to
num
输出 HC[i].ch 和 HC[i].bits
i++
fclose(fp)
图 (2)
6
代码文件的译码:
FILE *fp,
char str[254]; char *p;
static char cd[n+1];
int i, j, k=0, cjs
fp=fopen(“codefile.txt”,”r”)
feof (fp)
假
真
Cjs=0
For i=0 to
i
四、部分程序源代码
//(1)类型及相关变量定义(type6.h)
#include
#include
#define n 100
#define m 2*n-1
typedef struct
{
//叶子结点数
//赫夫曼树中结点总数
char ch;
char bits[9];
int len;
//存放编码位串
//编码长度
}CodeNode;
typedef CodeNode HuffmanCode[n+1];
typedef struct
{ int weight;
//权值
int lchild,rchild,parent;
//左右孩子及双亲指针
}HTNode;
//树中结点类型
typedef HTNode HuffmanTree[m+1];
int num;
//0 号单元不用
//建立赫夫曼树
void ChuffmanTree(HuffmanTree HT,HuffmanCode HC,int cnt[],char str[])
{
int i,s1,s2;
for(i=1;i<=2*num-1;i++)
{
HT[i].lchild=0;HT[i].rchild=0;
HT[i].parent=0;HT[i].weight=0;
//初始化 HT
}
8