数据结构课程设计报告——哈夫曼编译码器.doc
《数据结构课程设计报告——哈夫曼编译码器.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计报告——哈夫曼编译码器.doc(22页珍藏版)》请在三一办公上搜索。
1、数据结构课程设计报告专业班级:信息0802姓名:赵思宇学号:0909081029指导老师:李登日期:2010年7月一、实验内容 哈夫曼编/译码器利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼编/译码系统。一个完整的系统应具有以下功能:(1)I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件h
2、fmTree中。(2)E:编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。(3)D:译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。(4)P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码写入文件CodePrint中。(5)T:印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此
3、字符形式的哈夫曼树写入文件TreePrint中。二、实验目的 学习数据结构与算法的最终目的是解决实际的应用问题,特别是非数值计算类型的应用问题。本课程设计要求同学独立完成一个较为完整的应用需求分析,在完成设计和编程大型作业的过程中,深化对数据结构与算法课程中基本概念、理论和方法的理解;训练综合运用所学知识处理实际问题的能力,使同学的程序设计与调试水平有一个明显的提高。三、实验思想及分析一个完整的系统应具有以下功能:n I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立赫夫曼树,并将它存于文件hfmTree中。 对赫夫曼树初始化。 根据书本算法6.1
4、2,对树进行从叶子到根的逆向求每个字符的赫夫曼编码。 更新赫夫曼树,并存到hfmTree.txt中。算法6.12流程图如下:开始传入参数:结点个数nI=n? NY动态分配内存,声明哈夫曼树HT,并对其值进行初始化建哈夫曼树,依次在HT1.i-1中Select parent为0且weight最小的两个结点分配n个字符编码的头指针向量和求编码的工作区间从叶子到根逆向逐个字符求哈夫曼编码释放工作空间结束图1 算法6.12流程图n E:编码(Encoding)。利用已建好的哈夫曼树,对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。 将终端输入须要编码的语句逐字在已建好的赫
5、夫曼树中查找。 当在树中找到相匹配字符时,将该字符对应的赫夫曼编码用strcat()统一存到code数组。最后将code数组中的编码在终端输出并存储到CodeFile.txt中。n D:译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件Textfile中。 从CodeFile.txt中获取须要译码的编码组。 将编码逐一读入,并在赫夫曼中根据左0右1去查找字符。 将译好的语句在终端输出,并存至Textfile.txt中。n P:打印表(TreePrint)。将已建立好的赫夫曼树的存储情况在终端以表格的形式罗列出来,使树的调用看起来更直观。n T:打
6、印图(TreePrint)。将已建好的赫夫曼树以直观的图形在终端输出。 根据树的先序遍历算法,依次访问各个结点。 根据P打印出来的表,分析其所在的层次。 根据层次的大小,在终端输出相应长度的长条,来完成凹入表的输出。四、程序代码:#include #include#includetypedef struct char elem; int weight; int parent,lchild,rchild; HTNode,*HuffmanTree; /动态分配数组存储赫夫曼树typedef char *HuffmanCode; /动态分配数组存储赫夫曼树编码表void Initialization
7、();void Encoding();void Decoding();void HuffmanCoding(int); void Select(int,int *,int *); void PrintHufmFigue();void putout(int,int);void Turn(int,void(* Visit)(int,int);void TreePrint();/-全局函数- int ipt=1,n,q,p=0,code_num=0,TempLen=0,diamonds,lay;int w1=100000,w2=100000,w3=100000;HuffmanCode HC=NULL
8、; HuffmanTree HT;int main()char key;system(color FC);printf( n);printf( 赫夫曼编/译码器 n);printf( n);printf( 08信息 赵思宇 n);printf( n);doprintf(nnn);printf( n);printf( 操作菜单 n);printf( n);printf( I:初始化 (Initialization ) n);printf( E:编 码 (Encoding ) n);printf( D:译 码 (Decoding ) n);printf( P:打印表 (PrintHufmFigue
9、 ) n);printf( T:打印图 (TreePrint ) n);printf( Q:退 出 (Initialization ) n);printf( n);printf( n);printf(nn);printf(Please Enter a key of the operation:);scanf(%c,&key);getchar();switch(key)case i:case I:Initialization();break;case e:case E:Encoding();break;case d:case D:Decoding();break;case p:case P:Pr
10、intHufmFigue();break;case t:case T:TreePrint();while(key!=q&key!=Q);return 1;/* 函数功能:建立赫夫曼树并对其进行初始化。函数参数:FILE *FhfmTreeP,将赫夫曼树的相关信息保存于此hfmTree.TXT中。函数实现:实现了字符集和频度的实际统计,并可将信息保存到hfmTree.TXT中。函数返回值:无*/void Initialization()int i,m;char style= ,0;printf(Please input the number of Node: ); scanf(%d,&n); g
11、etchar();m=2*n-1; HT=(HuffmanTree)malloc(m+1)*sizeof(HTNode); /0号单元未用for(i=1;i=n;i+) printf(Input characters and weight(just like a 30Enter):); scanf(%c%d,&HTi.elem,&HTi.weight);getchar();HTi.parent=HTi.lchild=HTi.rchild=0; HuffmanCoding(n);FILE* FhfmTreeP=NULL;if(NULL=(FhfmTreeP=fopen(E:hfmTree.txt
12、,w)printf(Open hfmTree.txt failed!n);elsefor(i=1;i0),构造赫夫曼树HT,并求出m=2*n-1; n个字符的赫夫曼编码HC。*/for(i=n+1;i=m;+i) HTi.elem=0; HTi.weight=HTi.parent=HTi.lchild=HTi.rchild=0; for(i=n+1;i=m;+i) /建赫夫曼树Select(i-1,&s1,&s2); /*在HT1.i-1选择parent为0HTs1.parent=i;HTs2.parent=i; 且weight最小的两个结点,其.HTi.lchild=s1;HTi.rchil
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 哈夫曼编 译码器
链接地址:https://www.31ppt.com/p-2396891.html