课程设计哈夫曼编码.doc
《课程设计哈夫曼编码.doc》由会员分享,可在线阅读,更多相关《课程设计哈夫曼编码.doc(29页珍藏版)》请在三一办公上搜索。
1、数据结构课程设计报告设计题目 哈夫曼(Huffman)编译码器学院名称 信息工程学院 专 业 班 级 13计本1 姓 名 hhh 学 号 1312219999 目录 一、实验题目-哈夫曼(Huffman)编/译码器 -二、问题描述-三、设计目标-四、需求分析-五、概要设计- 1-系统结构图- 2-各个模块功能的详细描述-六、 详细设计- 1详细代码- a)头文件代码- b)主函数代码- 2系统流程图-七、测试分析-八、使用说明- 1、白盒- 2、黑盒-九、课程设计总结-一 、实验题目 哈夫曼(Huffman)编/译码器二 、问题描述利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间
2、,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编/译码系统。三、设计目标 设计一个程序,该程序可以实现哈夫曼的编码及译码过程。四、需求分析 一个完整的系统应具有以下功能:1) I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值(见下表),建立哈夫曼树,并将它存于文件hfmTree.txt中。2) E:编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件hfmTree
3、.txt中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。3) D:译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。4) P:打印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrin中。 5)T:打印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表 形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中五、 概要设计 1、系统结构功能图 2 各个模
4、块功能的详细描述 int reaData(mytype d)/载入数据 int reaHFData(HuffM d)/从hfmTree.txt文件读取数据 int printData(mytype d) /数据显示 字符 频度 int printHFData(HuffM d) /显示哈夫曼树 字符 编码 int sort(mytype d)/对数据频度大小排序 建哈夫曼树时调用 int sortHMC(HuffM d)/对哈夫曼树字符排序 译码文件时调用 int sort1(bitree* tempN,int n)/对新的数据重新 频度大小排序 建树时调用 bitree * createbt(
5、mytype d)/建哈夫曼树 bitree * destroybt(bitree * head)/销毁哈夫曼树,释放空间 递归调用 void HuffManCoding(bitree *BT, int len,FILE *fp) /哈夫曼树编码 利用 static函数 并写入文件 int printHuffManfile() /输出哈夫曼树 字符 频度 编码 int Encoding(HuffM d)/编码 int Decoding(HuffM d)/编码 void PrintCodeFile() void PreOrderPrint(bitree *HT)六、 详细设计1 详细代码 a)头
6、文件#include stdio.h #include string.h#define N 30typedef struct hmchar ch;char code20;HuffM;typedef struct schar ch;int frq;mytype;typedef struct btstruct bt *lchild;mytype dt;struct bt *rchild;bitree;int g_flag=0;int Encoding(HuffM d);int PreOrderPrint(bitree *HT);void PrintCodeFile();int Decoding(H
7、uffM d); b)主函数#include myhead.hint reaData(mytype d)/载入数据FILE * fp;int i=0;fp=fopen(data.txt,r);if(NULL=fp)return -1;while(!feof(fp)fscanf(fp,%c,&(di.ch);fscanf(fp,%d,&(di.frq);fseek(fp,2,SEEK_CUR);i+;if(i=N-2)break;g_flag=1;fclose(fp);return 0;int reaHFData(HuffM d)/从hfmTree.txt文件读取数据FILE * fp;int
8、i=0,td;char c,data20;fp=fopen(hfmTree.txt,r);if(NULL=fp)printf(打开哈夫曼编码数据文件出错。n);return -1;while(1)fscanf(fp,%c%d%s,&c,&td,data);if(feof(fp)break;/printf(%ct%dt%sn,c,td,data);di.ch=c;strcpy(di.code,data);i+;fseek(fp,2,SEEK_CUR);=g_flag=1;fclose(fp);return 0;int printData(mytype d) /数据显示 字符 频度int i=0;
9、if(g_flag1)printf(请先载入数据文件。n);return 0;for(;iN-3;i+)printf(%ct%dn,di.ch,di.frq);return 0;int printHFData(HuffM d) /显示哈夫曼树 字符 编码int i=0;if(g_flag1)printf(请先载入数据文件。n);return 0;for(;iN-3;i+)printf(%ct%sn,di.ch,di.code);return 0;int sort(mytype d)/对数据频度大小排序 建哈夫曼树时调用int i,j;mytype temp;if(g_flag1)printf(
10、请先载入数据文件。n);return 0;for(i=0;iN-4;i+)for(j=0;jdj+1.frq)temp=dj;dj=dj+1;dj+1=temp;int sortHMC(HuffM d)/对哈夫曼树字符排序 译码文件时调用int i,j;HuffM temp;if(g_flag1)printf(请先载入数据文件。n);return 0;for(i=0;iN-4;i+)for(j=0;jdj+1.ch)temp=dj;dj=dj+1;dj+1=temp;int sort1(bitree* tempN,int n)/对新的数据重新 频度大小排序 建树时调用int i,j;bitre
11、e* tmp;for(i=0;in-1;i+)for(j=0;jdt.frqtempN-3-n+j+1-dt.frq)tmp=tempN-3-n+j;tempN-3-n+j=tempN-3-n+j+1;tempN-3-n+j+1=tmp;bitree * createbt(mytype d)/建哈夫曼树bitree* head=NULL;bitree* tempN=NULL;int i=0;if(g_flag1)printf(请先载入数据文件。n);return 0;sort(d);while(idt=di;tempi-lchild=NULL;tempi-rchild=NULL;i+;i=0;
12、while(idt.ch=*;head-dt.frq=tempi-dt.frq + tempi+1-dt.frq;head-lchild=tempi;head-rchild=tempi+1;tempi+1=head;tempi=NULL;sort1(temp,N-i-4);i+;g_flag = 11;return head;bitree * destroybt(bitree * head)/销毁哈夫曼树,释放空间 递归调用bitree *temp;if(head=NULL)return NULL;temp=head;if(head-lchild)head-lchild=destroybt(t
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 哈夫曼 编码
链接地址:https://www.31ppt.com/p-4297277.html