信息管理系統(tǒng)哈弗曼編碼_第1頁
信息管理系統(tǒng)哈弗曼編碼_第2頁
信息管理系統(tǒng)哈弗曼編碼_第3頁
信息管理系統(tǒng)哈弗曼編碼_第4頁
信息管理系統(tǒng)哈弗曼編碼_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、#include#include#include#include#include#define MAXVALUE 500 /定義最大權(quán)值,最大權(quán)值指哈夫曼樹構(gòu)造后的最大權(quán)值#define MAXLEAF 20 /定義哈夫曼樹中葉子結(jié)點的個數(shù)#define MAXMESS 1000 /輸入信息個數(shù)的最大范圍#define MAXNODE MAXLEAF*2-1 /結(jié)點數(shù)#define MAXBIT 200 /哈弗曼編碼的最大長度#define MAXLENGTH 2000using namespace std;/哈夫曼樹的結(jié)構(gòu)體typedef struct/存儲字符及其個數(shù)char data;/

2、存儲字符信息int num; /存儲個數(shù)(權(quán)值)Mess;typedef struct/不同字符個數(shù)的統(tǒng)計(葉子結(jié)點個數(shù))Mess difMAXLEAF;int num;ST;typedef structint weight;int parent;int lchild;int rchild;HNodeType; /哈弗曼樹結(jié)構(gòu)體typedef structchar bitMAXBIT;int start;HCodeType; /編碼結(jié)構(gòu)體/哈夫曼樹的結(jié)構(gòu)體數(shù)組HNodeType HuffNodeMAXNODE;HCodeType HuffCodeMAXLEAF,cd;ST *SS;/寫信息時使

3、用ST *DD;/接收信息時使用int main()/主函數(shù)void Key();/密碼函數(shù)void Window1();/窗口函數(shù)1void Window2();/窗口函數(shù)2void Window3();/退出窗口界面函數(shù)void Menu();/菜單選擇函數(shù)int Send_Mess(ST *s);/寫信息void Reve_Mess(ST *s);/收信息Window1(); /界面窗口1Key(); /密碼函數(shù)Window2(); /界面窗口2int i,n;do /顯示主菜單,接受選擇,并分支調(diào)用管理類類的相應(yīng)功能的成員函數(shù)Menu(); /提供選擇菜單cini;switch(i)c

4、ase 1: n=Send_Mess(&SS);break;/寫信息case 2: Reve_Mess(&DD); break;/接收信息case 3: break;/退出default:cout操作錯誤,請重新操作!endl;while(i!=3);Window3();/退出窗口界面函數(shù)return 0;void Window1()/進入窗口界面函數(shù)1system(color e3); /使界面微黃色cout信息管理系統(tǒng)endl;void Window2()/進入窗口界面函數(shù)2system(color 0f); system(cls);/界面顏色為黑色換頁cout歡迎進入信息管理系統(tǒng)endl

5、endl;void Window3()/退出窗口界面 system(cls);system(color e4);/換頁并使背景顏色為黃色字體為紅色cout退出信息管理系統(tǒng)endlendl;cout 感謝您的使用endlendl;cout 制作人: 北華航天工業(yè)學院 B08515班 金健 endlendlendlendl;/-void Key() /密碼函數(shù)string key;string m;string h;int a;ifstream input(e:key.txt,ios:in);/打開文件if(input=0)/第一次使用時自動裝入密碼ofstream out(e:key.txt,i

6、os:out);string d=dowhatyouwant;outd;out.close();cout您是第一次使用此系統(tǒng),密碼是:dowhatyouwantendl;cout建議您進入系統(tǒng)后立即修改密碼!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;vo

7、id Menu() /提供菜單cout信息管理系統(tǒng)endl; cout 1-發(fā)送信息 endl; cout 2-接收信息 endl; cout 3-退出 endl;coutendl; void Menu2() /輸出菜單coutendl; cout 1-輸出原文 endl; cout 2-輸出譯文 endl; cout 3-輸出編碼規(guī)則 endl;cout 4-輸出哈弗曼樹 endl;cout 5-退出 endl;coutendl; int Send_Mess(ST *s)/寫信息 void Write_Mess(char aMAXMESS);/寫信息ST *Stat(char aMAXMES

8、S); /統(tǒng)計字符及其個數(shù)int Leaf_num(ST *s);/葉子結(jié)點數(shù)void Weight(int x,ST *s,HNodeType HuffNodeMAXNODE);/提供權(quán)值HNodeType *HaffmanTree(int m);/構(gòu)造哈弗曼樹void HaffmanCode(int n);/哈弗曼編碼void Send(ST *s,char aMAXMESS,int n);/信息發(fā)送void Out_put(char aMAXMESS,int n,ST *s); /輸出函數(shù)char aMAXMESS;int n;/ST *s;Write_Mess(a); /寫信息*s=S

9、tat(a); /統(tǒng)計字符及其個數(shù)n=Leaf_num(*s);/葉子結(jié)點個數(shù)Weight(n,*s,HuffNode);/提供權(quán)值HNodeType *h;h=HaffmanTree(n);/構(gòu)造哈弗曼樹HaffmanCode(n); /哈弗曼編碼Send(*s,a,n);Out_put(a,n,SS);return n;/返回根結(jié)點個數(shù)void Reve_Mess(ST*s)/收信息的01編碼char bMAXLENGTH; /存儲讀取的信息int Read(char aMAXLENGTH);/讀取信息void Decod(char aMAXLENGTH,int n,ST *s,char

10、bMAXMESS); /解碼信息void Out_Inf(char aMAXMESS);/輸出所有信息int n;int k=0;char dMAXMESS; /存儲解碼后的文件n=Read(b); /讀取信息Decod(b,n,*s,d); /解碼信息 Out_Inf(d); /輸出信息/-/哈夫曼樹的構(gòu)造函數(shù)HNodeType *HaffmanTree(int m)/m用來接收根結(jié)點的個數(shù)/左右孩子都為1的為葉子結(jié)點int i,j,m1,m2,x1,x2,n;n=m;for(i=0;in-1;i+) /構(gòu)造哈夫曼樹m1=m2=MAXVALUE;/最大權(quán)值x1=x2=0; for(j=0;j

11、n+i;j+) /選取最小和次小的兩個權(quán)值為什么要n+i /m1存儲最小的if(HuffNodej.parent=-1&HuffNodej.weightm1)/找為鏈入樹中的和權(quán)值小的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*Huf

12、fNodex1.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)/統(tǒng)計字符及其個數(shù)ST *d;

13、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+)/從整個統(tǒng)計數(shù)組中尋找該字符是否存在if(d-difj.data=*a)a+; d-difj.num+; break;if(j=d-num)/統(tǒng)計數(shù)組中沒有存在該字符 d-difj.data=*a; d-difj.num=1; d-num+; a+;return d;/返回統(tǒng)計數(shù)組的地址int Leaf_num(ST *s)/葉子結(jié)點數(shù)return s-num;void W

14、eight(int x,ST *s,HNodeType HuffNodeMAXNODE)/導(dǎo)入權(quán)值for(int j=0;j2*x-1;j+) /數(shù)組的初始化HuffNodej.weight=0;HuffNodej.parent=-1;HuffNodej.lchild=-1;HuffNodej.rchild=-1;for(int i=0;idifi.num; /輸入n個結(jié)點的權(quán)值void HaffmanCode(int n) /哈弗曼編碼int i,j,c,p;for(i=0;in;i+)/求每個葉子結(jié)點的哈弗曼編碼cd.start=n-1;c=i;p=HuffNodec.parent;whi

15、le(p!=-1)/由葉子結(jié)點向上直到樹根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+)/保存每個葉子結(jié)點的哈弗曼編碼和編碼的起始始位置HuffCodei.bitj=cd.bitj;HuffCodei.start=cd.start;void Send(ST *m,char aMAXLENGTH,int n) /發(fā)送信息的編碼ST *d;d=m;int i=0;char w=*;FILE *

16、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.weig

17、ht,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信息已經(jīng)成功發(fā)送!num=0;int i=0;FILE *sourceFile; /表示源文件 char *sourceFileName = new char; char *targetFileName = new char; cout sourceFileName; so

18、urceFile = 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);whil

19、e(ai!=EOF)i+;ai=fgetc(sourceFile);/最后一次存儲的是空格ai=#;/將最后一個得標志變?yōu)?fclose(sourceFile);return DD-num;void Decod(char aMAXLENGTH,int n,ST *s,char bMAXMESS) /信息解碼void Weight(int x,ST *s,HNodeType HuffNodeMAXNODE);/提供權(quán)值HNodeType *HaffmanTree(int m);/構(gòu)造哈弗曼樹void HaffmanCode(int n);/哈弗曼編碼HNodeType *h;Weight(n,s

20、,HuffNode);/提供權(quán)值h=HaffmanTree(n);/構(gòu)造哈弗曼樹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數(shù)組里k+;i=2*n-2;j+;bk=#;coutendl信息接收成功!i;switch(i)case 1: Out_Or

21、text(a); break;/輸出原文case 2: Out_Trtext(s,a,n); break;/輸出譯文case 3: Out_Original(s,n); break;/輸出打印規(guī)則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);/葉子結(jié)點數(shù)void Weight(int x,ST *s,HNodeType HuffNodeMAXNODE);/提供權(quán)值HNodeType *HaffmanTree(int m);/構(gòu)造哈弗曼樹void HaffmanCode(int n);/哈弗曼編碼void Out_put(char aMAXMESS,int n,ST *s); /輸出函數(shù)int n;n=Leaf_num(DD);/葉子結(jié)點個數(shù)Weight(n,DD,HuffNode);/提供權(quán)值HNodeType *h;h=HaffmanTree(n);/構(gòu)造哈弗曼樹HaffmanCode(n); /哈弗曼編碼Out_put(a,n,DD);void

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論