1、1数据结构课程设计设 计 说 明 书(题目)哈夫曼编译器起止日期: 2011 年 6 月 20 日 至 2011 年 6 月 27 日学 生 姓 名班 级学 号成 绩指 导 教 师 (签 字 )计算机与通信学院2011 年 6 月 23 日一、课题任务与说明1编辑一个哈夫曼编译器系统程序2问题描述设某编码系统共有 n 个字符,使用频率分别为w 1,w2,wn,设计一个不等长编码方案,使得该编码系统的空间效率最好。3.所具有的功能:(1) 为一字符文本编码功能:将一字符文本复制到指定的文本中,并保存到指定路径,让程序自动为它编码。2(2) 为部分字符编码功能:输入部分字符与对应的字符频率,让程序
2、为之编码(需注意输入格式) 。(3) 保存输出到文本功能:将编码结果输出到文本。(4) 输出保存文本信息功能:将功能 3 保存的文本信息输出到屏幕上,用于查看结果是否正确。4.设计要求(1)设计数据结构;(2)设计编码算法;(3)分析时间复杂度和空间复杂度。(4)字符和频度如下:字符 空格 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z频度 186 64 13 22 32 103 21 15 47 57 1 2 32 20 57 63 15 1 48 51 80 23 8 18 1 165.设计内容与步骤(1)选择合适的数据结构(2)结点
3、结构的设计(3)算法设计与分析(4)程序设计、实现、调试(5)课程设计说明书6.设计工作计划与进度安排(1)设计工作 4 学时(2)实现与调试 16 学时(3)课程设计说明书 4 学时二、算法设计Huffman 编码是一种可变长编码方式,是由美国数学家 David Huffman 创立的,是二叉树的一种特殊转化形式。编码的原理是:将使用次数多的代码转换成长度较短的代码,而使用次数少的可以使用较长的编码,并且保持编码的唯一可解性。Huffman 算法的最根本的原则是:累计的(字符的统计数字*字符的编码长度)为最小,也就是权值(字符的统计数字*字符的编码长度)的和最小。三、程序的功能设计3为实现系
4、统功能,本程序主要分为五个模块。它们分别为:1.初始化功能模块此功能模块的功能为从键盘接收字符集大小 n,以及 n 各字符和 n 个权值。2.建立哈弗曼树的功能模块此模块功能为使用 1 中或从一文本中得到的数据按照教材的构造哈夫曼树的算法构造哈夫曼树。3.建立哈夫曼编码与译码的功能模块此模块功能为读入相关的字符信息进行哈夫曼编码,并将译码结果输出,在必要时也可保存到文件中。其中各个函数的功能分别如下:notesave 函数用于保存输出的结果;hfmtree 函数用于建立结点哈夫曼树并输出最终结果;readnote 函数用于读取目标文本字符信息;4.流程图:四、函数编码及调试由于本人能力有限难免
5、不会在编码与调试过程中遇到这样或那样的问题,但通过长时间的改正,查询资料与询问,终于能将出现一些致命错误得以修正。例如:在输入编码结果信息时由于少了一个很不明显的 Getchar()的接收 Enter 的函数,后面的就全乱了使程序出现了不能达到意料之中的效果。还有先是运行完一个函数后就跳出了整个运行程序不能再继续,后来通过查阅界面结束main()Hfmtree() Exit()Readnote()Notesave() Main()4书籍,明白再主函数中加一个 For 语句就可以避免这一问题。第三个问题就是由于调用完一个函数后显示的信息还是留在运行界面,但它们的确有没什么用且占用界面,不美观,后
6、来通过询问同学得知,在每个要调用的函数后加一个 system(“cls“)语句就可达到清除上屏信息的功能。五、总结该程序主要用于哈夫曼编码,并在必要时保存数据。做法主要是用一个主函数 MAIN,用它达到显示欢迎界面,提示选择操作与调用其它函数功能(用到 Switch 函数) ,这样使得程序简单,易读,运行效果也好。但由于能力有限,该程序在时间与空间复杂度上有待作改正。参考文献:(1) 刘振鹏、张小莉等编著;数据结构(第二版).中国铁道出版社。(2) 石强、罗文浩等编著;数据结果习题解答与实验指导(第二版).中国铁道出版社。(3) 刘克成 主编;C 语言程序设计.中国铁道出版社。附全部代码(正常
7、运行 VC+6.0):#include#include#include#include#define MAXLEAF 27#define MAXNODE MAXLEAF*2-1#define MAXBIT 25#define MAXVALUE 20005#define H “tt =n“typedef structint parent;int weight;int lchild;int rchild;hfm_n;typedef structint bitMAXBIT;int start;hfm_c;void notesave(int n,char a,hfm_c hfm_code)FILE *
8、fp;int i=0,j;char c;if(fp=fopen(“d:notesave.txt“,“w“)=NULL)printf(“n Cannot open file!n“);getchar();exit(1);for(i=0;i“,fp);6for(j=hfm_codei.start+1;j“);for(i=0,c=0;i“,ai);for(j=hfm_codei.start+1;j路径 D: notesave (y/n)?“);ch1=getchar();getchar();if(ch1=y|ch1=Y)notesave(n,a,hfm_code);return NULL;int re
9、adnote()FILE *fp;int i,j,b26,s26,k;char a26,ch,ch1=n;memset(b,0,sizeof(b);if(fp=fopen(“d:note.txt“,“r“)=NULL)printf(“n Cannot open the file of note!“);printf(“n Please creat a new text!n“);10ch1=y;if(ch1=y)printf(“n 此功能你要做的只是将要编码的字符文本复制到下面文本并将它命名为 note 并 n 保存到-D:.n 需注意的是一定要是字符文本且文本保存路径是 D 盘下.n “);sy
10、stem(“notepad“);printf(“n 保存好文本后,请按任意键继续“);getchar();if(fp=fopen(“d:note.txt“,“r“)=NULL)printf(“n Open files fail!“);getchar();exit(1);while(ch=fgetc(fp)!=EOF)if(sizeof(ch)!=1) break;k=int(ch);if(k=65 j+;if(j%6=0) printf(“n“);hfmtree(j,a,s);return 1;void main()int i,h,n=0,b26;char a26,c30,ch,ch1;for
11、(;)printf(“nnntt n“);printf(“tt =* * * * * * * * * * * * * *=n“);printf(“tt =*欢迎使用本哈夫曼编码系统 !*输入格式应为: 字符+空格n =例如:a b c.n =对应的字符频率格式也应如此.n“);doprintf(“n 请输入叶子结点个数:“);if(scanf(“%d“,printf(“n Input worry!n Please input again.n“);else ch=n;getchar();13while(ch=s);doprintf(“n =请输入相应个字符:“);for(i=0;in;i+)ai
12、=getchar();ch1=getchar();if(ch1!=n) gets(c);printf(“n 请输入相应字符对应的频率:“);for(i=0;in;i+)scanf(“%d“,ch1=getchar();if(ch1!=n) gets(c);printf(“n 确认所有数据无误后请按Enter(否则按y)“);ch=getchar();while(ch=y|ch=Y);hfmtree(n,a,b);break;case 3: printf(“nnn“);printf(H);printf(“tttt 1 欢迎下次使用1n“);printf(H);printf(“tt“);return;case 4: printf(“nNotesave 中的信息:n“);system(“type d:notesave.txt“);break;default: printf(“tt a 输入有误!t“);getchar();break;printf(“n “);system(“pause“);14system(“cls“);