《哈夫曼编码译码课程设计》报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机与信息工程系
《实践环节名称》报告
专业:计算机科学与技术
班级:********
学号:*********
姓名:***
报告完成日期:2011/6/10
指导教师:***
评语:
成绩:
批阅教师签名:批阅时间:
目录
1.问题描述 (1)
2.基本要求 (1)
3.数据结构 (1)
4.总体设计 (1)
5.详细设计 (2)
5.1主函数 void main() (2)
5.2建立文件 void jianliwenjian() (3)
5.3输入原文 void luruyuanwen() (4)
5.4创建哈夫曼树 void chuangjian() (5)
5.5编码 void bianma() (6)
5.6对哈夫曼码译码 void yiwen() (7)
5.7保存译文 void baocunyiwen() (8)
5.8输出原文 void duquyuanwen() (9)
5.9输出原文编码void duqubianma() (10)
5.10输出译文 void duquyiwen() (11)
6.测试与调试 (11)
7.源程序清单 (8)
8.实验心得 (28)
1.问题描述
打开一篇英文文章,统计该文章中每个字符出现的次数,然后以它们作为权值,设计一个哈夫曼编/译码系统。
2.基本要求
以每个字符出现的次数为权值,建立哈夫曼树,求出哈夫曼编码,对文件yuanwen 中的正文进行编码,将结果存到文件yiwen中,再对文件yiwen中的代码进行译码,结果存到textfile中。
3.数据结构
char CH[N]; //记录原文字符数组
char YW[N]; //记录译文字符数组
typedef char * Hcode[m+1]; //存放哈夫曼字符编码串的头指针的数组
typedef struct
{
char a;
int num;
}dangenode; //记录单个字符的类别和出现的次数
typedef struct
{
dangenode b[m];
int tag;
}jilunode; //统计原文出现的字符种类和数量
typedef struct node //静态三叉的哈夫曼树的定义
{
int weight; //结点的权值
int parent; //双亲的下标
int Lchild; //左孩子结点的下标
int Rchild; //右孩子结点的下标
}htnode,hn[M+1]; // hn是结构数组类型,0号单元不用
4.总体设计
功能函数模块划分
void main() //主函数
void jianliwenjian() //建立存储原文的文件yuanwen
void luruyuanwen() //通过程序录入原文到文件yuanwen中
void min_2(hn ht,int n,int *tag1,int *tag2) //选择权值较小的两个结点
void chuangjian(jilunode * jilu,hn ht) //建立哈夫曼树
void bianma(jilunode * jilu,hn ht,Hcode hc,int n) //对原文进行编码
void bianmabaocun(Hcode hc,jilunode * jilu) //保存编码在文件yiwen中
void yiwen(Hcode hc,jilunode * jilu) //读取yiwen中的编码,并将其翻译为原文
void baocunyiwen() //将翻译的译文保存到文件textfile中
void duqubianma() //在编码文件yiwen中读取编码
5.详细设计
5.1主函数void main()
5.2建立文件void jianliwenjian()
首先,要建立一个文件来存储原文,在这里文件的名称按要求默认为yuanwen,文件建立时有可能成功,有可能失败,建立失败时输出“Cannot open file”,成功后会提示:“文件已建立,名称为yuanwen”。
5.3输入原文void luruyuanwen()
输入原文时首先要打开原文件,成功打开文件后逐个读取输入的字符存放到文件中,直到遇到结束标志‘^’,然后关闭文件。
5.4创建哈夫曼树void chuangjian()
打开存储原文的文件yuanwen,将字符逐个读出,然后统计字符的种类,类别和数量,最后建立静态的三叉链表来建立哈夫曼树,树中的叶子结点对应出现的个字符。
5.5编码void bianma()
该函数实现对哈夫曼树的编码,先申请一个能存储字符编码的临时空间cd,编码从哈夫曼树的叶子结点开始,寻找其父母结点,然后根据父母结点判断孩子结点的左右位置,左边置1,右边置0,并将1,0这样的字符从后往前逆序存放在cd中,每求得一个叶子结点的编码,就将其复制到存储哈夫曼编码的头指正数组中,找完叶子结点的编码后就释放临时空间cd。
5.6对哈夫曼码译码void yiwen()
打开文件yiwen,打开成功后,逐个读取存放在里边的编码字符,并与先前的编码相匹配,直到找到编码对应的原字符,当找完编码后就关闭文件。