版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、C語言-哈夫曼編碼實驗報告11課程:題目:專業(yè):班級:座號:姓名:福建工程學院課程設計數(shù)據(jù)結(jié)構(gòu) 哈夫曼編碼和譯碼 信息管理信息系統(tǒng)1002 班 15號 林左權(quán)2011年 6月 27日實驗題目:哈夫曼編碼和譯碼一、要解決的問題利用哈夫曼編碼進行信息通信可以大大提高信道利 用率,縮短信息傳輸時間,降低傳輸成本。但是,這要 求在發(fā)送端通過一個編碼系統(tǒng)對待傳數(shù)據(jù)預先編碼,在 接收端將傳來的數(shù)據(jù)進行譯碼(復原)。對于雙工信道(即 可以雙向傳輸信息的信道),每端都需要一個完整的編/ 譯碼系統(tǒng)。二、算法基本思想描述:根據(jù)給定的字符和其中每個字符的頻度,構(gòu)造哈夫饅樹,并輸出字符集中每個字符的哈夫曼編碼.將給定
2、的字符串根據(jù)其哈夫曼編碼進行編碼,并進行相應的譯碼.三、設計1.數(shù)據(jù)結(jié)構(gòu)的設計(1)哈夫曼樹的表示設計哈夫曼樹的結(jié)構(gòu)體(htnode),其中包含權(quán)重、左右孩子、父母和要編碼的字符。用這 個結(jié)構(gòu)體(htnode)定義個哈夫曼數(shù)組(hfmt)。迷宮定義如下:typedef structint weight;int lchild;int rchild;int pare nt;char key;ht no de;typedef htnode hfmtMAXLEN;(2)對原始字符進行編碼初始化哈夫曼樹(inithfmt )。從終端讀入字符集大小n,以及n個字符和n個權(quán)值, 建立哈夫曼樹。并顯示出每個字
3、符的編碼。1. void in ithfmt(hfmt t)對結(jié)構(gòu)體進行初始化2. void inputweight(hfmt t)/ 輸入函數(shù)3. void selectmin(hfmt t,int i,int *p1,int *p2) 選中兩個 權(quán)值最小的函數(shù)4. void creathfmt(hfmt t)/創(chuàng)建哈夫曼樹的函數(shù)5. void phfmnode(hfmt t)/對字符進行初始編碼(3) 對用戶輸入的字符進行編碼void en codi ng(hfmt t)/對用戶輸入的電文進行編碼char r1000;用來存儲輸入的字符串int i,j;printf(nn請輸入需要編碼的字
4、符:);gets(r);printf(編碼結(jié)果為:);for(j=0;rj!=0;j+)for(i=0;i n;i+)if(rj=ti.key)hfmtpath(t,i,j);prin tf(n);(4) 對用戶輸入的字符進行編碼void decodi ng(hfmt t)/ 對用戶輸入的密文進行譯碼char r100;int i,j,le n;j=2* n-2;/j初始從樹的根節(jié)點開始printf(nn請輸入需要譯碼的字符串:);gets(r);len=strle n(r);printf( 譯碼的結(jié)果是:);for(i=0;ile n;i+)if(ri=0)j=tj.lchild;if(tj
5、.lchild=-1)prin tf(%c,tj.key);j=2* n-2;else if(ri=1)j=tj.rchild;if(tj.rchild=-1)prin tf(%c,tj.key); j=2* n-2;prin tf(nn);四、源程序清單:#i nclude #i nclude #include #defi ne MAXLEN 100 typedef struct int weight; int lchild; int rchild;int pare nt; char key;ht no de;typedef htnode hfmtMAXLEN;int n;void in i
6、thfmt(hfmt t) int i;prin tf(n);對結(jié)構(gòu)體進行初始化prin tf(- printf(*n); printf(n請輸入 n=);scan f(%d,&n); getchar();for(i=0;i2* n-1;i+) *對結(jié)構(gòu)體進行初始化n);輸ti.weight=O; ti.lchild=-1;ti.rchild=-1;ti.pare nt=-1;prin tf(n);void in putweight(hfmt t)/輸入函數(shù)int w;/w表示權(quán)值int i;char k;/k表示獲取的字符for(i=0;i tj.weight)min 1=tj.weight
7、;*p1=j;for(j=0;jtj.weight & j!=(*p1)/注意 j!=(*p1)min 2=tj.weight;*p2=j;void creathfmt(hfmt t)創(chuàng)建哈夫曼樹的函數(shù)int i,p1,p2;in ithfmt(t);in putweight(t);for(i=n;i2* n-1;i+)selectmi n(t,i-1,&p1,&p2);tp1.pare nt=i;tp2.pare nt=i;ti.lchild=p1;ti.rchild=p2;ti.weight=tp1.weight+tp2.weight;打印哈夫曼樹n); void prin thfmt(h
8、fmt t)/ int i;printf(printf( *n);printf(tt權(quán)重t父母t左孩子t右孩子t字符t);for(i=0;i2* n-1;i+)prin tf(n);prin tf(tt%dt%dt%dt%dt%c,ti.weight,ti.pare nt,ti.lchild,ti.rchild ,ti.key);printf(n);prin tf(nn);void hfmtpath(hfmt t,i nt i,i nt j) int a,b; a=i;b=j=ti.pare nt;if(tj.pare nt!=-1)n編碼的重要哈夫曼樹路徑遞歸算法i=j; hfmtpath(
9、t,i,j);if(tb.lchild=a)prin tf(0);elseprin tf(1);void phfm no de(hfmt t)/對字符進行初始編碼int i,j,a;printf(n);printf( * *);nfor(i=0;i n ;i+)j=0;prin tf(n);prin tf(tt%ct,ti.key,ti.weight); hfmtpath(t,i,j);prin tf(n);nvoid en codi ng(hfmt t)/對用戶輸入的電文進行編碼char r1000;int i,j;prin tf(nngets(r);用來存儲輸入的字符串請輸入需要編碼的字符
10、:);printf(編碼結(jié)果為:);for(j=0;rj!=0;j+)for(i=0;i n;i+)if(rj=ti.key)hfmtpath(t,i,j);prin tf(n);void decodi ng(hfmt t)/ 對用戶輸入的密文進行譯碼 char r100;初始從樹的根節(jié)點開始請輸入需要譯碼的字符串:);int i,j,le n;j=2* n-2;/j譯碼的結(jié)果是:);i=0;ile n;i+)prin tf(nn gets(r); len=strle n(r); printf( for if(ri=0) j=tj.lchild; if(tj.lchild=-1) prin t
11、f(%c,tj.key); j=2* n-2;else if(ri=1)j=tj.rchild;if(tj.rchild=-1)prin tf(%c,tj.key); j=2* n-2;ntf(nn); priI13int maiintn()i,j; hfmt ht; char flag; printf( printf( printf( printf( printf( prin tf(|I *|I *|n);信管1002-林左權(quán)-15號|n);|n);哈夫曼編碼課程設計|n);|n);設計完成時間:2011/6/27|n);|n);printf( creathfmt(ht); prin thf
12、mt(ht); phfm no de(ht);18prin tf(nn);printf( *&譯 碼 & 退*);printf(n【1】編碼t【2】t譯碼t【0】退出);prin tf(n您的選擇:);flag=getchar(); getchar();while(flag!=0) if(flag=1)en cod in g(ht); else if(flag=2) decod in g(ht); elseprintf(您的輸入有誤,請重新輸入prin tf(n*n);編碼&譯碼 &退*)prin tf(n prin tf(n flag=getchar(); getchar();1】編碼t【2
13、】t譯碼t【0】退出); 您的選擇:);prin tf(nn);printf(*n歡迎使用林左權(quán)的哈夫曼編碼系*n);printf(n);system(pause);五、測試數(shù)據(jù)及測試結(jié)果:例如:! f言菅丄盹2林左權(quán)一巧號!:M*畀-住咒|!哈夫曼編碼課程設計! | :MiMKXNWKXiMKXaOtKHatKiMKWaOE ;設計完成時間吆陌血? !MKMXXmtXKMKMXKmCMiMMBillOiM: MXM屛XX 刖 - 審K 耳凰 J4 何且耳 *MM 良 K 耳 K請輸人“=4耿書抹睪輛權(quán)值汐I星那i冃胸請賴H -值 &勺 - ! J3J- 3 3 spm 入入 嚴1 42 土冃青A14 44測主冃青諾權(quán)值 C; U serslzqDe s ktopXBp 夫曼詢豈 ex 已權(quán)? S 2 4H子S一一右HFS莖T ; T裁母夫父 5 4-4哈乂符字abedie118111 IWlifiiiHWiilrfaii :MKKaeilCKtMIMElrfjMK; 哈夫員編碼0 C
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 校園教學樓智慧校園系統(tǒng)安裝合同
- 太陽能項目合同發(fā)電效率
- 劇院租賃合同模板
- 保安設備融資租賃合同示范
- 醫(yī)療設備安裝工程總承包合同
- 農(nóng)業(yè)設施保溫施工合同
- 紡織服裝展位租賃協(xié)議
- 珠寶首飾存儲續(xù)約合同
- 生態(tài)工業(yè)園房產(chǎn)購置合同模板
- 真石漆施工合同私人會所外墻翻新
- 地質(zhì)科普進校園活動方案設計
- 24春國家開放大學《農(nóng)業(yè)推廣》調(diào)查報告參考答案
- 人教版小學數(shù)學一年級(上)口算題1000道
- 純彎曲梁正應力實驗報告
- 心血管科主任述職報告
- 《數(shù)據(jù)結(jié)構(gòu)》課程標準2
- 教師的教材選擇與分析
- 日本健康管理產(chǎn)業(yè)發(fā)展趨勢分析
- 畢業(yè)設計拍攝任務書
- 銀行竣工驗收報告 -
- 腦科學與人工智能技術(shù)融合發(fā)展
評論
0/150
提交評論