数据结构 哈弗曼编码译码器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件学院
课程设计报告书
课程名称数据结构
设计题目哈弗曼编码译码器
专业班级软件09-5班
学号 0920010508 姓名康文强
指导教师孙宁
2010年12月
1 设计时间 (4)
2 设计目的 (4)
3设计任务 (4)
4 设计内容 (4)
4.11程序所要实现的功能 (4)
4.12输入形式和输入值的范围 (4)
4.13 输出形式 (4)
4.14测试数据 (4)
4.2总体设计 (6)
4.21抽象数据类型 (6)
4.22主程序流程 (7)
4.23各程序模块之间层次(调用)关系 (7)
4.3 详细介绍 (8)
4.31数据类型的实现 (8)
4.32主程序和其他主要函数的伪码 (8)
4.33各函数之间的调用关系 (8)
4.4测试与分析 (13)
4.41测试 (13)
4.42时间和空间复杂度分析和改进设想 (14)
4.5 附录(原代码及必要注释) (14)
5 总结与展望 (19)
参考文献 (21)
成绩评定 (21)
1 设计时间
2010年12月27日到2010年12月31日
2 设计目的
要求学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C程序并上机调试的基本方法。这对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。
3设计任务
从键盘输入一串电文字符能输出对应的哈夫曼编码。同时,能翻译由哈夫曼编码生成的代码串,输出相应的电文字符串。
设计要求:
(1)从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树及哈夫曼编码。
(2)利用已经建好的哈夫曼树,对输入的字符串进行编码,输出编码序列。
(3)利用已建好的哈夫曼树对输入的二进制编码进行译码,并输出结果。
4 设计内容
4.11程序所要实现的功能
从键盘输入一串电文字符能输出对应的哈夫曼编码。同时,能翻译由哈夫曼编码生成的代码串,输出相应的电文字符串。
4.12输入形式和输入值的范围
输入形式及范围为a到z的字符和整型的常量。
4.13 输出形式
输出形式为二进制形式的字符串。
4.14测试数据
正确的测试结果
错误的测试结果
4.2总体设计
4.21抽象数据类型
ADT Hfmantree{
数据对象:存储具有相同类型的数据
数据关系:每个结点除了更结点外都有一个前驱和后继,最后的结成为叶子节点,没有去、后继。
基本操作create(h);创建一颗赫夫曼树
}
4.22主程序流程
①输需要编码的字符串
②键入每个字符的权值,并构建一颗赫夫曼树
③对输入的对应相应权值的字符进行编码
④对应编码再进行译码
4.23各程序模块之间层次(调用)关系
①void Select(Hfmantree HT,int n,int*s1,int*s2)
②int Huffmancoding(Hfmantree *HT,HuffmanCode *HC,int*w,int n,char*z)
③void translate(Hfmantree HT,int n)
①
②
③
main
退出
4.3 详细介绍
4.31数据类型的实现
构建赫夫曼树的结点
typedef struct
{
char mail;
int weight;
int parent,lchild,rchild;
}HTnode,*Hfmantree;
typedef char**HuffmanCode;
4.32主程序和其他主要函数的伪码
4.33各函数之间的调用关系
超找两个权值最小的结点
void Select(Hfmantree HT,int n,int*s1,int*s2)
{
int i,j;
for(i = 1;i <= n;i++)
if(!HT[i].parent){*s1 = i;break;}
for(j = i+1;j <= n;j++)
if(!HT[j].parent){*s2 = j;break;}
for(i = 1;i <= n;i++)
if((HT[*s1].weight>HT[i].weight)&&(!HT[i].parent)&&(s2!=&i))*s1=i;
for(j = 1;j <= n;j++)
if((HT[* s2].weight>HT[j].weight)&&(!HT[j].parent)&&(*s1!=j))*s2=j;
}
对存在的一个赫夫曼树进行编码
Huffmancoding(Hfmantree *HT,HuffmanCode *HC,int*w,int n,char*z)
{
int m,i,s1,s2,c,start;
char f,*cd;
if(n<=1)return 0;
m=2*n-1;
*HT=(Hfmantree)malloc((m+1)*sizeof(HTnode));
for (i=1; i<=n; i++)
{
(*HT)[i].weight=w[i-1];
(*HT)[i].mail=z[i-1];
(*HT)[i].parent=0;
(*HT)[i].lchild=0;
(*HT)[i].rchild=0;
}
for (i=n+1; i<=m; i++)