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 dif[MAXLEAF]; int num;}ST;typedef struct{ int weight; int parent; int lchild; int rchild;}HNodeType; //哈弗曼树结构体typedef struct{ char bit[MAXBIT]; int start;}HCodeType; //编码结构体//哈夫曼树的结构体数组HNodeType HuffNode[MAXNODE];HCodeType HuffCode[MAXLEAF],cd;ST *SS;//写信息时使用ST *DD;//接收信息时使用int main()//主函数{ void Key();//密码函数 void Window1();//窗口函数1 void Window2();//窗口函数2 void Window3();//退出窗口界面函数 void Menu();//菜单选择函数 int Send_Mess(ST **s);//写信息 void Reve_Mess(ST **s);//收信息 Window1(); //界面窗口1 Key(); //密码函数 Window2(); //界面窗口2 int i,n; do //显示主菜单,接受选择,并分支调用管理类类的相应功能的成员函数 { Menu(); //提供选择菜单 cin>>i; switch(i) { case 1: n=Send_Mess(&SS);break;//写信息 case 2: Reve_Mess(&DD); break;//接收信息 case 3: break;//退出 default:cout<<"操作错误,请重新操作!"<>m;//读入文件 key=m; in.close();end:; cout<<"☆☆☆请输入密码:"; cin>>h; if(key==h) key=m; else { cout<<"密码错误,请重新操作!"<>a; if(a==1) { cout<<"新密码:"<>key; ofstream out("e:\\key.txt",ios::out); out<>a[i]; if(a[i]=='#') break; }}ST *Stat(char a[MAXMESS])//统计字符及其个数{ ST *d; d=new ST; d->num=0;//初始化 while(*a!='#') { if(d->num==0)//首次进入 { d->dif[0].data=*a; d->dif[0].num=1; d->num++; a++; } else { for(int j=0;jnum;j++) {//从整个统计数组中寻找该字符是否存在 if(d->dif[j].data==*a) { a++; d->dif[j].num++; break; } } if(j>=d->num)//统计数组中没有存在该字符 { d->dif[j].data=*a; d->dif[j].num=1; d->num++; a++; } } } return d;//返回统计数组的地址}int Leaf_num(ST *s)//叶子结点数{ return s->num;}void Weight(int x,ST *s,HNodeType HuffNode[MAXNODE])//导入权值{ for(int j=0;j<2*x-1;j++) //数组的初始化 { HuffNode[j].weight=0; HuffNode[j].parent=-1; HuffNode[j].lchild=-1; HuffNode[j].rchild=-1; } for(int i=0;idif[i].num; //输入n个结点的权值}void HaffmanCode(int n) //哈弗曼编码{ int i,j,c,p; for(i=0;i> targetFileName; targetFile = fopen(targetFileName, "wb"); //判断目标文件是否可以建立 while (targetFile == NULL) { cout << "目标文件无法建立!" << "\n请重新输入:"; cin >> targetFileName; targetFile = fopen(targetFileName, "wb"); } for(int k=0;kdif[k].data,targetFile); putw(HuffNode[k].weight,targetFile); } fputc(w,targetFile); while(*a!='#') { for(int i=0;idif[i].data==*a) { for(int j=HuffCode[i].start+1;jnum=0; int i=0; FILE *sourceFile; //表示源文件 char *sourceFileName = new char[]; char *targetFileName = new char[]; cout << "请输入源文件的文件名:(e:\\message.txt)"; cin >> sourceFileName; sourceFile = fopen(sourceFileName, "rb"); //判断源文件是否存在,不存在则要求用户重新输入 while (sourceFile == NULL) { cout << "您输入的源文件不存在!" << "\n请重新输入:"; cin >> sourceFileName; sourceFile = fopen(sourceFileName, "rb"); //只读的形式打开文件 } if (feof(sourceFile)) cout << "文件内容为空!"; else//读取文件中的内容存储到数组中 { a[i]=fgetc(sourceFile); while(a[i]!='*') { DD->num++; DD->dif[i].data=a[i]; DD->dif[i].num=getw(sourceFile); i++; a[i]=fgetc(sourceFile); } i=0; a[i]=fgetc(sourceFile); while(a[i]!=EOF) { i++; a[i]=fgetc(sourceFile);//最后一次存储的是空格 } a[i]='#';//将最后一个得标志变为# } fclose(sourceFile); return DD->num;}void Decod(char a[MAXLENGTH],int n,ST *s,char b[MAXMESS]) //信息解码{ void Weight(int x,ST *s,HNodeType HuffNode[MAXNODE]);//提供权值 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(a[j]!='#') { if(a[j]=='0') i=HuffNode[i].lchild; else i=HuffNode[i].rchild; if(HuffNode[i].lchild==-1||HuffNode[i].rchild==-1) { putchar(s->dif[i].data); b[k]=s->dif[i].data;//字符存储在b数组里 k++; i=2*n-2; } j++; } b[k]='#'; cout<>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<<"操作错误,请重新操作!"<>"<>"<dif[i].data==*a) { for(int j=HuffCode[i].start+1;j>"<dif[i].data<<":"; for(int m=HuffCode[i].start+1;m