




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数学与计算机学院 数据结构 实验报告年级 大二 学号* 姓名 * 成绩 专业 电气信息类(计算机) 实验地点 主楼402 指导教师 实验项目 实验日期 2010年11月20日 一、实验目的和要求通过对简单哈夫曼编/译码系统的设计与实现来熟练掌握树型结构在实际问题中的应用。此实验可以作为综合实验,阶段性实验时可以选择其中的几个功能来设计和实现。2、 问题描述利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发编写一个哈夫曼码的编/译码系统。3、 数据结构设计1、构造哈夫曼树时使用静态链表作为哈夫曼树的存储。在构造哈夫曼树时,设计一个结构体数组HuffNode保存哈夫曼树中各结点的信息,根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有2n-1个结点,所以数组HuffNode的大小设置为2n-1;描述结点的数据类型为:struct HNodeTypechar data; /结点字符int weight;/结点权值int parent;int lchild;int rchild;int level;2、求哈夫曼树编码时使用一维结构数组HuffCode作为哈夫曼编码信息的存储。求哈夫曼编码,实质上就是在已建立的哈夫曼树中,从叶子结点开始,沿结点的双亲链域回退到根结点,每回退一步,就走过了哈夫曼树的一个分支,从而得到一位哈夫曼码值,由于一个字符的哈夫曼编码是从根结点到相应叶子结点所经过的路径上各分支所组成的0、1序列,因此先得到的分支代码为所求编码为所求编码的低位码,后得到的分支代码为所求编码的高位码,所以设计如下数据类型:struct HCodeTypeint bitMAXBIT;int start;3、文件hfmtree.txt、codefile.txt、textfile.txt。4、 功能设计 (1)接收原始数据:从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmtree.dat中。(2)编码:利用已建好的哈夫曼树(如不在内存,则从文件hfmtree.dat中读入),对文件中的正文进行编码,然后将结果存入文件codefile.dat中。(3)译码:利用已建好的哈夫曼树将文件codefile.dat中的代码进行译码,结果存入文件textfile.dat中。(4)打印编码规则:即字符与编码的一一对应关系。(5)打印哈夫曼树:将已在内存中的哈夫曼树以直观的方式显示在终端上。5、 测试数据(1) 利用教科书中的数据调试程序。 令叶子结点个数n为4,权值集合为1 3 5 7,字符集合为A B C D,并有如下对应关系,A1,B3,C5,D7,调用初始化功能模块可以正确接收这些数据。调用建立哈夫曼树的功能模块,构造静态链表HuffNode的存储。调用建立哈夫曼编码规则的功能模块,在屏幕上显示如下对应关系:A1,B3,C5,D7。调用哈夫曼编码的功能模块,在屏幕上输入“ABCD”后,显示编码:调用译码的功能模块,输入代码串“111110100”后,屏幕上显示译码结果:100101110ABCD调用打印哈夫曼树的功能模块。在屏幕上显示哈夫曼树(用凹入法表示)。打印编码规则:(2)用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAM IS MY FAVORITE”。字符ABCDEFGHIJKLM频度1866413223210321154757153220字符NOPQRSTUVWXYZ频度5763151485180238181161调用建立哈夫曼树的功能模块,构造静态链表HuffNode的存储。调用建立哈夫曼编码规则的功能模块: 调用哈夫曼编码的功能模块:调用译码的功能模块:调用打印哈夫曼树的功能模块。在屏幕上显示哈夫曼树(用凹入法表示)。 打印编码规则:6、 程序代码/ HUFF.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include#include#includeusing namespace std;const int MAXBIT=100;const int MAXVALUE=2000;const int MAXNODE=100;struct HNodeTypechar data;int weight;int parent;int lchild;int rchild;int level;struct HCodeTypeint bitMAXBIT;int start;static int n;static HNodeType *HuffNode;static HCodeType *HuffCode;/字符和权值的输入及建立哈夫曼树模块*HNodeType *huffmanTree()cout请输入字符总数:n;HuffNode=new HNodeType2*n-1;int i,j;int m1,m2,x1,x2;/初始化for(i=0;i2*n-1;i+) HuffNodei.level=1;HuffNodei.data=0;HuffNodei.weight=0;HuffNodei.parent=-1;HuffNodei.lchild=-1;HuffNodei.rchild=-1;/输入字符及权值cout请输入字符(可以识别空格,两个非空格字符之间请不要再加空格):endl;cout形如:(a bc),( abb c)endl;char c;flushall();for(i=0;in;i+)cin.get(c);HuffNodei.data=c;cout字符对应的叶子结点的权值:endl;for(i=0;iHuffNodei.weight;/建立哈夫曼树for(i=0;in-1;i+)m1=m2=MAXVALUE;x1=x2=0;for(j=0;jn+i;j+)if(HuffNodej.parent=-1&HuffNodej.weightm1)m2=m1;x2=x1;m1=HuffNodej.weight;x1=j;elseif(HuffNodej.parent=-1&HuffNodej.weightm2)m2=HuffNodej.weight; x2=j; HuffNodex1.level=n-i;HuffNodex2.level=n-i;/结点在哈夫曼树的层次HuffNodex1.parent=n+i;HuffNodex2.parent=n+i;HuffNoden+i.weight=HuffNodex1.weight+HuffNodex2.weight;HuffNoden+i.lchild=x1;HuffNoden+i.rchild=x2;/输出哈夫曼树cout已成功建立哈夫曼树!endl;for(i=0;i2*n-1;i+)coutHuffNodei.weightt;coutHuffNodei.lchildt;coutHuffNodei.rchildt;coutHuffNodei.parentt;coutHuffNodei.levelt;coutendl;/把哈夫曼树写入文件ofstream outFile;outFile.open(hfmtree.txt,ios:out);for(i=0;i2*n-1;i+)outFileHuffNodei.datat;outFileHuffNodei.weightt;outFileHuffNodei.lchildt;outFileHuffNodei.rchildt;outFileHuffNodei.parentt;outFileendl;outFile.close(); cout已成功建立哈夫曼树并存入文件hfmtree.txt!endl;return HuffNode;/建立哈夫曼编码规则模块*void huffmanCode()HuffCode=new HCodeTypen;HCodeType cd;int i,j,c,p;/建立编码规则for(i=0;in;i+)cd.start=MAXBIT-1;c=i;p=HuffNodec.parent;while(p!=-1)if(HuffNodep.lchild=c)cd.bitcd.start=0;elsecd.bitcd.start=1;cd.start-;c=p;p=HuffNodec.parent;for(j=cd.start+1;jMAXBIT;j+)HuffCodei.bitj=cd.bitj;HuffCodei.start=cd.start;/输出编码规则cout已成功建立以下编码规则并存入codefile.txt文件中!endl;for(i=0;in;i+)coutHuffNodei.data-;for(j=HuffCodei.start+1;jMAXBIT;j+)coutHuffCodei.bitj;coutendl;/将编码规则写入文件ofstream outFile(codefile.txt,ios:out);for(i=0;in;i+)outFileHuffNodei.data-;for(j=HuffCodei.start+1;jMAXBIT;j+)outFileHuffCodei.bitj;outFileendl;outFile.close();/哈夫曼编码模块*void coding()cout请输入要编码的字符串:endl;string s;flushall();getline(cin,s);couts对应的编码为:endl;for(int i=0;is.length();i+)for(int j=0;jn;j+)if(si=HuffNodej.data)for(int k=HuffCodej.start+1;kMAXBIT;k+)coutHuffCodej.bitk;elsecout您输入的编码不正确!endl;coutendl;/哈夫曼译码模块*void deCoding()string code;cout请输入要译码的编码序列:code;coutcode编码后的结果(已存入txtfile.txt文件)为:endl;int next,root;for(int i=0;i2*n-1;i+)if(HuffNodei.parent=-1)root=i;ofstream outFile(txtfile.txt,ios:out); for(int i=0;icode.length();i+)next=root;while(HuffNodenext.lchild!=-1&HuffNodenext.rchild!=-1)if(codei=0)next=HuffNodenext.lchild;i+;elsenext=HuffNodenext.rchild;i+;coutHuffNodenext.data;outFileHuffNodenext.data;i-;coutendl;outFile.close();/打印哈夫曼树模块*void printHuffTree()/凹入法打印哈夫曼树for(int i=0;in;i+)for(int j=0;j2*n-1;j+)if(HuffNodej.level=i+1)for(int k=0;kHuffNodej.level;k+)cout ;for(int k=0;k60-HuffNodej.level-i;k+)cout*;cout(HuffNodej.weight);if(jn)coutHuffNodej.data;coutendl; /输出编码规则模块*void printPrinciple()for(int i=0;in;i+)coutHuffNodei.data-;for(int j=HuffCodei.start+1;jMAXBIT;j+)coutHuffCodei.bitj;coutendl;/显示菜单函数*void menu()cout请选择功能:endl;cout菜单:-输入字符和频度,建立哈夫曼树endl;cout 2-建立哈夫曼编码规则endl;cout 3-实现哈夫曼编码endl;cout 4-实现哈夫曼译码endl;cout 5-打印哈夫曼树endl;cout 6-打印编码规则endl;cout 0-退出程序endl;int _tmain(int argc, _TCHAR* arg
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年法宣在线宪法学习试题库和答案
- 2025年法律硕士(法学)真题及答案
- 2025年发展对象考试试题库(含答案)
- 音乐作品创作合同
- 2025年感染性疾病科食源性疾病知识培训考核试题(附答案)
- 农村农业合作开发与生产责任书
- 地球运动的一般规律课件
- 2025年国家体育总局科研所招聘笔试专项练习含答案
- 薪酬结构与绩效协议
- 2025租赁合同范本及注意事项综述
- 室上性心动过速急救护理
- 2025年国家自然科学基金委员会招聘工作人员的(一)笔试模拟试题附答案详解
- 2025年村官、村干部相关法律知识考试题(附含答案)
- 工会考试试题及答案青岛
- 《中国成人呼吸系统疾病家庭氧疗指南(2024年)》解读 2
- 稻虾养殖技术课件
- 水电运行培训课件
- 十一皮草活动方案
- 居家护理服务标准化操作手册
- 省级质控中心管理制度
- 诊所日常器械管理制度
评论
0/150
提交评论