




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
#include#include#include#include#include#define MAXVALUE 500 /定义最大权值,最大权值指哈夫曼树构造后的最大权值#define MAXLEAF 20 /定义哈夫曼树中叶子结点的个数#define MAXMESS 1000 /输入信息个数的最大范围#define MAXNODE MAXLEAF*2-1 /结点数#define MAXBIT 200 /哈弗曼编码的最大长度#define MAXLENGTH 2000using namespace std;/哈夫曼树的结构体typedef struct/存储字符及其个数char data;/存储字符信息int num; /存储个数(权值)Mess;typedef struct/不同字符个数的统计(叶子结点个数)Mess difMAXLEAF;int num;ST;typedef structint weight;int parent;int lchild;int rchild;HNodeType; /哈弗曼树结构体typedef structchar bitMAXBIT;int start;HCodeType; /编码结构体/哈夫曼树的结构体数组HNodeType HuffNodeMAXNODE;HCodeType HuffCodeMAXLEAF,cd;ST *SS;/写信息时使用ST *DD;/接收信息时使用int main()/主函数void Key();/密码函数void Window1();/窗口函数1void Window2();/窗口函数2void Window3();/退出窗口界面函数void Menu();/菜单选择函数int Send_Mess(ST *s);/写信息void Reve_Mess(ST *s);/收信息Window1(); /界面窗口1Key(); /密码函数Window2(); /界面窗口2int i,n;do /显示主菜单,接受选择,并分支调用管理类类的相应功能的成员函数Menu(); /提供选择菜单cini;switch(i)case 1: n=Send_Mess(&SS);break;/写信息case 2: Reve_Mess(&DD); break;/接收信息case 3: break;/退出default:cout操作错误,请重新操作!endl;while(i!=3);Window3();/退出窗口界面函数return 0;void Window1()/进入窗口界面函数1system(color e3); /使界面微黄色cout信息管理系统endl;void Window2()/进入窗口界面函数2system(color 0f); system(cls);/界面颜色为黑色换页cout欢迎进入信息管理系统endlendl;void Window3()/退出窗口界面 system(cls);system(color e4);/换页并使背景颜色为黄色字体为红色cout退出信息管理系统endlendl;cout 感谢您的使用endlendl;cout 制作人: 北华航天工业学院 B08515班 金健 endlendlendlendl;/-void Key() /密码函数string key;string m;string h;int a;ifstream input(e:key.txt,ios:in);/打开文件if(input=0)/第一次使用时自动装入密码ofstream out(e:key.txt,ios:out);string d=dowhatyouwant;outd;out.close();cout您是第一次使用此系统,密码是:dowhatyouwantendl;cout建议您进入系统后立即修改密码!m;/读入文件key=m;in.close();end:;couth;if(key=h)key=m;elsecout密码错误,请重新操作!endl;goto end;cout1 修改密码2 不修改密码a;if(a=1)cout新密码:key;ofstream out(e:key.txt,ios:out);outkey;out.close();return;if(a=2) return;void Menu() /提供菜单cout信息管理系统endl; cout 1-发送信息 endl; cout 2-接收信息 endl; cout 3-退出 endl;coutendl; void Menu2() /输出菜单coutendl; cout 1-输出原文 endl; cout 2-输出译文 endl; cout 3-输出编码规则 endl;cout 4-输出哈弗曼树 endl;cout 5-退出 endl;coutendl; int Send_Mess(ST *s)/写信息 void Write_Mess(char aMAXMESS);/写信息ST *Stat(char aMAXMESS); /统计字符及其个数int Leaf_num(ST *s);/叶子结点数void Weight(int x,ST *s,HNodeType HuffNodeMAXNODE);/提供权值HNodeType *HaffmanTree(int m);/构造哈弗曼树void HaffmanCode(int n);/哈弗曼编码void Send(ST *s,char aMAXMESS,int n);/信息发送void Out_put(char aMAXMESS,int n,ST *s); /输出函数char aMAXMESS;int n;/ST *s;Write_Mess(a); /写信息*s=Stat(a); /统计字符及其个数n=Leaf_num(*s);/叶子结点个数Weight(n,*s,HuffNode);/提供权值HNodeType *h;h=HaffmanTree(n);/构造哈弗曼树HaffmanCode(n); /哈弗曼编码Send(*s,a,n);Out_put(a,n,SS);return n;/返回根结点个数void Reve_Mess(ST*s)/收信息的01编码char bMAXLENGTH; /存储读取的信息int Read(char aMAXLENGTH);/读取信息void Decod(char aMAXLENGTH,int n,ST *s,char bMAXMESS); /解码信息void Out_Inf(char aMAXMESS);/输出所有信息int n;int k=0;char dMAXMESS; /存储解码后的文件n=Read(b); /读取信息Decod(b,n,*s,d); /解码信息 Out_Inf(d); /输出信息/-/哈夫曼树的构造函数HNodeType *HaffmanTree(int m)/m用来接收根结点的个数/左右孩子都为1的为叶子结点int i,j,m1,m2,x1,x2,n;n=m;for(i=0;in-1;i+) /构造哈夫曼树m1=m2=MAXVALUE;/最大权值x1=x2=0; for(j=0;jn+i;j+) /选取最小和次小的两个权值为什么要n+i /m1存储最小的if(HuffNodej.parent=-1&HuffNodej.weightm1)/找为链入树中的和权值小的m2=m1; / m2存储m1的值x2=x1; m1=HuffNodej.weight; /m1存储较小的值x1=j; /x1存储较小值的下标elseif(HuffNodej.parent=-1&HuffNodej.weightm2)m2=HuffNodej.weight; x2=j; /x2存储较小的小标 HuffNodex1.parent=n+i;HuffNodex2.parent=n+i;/cout*HuffNodex1.weight HuffNodex2.weight*;HuffNoden+i.weight=HuffNodex1.weight+HuffNodex2.weight;/coutHuffNoden+i.weight ;HuffNoden+i.lchild=x1;HuffNoden+i.rchild=x2;return HuffNode;void Write_Mess(char aMAXMESS)/写信息cout请输入信息,#表示停止输入!endl; for(int i=0;iai;if(ai=#)break;ST *Stat(char aMAXMESS)/统计字符及其个数ST *d;d=new ST;d-num=0;/初始化 while(*a!=#)if(d-num=0)/首次进入d-dif0.data=*a;d-dif0.num=1;d-num+;a+;elsefor(int j=0;jnum;j+)/从整个统计数组中寻找该字符是否存在if(d-difj.data=*a)a+; d-difj.num+; break;if(j=d-num)/统计数组中没有存在该字符 d-difj.data=*a; d-difj.num=1; d-num+; a+;return d;/返回统计数组的地址int Leaf_num(ST *s)/叶子结点数return s-num;void Weight(int x,ST *s,HNodeType HuffNodeMAXNODE)/导入权值for(int j=0;j2*x-1;j+) /数组的初始化HuffNodej.weight=0;HuffNodej.parent=-1;HuffNodej.lchild=-1;HuffNodej.rchild=-1;for(int i=0;idifi.num; /输入n个结点的权值void HaffmanCode(int n) /哈弗曼编码int i,j,c,p;for(i=0;in;i+)/求每个叶子结点的哈弗曼编码cd.start=n-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;jn;j+)/保存每个叶子结点的哈弗曼编码和编码的起始始位置HuffCodei.bitj=cd.bitj;HuffCodei.start=cd.start;void Send(ST *m,char aMAXLENGTH,int n) /发送信息的编码ST *d;d=m;int i=0;char w=*;FILE *targetFile; /表示存目标文件 char *targetFileName = new char; cout targetFileName; targetFile = fopen(targetFileName, wb); /判断目标文件是否可以建立 while (targetFile = NULL) cout 目标文件无法建立! targetFileName; targetFile = fopen(targetFileName, wb); for(int k=0;kn;k+)/for(int k=0;idifk.data,targetFile); putw(HuffNodek.weight,targetFile);fputc(w,targetFile); while(*a!=#)for(int i=0;idifi.data=*a) for(int j=HuffCodei.start+1;jn;j+)fputc(HuffCodei.bitj,targetFile);/,targetFile);a+;cout信息已经成功发送!num=0;int i=0;FILE *sourceFile; /表示源文件 char *sourceFileName = new char; char *targetFileName = new char; cout sourceFileName; sourceFile = fopen(sourceFileName, rb); /判断源文件是否存在,不存在则要求用户重新输入 while (sourceFile = NULL) cout 您输入的源文件不存在! sourceFileName; sourceFile = fopen(sourceFileName, rb); /只读的形式打开文件if (feof(sourceFile) cout num+;DD-difi.data=ai;DD-difi.num=getw(sourceFile);i+;ai=fgetc(sourceFile);i=0;ai=fgetc(sourceFile);while(ai!=EOF)i+;ai=fgetc(sourceFile);/最后一次存储的是空格ai=#;/将最后一个得标志变为#fclose(sourceFile);return DD-num;void Decod(char aMAXLENGTH,int n,ST *s,char bMAXMESS) /信息解码void Weight(int x,ST *s,HNodeType HuffNodeMAXNODE);/提供权值HNodeType *HaffmanTree(int m);/构造哈弗曼树void HaffmanCode(int n);/哈弗曼编码HNodeType *h;Weight(n,s,HuffNode);/提供权值h=HaffmanTree(n);/构造哈弗曼树HaffmanCode(n); /哈弗曼编码int i=2*n-2;int j=0;int k=0;while(aj!=#)if(aj=0)i=HuffNodei.lchild;elsei=HuffNodei.rchild;if(HuffNodei.lchild=-1|HuffNodei.rchild=-1)putchar(s-difi.data);bk=s-difi.data;/字符存储在b数组里k+;i=2*n-2;j+;bk=#;coutendl信息接收成功!i;switch(i)case 1: Out_Ortext(a); break;/输出原文case 2: Out_Trtext(s,a,n); break;/输出译文case 3: Out_Original(s,n); break;/输出打印规则case 4:;Out_Huff(n); break;/输出哈弗曼树case 5: break;default:cout操作错误,请重新操作!endl;while(i!=5);void Out_Inf(char aMAXMESS)/接收输出信息 int Leaf_num(ST *s);/叶子结点数void Weight(int x,ST *s,HNodeType HuffNodeMAXNODE);/提供权值HNodeType *HaffmanTree(int m);/构造哈弗曼树void HaffmanCode(int n);/哈弗曼编码void Out_put(char aMAXMESS,int n,ST *s); /输出函数int n;n=Leaf_num(DD);/叶子结点个数Weight(n,DD,HuffNode);/提供权值HNodeType *h;h=HaffmanTree(n);/构造哈弗曼树HaffmanCode(n); /哈弗曼编码Out_put(a,n,DD);void
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届贵州罗甸民族中学化学九上期末达标测试试题含解析
- 2026届广东省东莞市寮步镇信义学校英语九上期末联考模拟试题含解析
- 2026届湖北省宜昌市第十六中学英语九年级第一学期期末经典模拟试题含解析
- 广西南宁市名校联盟2026届高三上学期8月一模化学试题(含答案)
- 2026届新疆沙湾县英语九年级第一学期期末质量检测试题含解析
- 山东省潍坊市昌邑市2026届化学九年级第一学期期中经典试题含解析
- 2026届安徽省石台县九年级化学第一学期期中监测试题含解析
- 2026届山东省临沭县第五初级中学九年级化学第一学期期末教学质量检测模拟试题含解析
- 2026届黑龙江省齐齐哈尔市龙江县化学九上期中检测模拟试题含解析
- 高端酒店管理合伙人股权变更与酒店品牌运营合作协议
- GB/T 39141.3-2022无机和蓝宝石手表玻璃第3部分:定性标准和试验方法
- 特劳特《定位》PPT通用课件
- GB/T 1732-1993漆膜耐冲击测定法
- 二十四节气演讲稿
- GA/T 2000.7-2014公安信息代码第7部分:实有人口管理类别代码
- 2023年安徽国贸集团控股有限公司招聘笔试模拟试题及答案解析
- 初中作文指导-景物描写(课件)
- 植物灰分的测定
- 实验室资质认证评审准则最新版本课件
- 《横》书法教学课件
- 文件外发申请单
评论
0/150
提交评论