版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
軟件學(xué)院設(shè)計性實驗報告
專業(yè):網(wǎng)絡(luò)工程年級/班級:2023—2023學(xué)年第一學(xué)期
課程名稱數(shù)據(jù)結(jié)構(gòu)指導(dǎo)教師
本組成員
學(xué)號姓名
實驗地點實驗時間
項目名稱哈夫曼編/譯碼系統(tǒng)的設(shè)計與實現(xiàn)實驗類型設(shè)計性
、實驗?zāi)康?/p>
理解哈夫曼樹的特性及其應(yīng)用;在對哈夫曼樹進行理解的基礎(chǔ)上,構(gòu)造哈夫曼樹,并用
構(gòu)造的哈夫曼樹進行編碼和譯碼;通過該實驗,使學(xué)生對數(shù)據(jù)結(jié)構(gòu)的應(yīng)用有更深層次的理解。
二、實驗儀器或設(shè)備
學(xué)院提供公共機房,1臺/學(xué)生微型計算機。
三、總體設(shè)計(設(shè)計原理、設(shè)計方案及流程等)
1.問題描述:
運用哈夫曼編碼進行通信可以大大提高信道運用率,縮短信息傳輸時間,減少傳輸成本。
但是,這規(guī)定在發(fā)送端通過一個編碼系統(tǒng)對待傳數(shù)據(jù)預(yù)先編碼,在接受端將傳來的數(shù)據(jù)進行
譯碼(解碼)。對于雙工信道(即可以雙向傳輸信息的信道),每端都需要一個完整的編/譯碼系
統(tǒng)。試為這樣的信息收發(fā)站設(shè)計一個哈夫曼編/譯碼系統(tǒng)。
2.一個完整的系統(tǒng)應(yīng)具有以下功能:
1)初始化(Initia1zation).從數(shù)據(jù)文獻DataFile.dat中讀入字符及每個字符的
權(quán)值,建立哈夫曼樹HuffTree;
2)編碼(EnCoding)。用已建好的哈夫曼樹,對文獻ToBeTran.dat中的文本進行編
碼形成報文,將報文寫在文獻Code,txt中;
3)譯碼(Decoding)。運用已建好的哈夫曼樹,對文獻CodeFi1e.dat中的代碼進行
解碼形成原文,結(jié)果存入文獻Textfile.txt中;
4)輸出(Output):輸出DataFile.dat中出現(xiàn)的字符以及各字符出現(xiàn)的頻度(或概率);
輸出ToBeTran.dat及其報文Code.txt;輸出CodeFile.dat及其原文Textfi1e.txt;
規(guī)定:所設(shè)計的系統(tǒng)應(yīng)能在程序執(zhí)行的過程中,根據(jù)實際情況(不同的輸入)建立DataFile.da
t、ToBeTran.dat和CodeFi1e.dat三個文獻,以保證系統(tǒng)的通用性。
四、實驗環(huán)節(jié)(涉及重要環(huán)節(jié)、代碼分析等)
1)編寫C語言程序
#inc1ude<string.h>
#inc1ude<malloc.h>
#include<stdio.h>
Sinc1ude<iostream.h>
#include<math.h>
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
typedefstruct
(
?chardata;
intweight;
ointparent,1child,rchi1d;
}HTNode,"HuffmanTree;
typedefchar*nCode;
voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&H
C,char*d,int*w,intn)〃構(gòu)造哈弗曼函數(shù)HT,構(gòu)造編碼HC
voidselect(HuffmanTreeHT,intn,int&sl,int&
S2);
eintm,c,f,j;
HuffmanTreep;
inti,s1,s2,start;
char*cd;
m=2^n-l;//m為結(jié)點數(shù),n為葉子數(shù)
HT=(HuffmanTree)malloc((m+l)*sizeof(HTNode));
叩=HT;
叩++;
for(i=1;i<=n;i++,p++)//將葉子的
值輸入HT中
(
p->data=d[i];//={*d,*w,0,0,0};
p->weight=w[i];
gp—>parent=0;
op->lchild=0;
gp->rchild=0;
)
for(i=n+1;i<=m;i++,p++)//
={,tf,0,0,0,0)
(
中->data=';
p—>weight=0;
°p—>parent=0;
p->1child=0;
^>p->rchild=O;
6S1=1;
s2=2;
for(i=n+l;i<=m;i++)〃構(gòu)建哈夫曼樹
°{
。se1ect(HT,i-1,s1,s2);
HT[i].Ichiid=sl;
HT[i].rchi1d=s2;
gHT[i].weight=HT[sl].weight+HT[s2].weight;
~>HT[s1].parent=i;
HT[s2].parent=i;
oHC=(HuffmanCode)malloc((n+1)*sizeof(HuffmanTree));
//開辟空間,編碼
??cd=(char*)malloc(n*sizeof(char));
cd[nT]='\0';
for(i=l;iV=n;++i)
。{
?start=n-l;
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
。(
bif(HT[f].lchild==c)
ocd[---start]=,O';
else
cd[-start]=,1
eHC[i]=(char*)malloc((n-start)*sizeof(char));
strcpy(HC[i],&cd[start]);
。printf(〃%c的編碼是:",HT[i]);
。puts(HC[i]);
free(cd);
}
voidselect(HuffmanTreeHT,intn,int&sl,int&s2)
//求最小兩數(shù)
(
einti,t;
os1=1;
,s2=2;
owhile(HT[s1].parent!=0)
sl++;
owhile((HT[s2].parent!=0)I(sl==s2))
8s2++;
/*for(i=l;i<=n;i++)
b{
if(HTLsi].weight>HT[i].weight&&HT[i].pa
rent==0&&s2!=i)
osl=i;
if(HT[s1].weight>HT[s2].weight)
{
bt=Sl;
sl=s2;
s2=t;
for(i=l;i<=n;i++)
(
if(sl!=i)
2{
。if(HT[s2].weight>HT[i].weight&&HT[i].parent==0)
3s2=i;
i
“*/
for(i=l;i<=n;i++)
o(
if(si!=i&&i!=s2)
6{
if(HT[i].weight<HT[si].weight&&HT
[i].parent==0&&i!=s2)
oif(HT[sl].weight<HT[s2].weight)s2=s1;
sl=i;
ge1se
gif(HT[i].weight<HT[s2].weight&&HT[i].parent==O&&sl!
=i)匕s2=i;
。}
)
voidtrans1ation(HuffmanTreeHT,intnum)
(
charstrE20];
。inti,t=num;
叩rintf(〃請輸入由?;?組成的編碼:〃);
ocin>>str;
〃t=HT;//t為樹的指向各節(jié)點的指針
6for(i=0;i<(str1en(str));i++)
b{
if(str[i]=='0')
at=HT[t].Ichild;
比1se
<>if(str[i]==,17)
gt=HT[t].rchild;
oelse
81
8printf(〃編碼輸入錯誤");
。break;
0
if(!(HTLt].lchild&&HT[t].rchild))
(
gprintfHT[t].data);
8t=num;
a)
)
printf(〃\n〃);
)
voidmain()
(
?voidHuffmanCoding(HuffmanTree&HT,HuffmanCode
&HC,chard[],intw[],intn);
?voidtranslation(HuffmanTreeHT,intnum);
HuffmanTreeHT=NULL;
HuffmanCodeHC=NULL;
?>chardata,n,*p,*d;
int*w,wei,i,num;
printf("pleaseintputcharacternumber:");
oscanf("%d〃,&n);
od=(char*)ma1loc((n+l)*sizeof(char));
ow=(int^)ma1loc((n+l)*sizeof(int));
printf("請輸入Huffman樹中的字符:\n");
for(i=1;i<=n;i++)
*{
。cin>>data;
d[i]=data;
)
fiprintf("請輸入為d次位權(quán)\n:",n);
for(i=1;i<=n;i++)
6(
~cin?wei;
w[i]=wei;
?)
num=2*n—1;
HuffmanCoding(HT,HC,d,w,n):
translation(HT,num);
)
2)程序分析
此實驗是構(gòu)造哈夫曼樹,求出哈夫曼編碼然后輸出
構(gòu)造哈夫曼樹的算法操作時選出兩棵根節(jié)點的權(quán)值最小的一顆樹的左右
子樹,且置新樹的根節(jié)點的權(quán)值為其左右子樹上根節(jié)點的權(quán)值之和,根據(jù)哈
夫曼樹求出帶權(quán)途徑的算法操作是用遞歸調(diào)用的方法。
在此實驗的操作過程中要注意構(gòu)造哈夫曼樹的方法,由于在此操作的過程中
用的的指針變量特別多,容易混淆。
3)運營結(jié)果舉例
,"C:\Users\fzl\Documents\TencentFiles\1125653O39\FileRecv\Debug\llq^§^.exe*[回
pleaseintputcharacternunber:?
請輸入fman樹巾的字符:
1
3
-
-
2
3
4
5
6
z曰110
12,.vf
-1
J0
i-
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 翻罐工安全理論能力考核試卷含答案
- 金屬玩具制作工安全宣教考核試卷含答案
- 拍賣運營師班組管理考核試卷含答案
- 重冶濕法冶煉工崗前流程考核試卷含答案
- 重冶浸出工安全綜合競賽考核試卷含答案
- 海乘禮儀培訓(xùn)課件
- 酒店員工績效考核與薪酬調(diào)整制度
- 酒店客房鑰匙卡使用指導(dǎo)制度
- 超市員工績效考核及獎懲標準制度
- 濟南市中區(qū)培訓(xùn)
- 2025-2030中國城市青年租房行為特征與消費偏好調(diào)查報告
- 教培機構(gòu)年終工作總結(jié)
- 2025年秋季青島版三年級數(shù)學(xué)上冊求比一個數(shù)的幾倍多(少)幾的數(shù)教學(xué)課件
- 2025年法醫(yī)學(xué)法醫(yī)鑒定技能測試答案及解析
- 2025泰州中考數(shù)學(xué)試卷及答案
- 互感器裝配工作業(yè)指導(dǎo)書
- 2025年河南大學(xué)附屬中學(xué)人員招聘考試筆試試題(含答案)
- 市政道路養(yǎng)護年度計劃
- 河南城投發(fā)展報告2025
- 湖北煙草專賣局考試題庫2024
- 燃氣行業(yè)搶修培訓(xùn)
評論
0/150
提交評論