




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构课程设计报告设计题目 哈夫曼(Huffman)编译码器学院名称 信息工程学院 专 业 班 级 13计本1 姓 名 hhh 学 号 1312219999 目录 一、实验题目-哈夫曼(Huffman)编/译码器 -二、问题描述-三、设计目标-四、需求分析-五、概要设计- 1-系统结构图- 2-各个模块功能的详细描述-6、 详细设计- 1详细代码- a)头文件代码- b)主函数代码- 2系统流程图-七、测试分析-八、使用说明- 1、白盒- 2、黑盒-九、课程设计总结-一 、实验题目 哈夫曼(Huffman)编/译码器二 、问题描述利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编/译码系统。三、设计目标 设计一个程序,该程序可以实现哈夫曼的编码及译码过程。四、需求分析 一个完整的系统应具有以下功能:1) I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值(见下表),建立哈夫曼树,并将它存于文件hfmTree.txt中。2) E:编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件hfmTree.txt中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。3) D:译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。4) P:打印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrin中。 5)T:打印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表 形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中5、 概要设计 1、系统结构功能图 2 各个模块功能的详细描述 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(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)6、 详细设计1 详细代码 a)头文件#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(HuffM 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 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;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(请先载入数据文件。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;bitree* 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;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(temp-lchild);if(head-rchild)head-rchild=destroybt(temp-rchild);free(head);head=NULL;return NULL;void HuffManCoding(bitree *BT, int len,FILE *fp) /哈夫曼树编码 利用 static函数 并写入文件 static int a10;int i;if(g_flaglchild=NULL&BT-rchild=NULL)/printf(字符%c的权值为%d的编码:,BT-dt.ch,BT-dt.frq);fprintf(fp,%ct%dt,BT-dt.ch,BT-dt.frq);for(i=0;ilchild, len+1,fp);alen=1;HuffManCoding(BT-rchild, len+1,fp); int menu()int n;printf(*n);printf(字符集和频度操作:n);printf(t1.载入数据文件。n);printf(t2.显示数据。n);printf(t3.排序。n);printf(哈夫曼树操作:n);printf(t4.建立哈夫曼树。n);printf(t5.写入哈夫曼编码文件。n);printf(t6.显示哈夫曼编码文件。n);printf(t7.销毁哈夫曼树。n);printf(哈夫曼编译码操作:n);printf(t8.载入哈夫曼编码。n);printf(t9.显示哈夫曼编码。n);printf(t10.编码ToBeTran文件.n);printf(t11.译码CodeFile文件.n);printf(t12.打印CodeFile文件.n);printf(t13.打印哈夫曼树.n);printf(t14.退出n);printf(*n);printf(请输入选择:);while(1)scanf(%d,&n);if(n0&n15)break;printf(输入错误,请重输:);system(cls);return n;int printHuffManfile() /输出哈夫曼树 字符 频度 编码FILE * fp;char data50,c;int d;fp=fopen(hfmTree.txt,r);if(NULL=fp)printf(打开文件哈夫曼编码错误。n);return -1;while(1)fscanf(fp,%c%d%s,&c,&d,data);if(feof(fp)break;printf(%ct%dt%sn,c,d,data);fseek(fp,2,SEEK_CUR);fclose(fp);main()mytype dataN=0;HuffM hmdataN=0;int flag;int choose,count;FILE *fp;bitree * bthead=NULL;count=0;g_flag=0;/刚开始时数据为空。while(1)choose=menu();switch(choose)case 1:flag=reaData(data);if(-1=flag)printf(Open data.txt file error!n);return;break;case 2:printData(data);break;case 3:sort(data);break;case 4:bthead=createbt(data);break;case 5:fp=fopen(hfmTree.txt,w+);if(NULL=fp)printf(写入哈夫曼编码错误!n);return;HuffManCoding(bthead,0,fp);g_flag=111;fclose(fp);break;case 6:printHuffManfile();break;case 7:if(g_flag=a&c=A&c=Z)/printf(%s,dc-A+1.code);fprintf(pfc,%s,dc-A+1.code);else if (c= )/printf(%s,d0.code);fprintf(pfc,%s,d0.code);else/printf(%c,c);fprintf(pfc,%c,c);/printf(%c,c);if(feof(fp)break;fclose(fp);fclose(pfc);int Decoding(HuffM d)/编码FILE *fp, *pfc;char data20 = 0 ,c;int i;/, flagfp = fopen(ToBeTran.txt, r);pfc = fopen(TextFile.txt, w+);if (NULL = fp)printf(打开文件ToBeTran.txt出错,译码未完成.n);return -1;if (NULL = pfc)fclose(fp);printf(TextFile.txt出错,译码未完成.n);return -1;while (1)fread(&c, 1, 1, fp);if (c=1 | c=0)/return 1; for(i=0;i27;i+)datai=c;while (strcmp(di.code,data)=0)fprintf(pfc,%c,di.ch);else/printf(%c,c);fprintf(pfc,%c,c);/printf(%c,c);if (feof(fp)break;fclose(fp);fclose(pfc);return 1;void PrintCodeFile()FILE *fc;int flag; char ch;printf(打印编码后的文件:n );fc=fopen(CodeFile.txt, r);if (NULL=fc)printf(打印编码后的文件失败! );exit(0);flag = 1;while (!feof(fc)ch = fgetc(fc);if (ch = -1)printf(结束打印n);else printf(%c, ch);if (flag = 49)flag+;elseflag = 1;printf(n);fclose(fc); /关闭文件int PreOrderPrint(bitree *HT,int count)int n = 2 * (N - 3) - 1, i;if(NULL!=HT)for (i = 0; idt.ch,HT-dt.frq);PreOrderPrint(HT-lchild, +count);PreOrderPrint(HT-rchild, +count);return 1;2 流程图1、 载入数据 2 、hfmTree.txt文件读取数据3、哈夫曼树字符排序 4、建哈夫曼树5、 销毁哈夫曼树 6、哈夫曼树编码 7、译码 8、译码保存 七 、测试分析1、白盒2 黑盒运行结果选择1,载入数据文件 选择2显示数据 选择3,排序 选择2,显示数据选择4建立哈夫曼树,选择5写入哈夫曼编码文件文件,选择6显示哈
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 航天科技行业科研成果统计表
- 2025-2030中医药保健食品行业发展动态与政策导向及商业机会分析报告
- 行业报告快速编写与报告生成模板
- 2025年福建省福州市辅警考试题库(附答案)
- 2025年防雷电安全试题及答案
- 2025年法务考试笔试题目及答案
- 2025年学历类自考学前儿童科学教育-学前特殊儿童教育参考题库含答案解析(5套试卷)
- 2025年学历类自考学前儿童科学教育-外国文学史参考题库含答案解析(5套试卷)
- 2025年中国传统体外人工受精行业市场全景分析及前景机遇研判报告 - 网
- 2025年学历类自考学前儿童发展-网络经济与企业管理参考题库含答案解析(5套试卷)
- 铁路团体车票协议书
- 大众内部购车协议书
- 2025新人教版英语八上单词默写单(先鸟版)
- 语言分析面试题及答案
- 养老护理移乘技能课件
- 授权委托押车协议书
- 物业服务接待课件
- 2025年度专业技术人员继续教育公需科目考试题(附答案)
- 广东2025年03月珠海市市直机关事业单位公开招考合同制职员笔试历年参考题库考点剖析附解题思路及答案详解
- 供应商有效管理方案
- 铝合金门窗安装与质量控制
评论
0/150
提交评论