-
大小: 12KB文件類型: .cpp金幣: 1下載: 0 次發(fā)布日期: 2021-05-08
- 語言: C/C++
- 標(biāo)簽:
資源簡介
利用哈夫曼編碼進(jìn)行信息通信可以大大提高信道利用率,縮短信息傳輸時間,降低傳輸成本。但是,這要求在發(fā)送端通過一個編碼系統(tǒng)對待傳數(shù)據(jù)預(yù)先編碼,在接收端將傳來的數(shù)據(jù)進(jìn)行譯碼(復(fù)原)。對于雙工信道(即可以雙向傳輸信息的信道),每端都需要一個完整的編/譯碼系統(tǒng)。試為這樣的信息收發(fā)站寫一個哈夫曼編/譯碼系統(tǒng)。
[基本要求]
一個完整的系統(tǒng)應(yīng)具有以下功能:
(1)I:初始化(Initialization)。從終端讀入字符集大小n,以及n個字符和n個權(quán)值,建立哈夫曼樹,并將它存于文件hfmTree中。
(2)E:編碼(Encoding)。利用已建好的哈夫曼樹(如不在內(nèi)存,則從文件htmTree中讀入),對文件ToBeTran中的正文進(jìn)行編碼,然后將結(jié)果存入文件CodeFile中。
(3)D:譯碼(Decoding)。利用已建好的哈夫曼樹將文件CodeFile中的代碼進(jìn)行譯碼,結(jié)果存入文件TextFile中。
(4)P:印代碼文件(Print)。將文件CodeFile以緊湊格式顯示在終端上,每行50個代碼。同時將此字符形式的編碼寫入文件CodePrint中。
(5)T:印哈夫曼樹(Tree Printing)。將已在內(nèi)存中的哈夫曼樹以直觀的方式(樹或凹入表形式)顯示在終端上,同時將此字符形式的哈夫曼樹寫入文件TreePrint中。
代碼片段和文件信息
#include
#include?
#include?
using?namespace?std;?
#include?
#include?
typedef?struct
{
?char?character;
?unsigned?int?weight;
?unsigned?int?parentlchildrchild;
}HTNode*HuffmanTree;
typedef?char?**HuffmanCode;
char?*c;
FILE?*ff;
int?L;
struct?H{
???????char?s[1000];
???????};
???????H?hc[1000];
HuffmanTree?HT;???????????????????
HuffmanCode?HC;????????????????????
void?menu()??????????????????????????????????????????????????????//定義菜單函數(shù)
{
?printf(“please?make?the?choice:\n“);
?cout<<“*****?????I:?初始化????????*****“< ?cout<<“*****?????E:編碼??????????*****“< ?cout<<“*****?????D:譯碼??????????*****“< ?cout<<“*****?????P:印代碼文件????*****“< ?cout<<“*****?????T:?印赫夫曼樹????*****“< ?cout<<“*****?????Q:?退出??????????*****“< }
void?Select(HuffmanTree?&HTint?endint?&s1int?&s2)????????????//選擇權(quán)值最小的兩個結(jié)點(diǎn)
{
?int?i;
?int?weight1weight2;???????????????????????????????????????????//定義兩個最小權(quán)值
?weight1=weight2=1000;??????????????????????????
?
?for(i=1;i<=end;i++)
?{
??if(HT[i].parent==0?&&?HT[i].weight ??{
???weight1?=?HT[i].weight;
???s1?=?i;
??}
?}
?for(i=1;i<=end;i++)
?{
??if(HT[i].parent==0?&&?HT[i].weight ??{
???weight2?=?HT[i].weight;
???s2?=?i;
??}
?}
?
}
void?Initialization(HuffmanTree?&HTHuffmanCode?&HC)???????????????????//初始化赫夫曼樹
{
?FILE?*fp*fp1;
?fp=fopen(“hfmTree.txt““w+“);?????????????????????????//以寫的方式打開文件,如果文件不存在,則創(chuàng)建文件?
?fp1=fopen(“ht.txt““w+“);?????????????????????????????//編輯兩個文件?
?int?mnis1s2startfb;
?int?*w;
?char?*cd;
?bool?flag?=?true;?????????????????????????????????????//布爾類型?
?printf(“please?input?n:?\n“);
?scanf(“%d“&n);
?fprintf(fp“%d\n“n);?????????????????????????????????//將常規(guī)變量格式化輸出到指定文件?
?fprintf(fp1“%d\n“n);
?if(n<=1)return;
?w=(int?*)malloc((n+1)*sizeof(int));???????????????????//動態(tài)申請數(shù)組空間存儲結(jié)點(diǎn)的權(quán)值
?c=(char?*)malloc((n+1)*sizeof(char));?????????????????//動態(tài)申請數(shù)組空間存儲結(jié)點(diǎn)字符
????printf(“please?input?character?and?weight:?\n“);
????for(i=1;i<=n;i++)
?{
??fflush(stdin);
??cout<<“請輸入第“<??scanf(“%c“&c[i]);
??scanf(“%d“&w[i]);
?}
?m=2*n-1;??????????????????????????????????????????????//有n個葉子的huffman樹共有2*n-1個結(jié)點(diǎn)
?HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
?for(i=1;i<=n;i++)?????????????????????????????????????//初始化赫夫曼樹
?{?????????????????????????????????????????????????????//葉子賦字符和權(quán)值?
??HT[i].character=c[i];
??HT[i].weight=w[i];
??HT[i].parent=0;??????????????????????????????????????//清華大學(xué)數(shù)據(jù)結(jié)構(gòu)P149頁表格直觀顯示存儲結(jié)構(gòu)
??HT[i].lchild=0;
??HT[i].rchild=0;
?}
?for(i=n+1;i<=m;++i)
?{?????????????????????????????????????????????????????//非葉子節(jié)點(diǎn)置零?
??HT[i].character=0;
??HT[i].weight=0;
??HT[i].parent=0;
??HT[i].lchild=0;
??HT[i].rchild=0;
?}
?for(i=n+1;i<=m;++i)????????????????????????????????????//選擇權(quán)值最小的兩個結(jié)點(diǎn)?
?{
??Select(HTi-1s1s2);???????????????????????????
??HT[s1].parent=i;
??HT[s2].parent=i;
??HT[i].lch
- 上一篇:24點(diǎn)游戲.cpp
- 下一篇:課程設(shè)計--計算器基于MFC
評論
共有 條評論