資源簡介
利用赫夫曼編碼對字符文件進行加密,可以對txt字符文件進行加密,由于滿足課程設計,所以加密功能簡單,但是赫夫曼為核心代碼,是單獨函數分開的,用于學習赫夫曼算法是簡單的,并附有解釋。
代碼片段和文件信息
#include?
#include?
#include?
#include?
typedef?struct{
????????int?weight;
int?parentlchildrchild;
}HTNode;????????????????//構造赫夫曼樹結點的結構體
typedef?struct{
????????HTNode?*HTN;????//存儲編碼的各個字符
int?length;?????//需編碼字符個數
int?size;???????//赫夫曼編碼總容量
}HuffmanTree;???????????//構造赫夫曼樹的結構體
typedef?struct{
????????char?*ch;??????//存放需要編碼的原始字碼
????????int?*in;???????//存放各個字碼的權值
}Weight;?
char?Code[27][26];?????//存放各個字符的赫夫曼編碼01
int??Code_N[30];???????//存放各個字符對應編碼01的個數,用于輸出控制
//輸出菜單列表
void?showMenu();
//對赫夫曼樹結構初始化
void?Init_HuffmanTree(HuffmanTree?&HWeight?S);
//對編碼個數和權值的結構初始化
void?Init_Weight(Weight?&Sint?msizeint?msize1);
//求出輸入字符串各個字符的權值
void?WeightNumber(Weight?&S);
//選擇parent=0且權值較小的兩個HTnode
void?select(HuffmanTree?Hint?jint?a[]);
//創建赫夫曼樹
void?creat_HuffmanTree(HuffmanTree?&H);
//赫夫曼編碼
void?creat_HTCode(HuffmanTree?HWeight?S);
//赫夫曼解碼
void?explain_HTCode(HuffmanTree?HWeight?S);
/*對指定文件進行加密*/
void?encryptFile(Weight?S);
/*對指定文件進行解密*/
void?deencryptFile(HuffmanTree?HWeight?S);
/*用于讀出文件中所儲存的全部信息*/
void?my_readFile();
//主函數實現赫夫曼樹
void?main()
{
HuffmanTree?h;
Weight?s;
????Init_Weight(s5050);
char?choose=‘\0‘yes_no=‘\0‘ch;
??do
??{
showMenu();
printf(“?????????????????????????????????????????????????????選擇:?“);
cin>>choose;
switch(choose)
{
????????case‘1‘:?{WeightNumber(s);
?}break;
case‘2‘:?{Init_HuffmanTree(hs);
??????????????????creat_HuffmanTree(h);
?}break;
????????case‘3‘:?{creat_HTCode(hs);
?}break;
case‘4‘:?{explain_HTCode(hs);
?}break;
case‘5‘:?{encryptFile(s);
?}break;
case‘6‘:?{deencryptFile(hs);
?}break;
case‘7‘:{my_readFile();
}break;
case‘8‘:?{exit(0);
?}break;
????????case‘0‘:?{??
???????//對26個字符設置給定的權值
???????????????????s.ch[1]=‘e‘;s.ch[2]=‘a‘;s.ch[3]=‘r‘;s.ch[4]=‘i‘;s.ch[5]=‘o‘;
???s.ch[6]=‘t‘;s.ch[7]=‘n‘;s.ch[8]=‘s‘;s.ch[9]=‘l‘;s.ch[10]=‘c‘;
???s.ch[11]=‘u‘;s.ch[12]=‘d‘;s.ch[13]=‘p‘;s.ch[14]=‘m‘;s.ch[15]=‘h‘;
???s.ch[16]=‘g‘;s.ch[17]=‘b‘;s.ch[18]=‘f‘;s.ch[19]=‘y‘;s.ch[20]=‘w‘;
???s.ch[21]=‘k‘;s.ch[22]=‘v‘;s.ch[23]=‘x‘;s.ch[24]=‘z‘;s.ch[25]=‘j‘;
???s.ch[26]=‘q‘;
???????????????????s.in[1]=57;s.in[2]=43;s.in[3]=39;s.in[4]=38;s.in[5]=37;
???????????????s.in[6]=35;s.in[7]=34;s.in[8]=29;s.in[9]=28;s.in[10]=23;
???s.in[11]=19;s.in[12]=17;s.in[13]=16;s.in[14]=15;s.in[15]=15;
???s.in[16]=13;s.in[17]=11;s.in[18]=9;s.in[19]=9;s.in[20]=7;
???s.in[21]=6;s.in[22]=5;s.in[23]=1;s.in[24]=1;s.in[25]=1;
???s.in[26]=1;s.in[0]=26;???????????????????????????????????
???FILE?*fp;
?if((fp=fopen(“original.txt““w“))==NULL){???????????//打開文件
??????printf(“文件不能打開“);
??exit(1);
??}
?????????for(int?i=1;i<=26;i++){
?????fprintf(fp“%c?%d?“s.ch[i]s.in[i]);
?}
?fclose(fp);
?}break;
????????cout<<“\n\n\n\t\t\t確定退出(Y||N)“;
????????cin>>ch;
????????????????????if(c
- 上一篇:C++實現日志庫
- 下一篇:MFC實現簡單網絡聊天程
評論
共有 條評論