設計乙個哈夫曼編碼、解碼系統。對乙個ascii編碼的文字檔案中的字元進行哈夫曼編碼,生成編碼檔案;反過來,可將編碼檔案解碼還原為乙個文字檔案。
(1) 從檔案中讀入任意一篇英文短文(檔案為ascii編碼,擴充套件名為txt);
(2) 統計並輸出不同字元在文章**現的頻率(空格、換行、標點等也按字元處理);
(3) 根據字元頻率構造哈夫曼樹,並給出每個字元的哈夫曼編碼;
(4) 圖形化輸出哈夫曼樹、哈夫曼編碼;
(5) 將文字檔案利用哈夫曼樹進行編碼,儲存成壓縮檔案(編碼檔案字尾名.huf)
(6) 用哈夫曼編碼來儲存檔案,並和輸入文字檔案大小進行比較,計算檔案壓縮率;
(7) 進行解碼,將huf檔案解碼為ascii編碼的txt檔案,與原txt檔案進行比較。
[測試資料]文字檔案自行選擇,至少含3000個字元。
[實現**]
#include
#include
#include
#include
using namespace std;
struct node
;void
insertionsort
(node*a,
int n)
a[j+1]
=get;}}
node*
father
(node*root,node*son)
void
preorder
(node*root)
}void
sumlevel
(node*root,
int*count,
int l)
}void
levelorder
(node*t,
int*count)
cout
"("
")"
i=i+1;
q.push
(t);
while
(!q.
empty()
) x=x+1;
q.push
(p->left);}
if(p->left)
x=x+1;
q.push
(p->right);}
}}}void
treeprint
(node *t,
int level)
cout
(t->left,level+1)
;//列印左子樹,並將層次加1
}int
main()
;int x,i,j,num=0;
while
(!file.
eof())
for(i=
0;i<
128;i++
) node *m[num]
,*mm[num]
;for
(i=0
;i) j=0;
for(i=
0;i<
128;i++)}
insertionsort
(m,num)
; node *p1,
*p2,
*p,*t;
j=0;for
(i=0
;i)for
(i=0
;i1;i++
) m[j-1]
=p;}
root1=m[num-1]
;int zz[
100]
; node *s,
*z;for
(i=0
;i) s=
father
(root1,mm[i]);
z=mm[i]
; j=0;
while
(s!=root1)
if(s->right==z)
z=s;
s=father
(root1,z)
; j++;}
if(s->left==z) zz[
99-j]=0
;if(s->right==z) zz[
99-j]=1
; x=0;
for(
int xx=g0;xx<
100;xx++
)for
(int xx=
0;xx<
100;xx++
)for
(int xx=x;xx<
100;xx++
)for
(int xx=
0;xx<
100;xx++)}
for(i=
0;i) cout<} file.
close()
;//再次開啟檔案
ifstream file1
("c:\\users\\wenjian\\start.txt");
//生成的中間檔案
ofstream putfile
("c:\\users\\daima\\progress.txt");
//生成壓縮.huf檔案
ofstream assicfile
("c:\\users\\wenjian\\assic.huf");
int f=
0,o=
1,w=0;
while
(!file1.
eof())
w=mm[i]
->x[j]
*o+w;
f=f+1;
}if(f==6)
}}}}
file1.
close()
; putfile.
close()
;// ifstream outfile("progress.txt");
// ofstream infile("end.txt"); /
//重新開啟中間檔案,生成最終解壓檔案
ifstream outfile
("c:\\users\\daima\\progress.txt");
ofstream infile
("c:\\users\\wenjian\\end.txt");
char y;
while
(!outfile.
eof())
if(y==
'1')}if
(outfile.
fail()
)break
; infile
} outfile.
close()
; infile.
close()
;int sum[20]
=;sumlevel
(root1,sum,0)
;levelorder
(root1,sum)
;int q=1;
for(i=
0;i<
8;i++
)int zzz=i+1;
ifstream file2
("end.txt");
while
(!file2.
eof())
if(file2.
fail()
)break;}
file2.
close()
;float g,h;
cout<<
"請分別輸入原檔案與壓縮檔案大小:"
>g;
cin>>h;
float hh=h/g;
cout<<
"壓縮率:"
<<
1-hh<}
哈夫曼編碼解碼器
總結一下這次的課程設計,遇到的問題是如何解決的。功能 將權值資料存放在資料檔案data.txt中。鍵盤輸入字符集大小n n個字元和n個權值,建立哈夫曼樹。利用建好的哈夫曼樹生成哈夫曼編碼。使用data.txt中的權值資料生成的哈夫曼編碼,將檔案text.txt中的字串編碼儲存到huffmancode...
c 實驗8 哈夫曼編碼 解碼器
此次實驗的注釋解析多加不少 若對小夥伴們有幫助 希望各位麻煩點個關注 多謝 1 由給定的n個權值構造n棵只有根結點的二叉樹,從而得到乙個二叉樹森林f 2 在二叉樹森林f中選取根結點的權值最小和次小的兩棵二叉樹作為新的二叉樹的左右子樹構造新的二叉樹,新的二叉樹的根結點權值為左右子樹根結點權值之和。3 ...
c語言實現哈夫曼編 解碼器
分析設計如下功能的哈夫曼編譯碼系統 初始化 從終端讀入字符集大小為n,以及n個字元和n個權值,建立哈夫曼樹。編碼 利用已建好的哈夫曼樹,通過計算權重值計算輸出對應字符集的哈夫曼編碼。解碼 利用已建立好的哈夫曼樹,將使用者輸入電文中的 進行解碼,解碼結果進行輸出。已經完美執行,話不多說先上 建議儲存為...