資源簡(jiǎn)介
問題描述:對(duì)任意輸入的一段英文,為每個(gè)字符編制其相應(yīng)的赫夫曼編碼;并利用該編碼為任意輸入的0、1序列進(jìn)行解碼.
基本要求:一個(gè)完整的系統(tǒng)應(yīng)具有以下功能:
(1)初始化 從終端讀入一段英文字符,統(tǒng)計(jì)每個(gè)字符出現(xiàn)的頻率,建立赫夫曼樹,并將該樹存入某文件;
(2)編碼 利用建好的赫夫曼樹對(duì)各字符進(jìn)行編碼,用列表的形式顯示在屏幕上,并將編碼結(jié)果存入另一文件中;
(3)解碼 利用保存的赫夫曼編碼,對(duì)任意輸入的0,1序列能正確解碼;

代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#define?STRLEN?70
using?namespace?std;
typedef?struct
{
unsigned?int?weight;
unsigned?int?parentlchildrchild;
char?letter;
}HTNode*HuffmanTree;
typedef?char?*?*?HuffmanCode;
typedef?struct?
{
char?letter;
int?times;
int?weight;
}Character*String;
void?Frequency(String?&strint?&count)
{
char?ch;
int?ijk;
str=(String)malloc((STRLEN+1)*sizeof(Character));
????ch=getchar();
????if(ch==‘\n‘){cout<<“輸入為空!“< str[1].letter=ch;str[1].times=1;
count=1;
i=2;
h:for(;i<=STRLEN;++i)
{
ch=getchar();
if(ch==‘\n‘)break;
for(j=1;j<=count;j++)
if(str[j].letter==ch){str[j].times++;goto?h;}
str[++count].letter=ch;
str[count].times=1;
}
for(k=1;k<=count;k++)
str[k].weight=100*str[k].times/(i-1);
}
void?Select(HuffmanTree?Tint?nint?&s1int?&s2)
{
int?imin1min2;
for(i=1;i<=n;i++)
{
if(T[i].parent==0)
{
min1=T[i].weight;
s1=i;
break;
}
}
for(i=1;i<=n;i++)
{
if(T[i].parent==0&&T[i].weight {
min1=T[i].weight;
s1=i;
}
}
for(i=1;i<=n;i++)
{
if(T[i].parent==0&&i!=s1)
{
min2=T[i].weight;
s2=i;
break;
}
}
for(i=1;i<=n;i++)
{
if(i==s1)continue;
if(T[i].parent==0&&T[i].weight {
min2=T[i].weight;
s2=i;
}
}
}
void?HuffmanCoding(HuffmanTree?&HTHuffmanCode?&HCString?strint?n)
{
int?mijs1=1s2=1startcf;
HTNode?*p;char?*cd;
ofstream?htreehcode;
htree.open(“huffmantree.txt“);
hcode.open(“huffmancode.txt“);
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
p=HT;
for(i=1;i<=n;++i)
{
p[i].weight=str[i].weight;
p[i].letter=str[i].letter;
p[i].parent=0;p[i].lchild=0;p[i].rchild=0;
}
for(;i<=m;++i)
{
p[i].weight=0;p[i].parent=0;
p[i].lchild=0;p[i].rchild=0;
}
for(i=n+1;i<=m;++i)
{
Select(HTi-1s1s2);
HT[s1].parent=i;HT[s2].parent=i;
HT[i].lchild=s1;HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
for(i=1;i<=m;i++)
{
if(i<=n)
htree< else
????????htree<<“*?“< }
htree.close();
HC=(HuffmanCode)malloc((n+1)*sizeof(char?*));
cd=(char?*)malloc(n*sizeof(char));
cd[n-1]=‘\0‘;
for(i=1;i<=n;++i)
{
start=n-1;
for(c=if=HT[i].parent;f!=0;c=ff=HT[f].parent)
if(HT[f].lchild==c)cd[--start]=‘0‘;
else?cd[--start]=‘1‘;
HC[i]=(char?*)malloc((n-start)*sizeof(char));
strcpy(HC[i]&cd[start]);
}
cout<<“對(duì)應(yīng)的哈弗曼編碼是:“< for(i=1;i<=n;i++)
{
cout< for(j=0;HC[i][j]!=‘\0‘;j++)
cout< cout< }
????for(i=1;i<=n;i++)
{
hcode< for(j=0;HC[i][j]!=‘\0‘;j++)
hcode< hcode< }
hcode.close();
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件???????4065??2010-05-18?13:42??實(shí)驗(yàn)3\5323.cpp
?????文件???????3377??2010-11-05?14:18??實(shí)驗(yàn)3\5323.dsp
?????文件??????48640??2010-11-05?14:18??實(shí)驗(yàn)3\5323.opt
?????文件????????242??2010-11-05?14:18??實(shí)驗(yàn)3\5323.plg
?????文件?????561217??2010-05-18?13:49??實(shí)驗(yàn)3\Debug\5323.exe
?????文件?????804948??2010-05-18?13:49??實(shí)驗(yàn)3\Debug\5323.ilk
?????文件?????257052??2010-05-18?13:49??實(shí)驗(yàn)3\Debug\5323.obj
?????文件????2108020??2010-05-13?19:50??實(shí)驗(yàn)3\Debug\5323.pch
?????文件????1123328??2010-05-18?13:49??實(shí)驗(yàn)3\Debug\5323.pdb
?????文件??????74752??2010-11-05?14:18??實(shí)驗(yàn)3\Debug\vc60.idb
?????文件?????110592??2010-05-18?13:49??實(shí)驗(yàn)3\Debug\vc60.pdb
?????文件?????????24??2010-11-05?14:18??實(shí)驗(yàn)3\huffmancode.txt
?????文件?????????87??2010-11-05?14:18??實(shí)驗(yàn)3\huffmantree.txt
?????目錄??????????0??2010-05-18?13:49??實(shí)驗(yàn)3\Debug
?????目錄??????????0??2010-11-05?14:18??實(shí)驗(yàn)3
-----------?---------??----------?-----??----
??????????????5096344????????????????????15
- 上一篇:springboot與netty整合
- 下一篇:雪花圣誕禮物
評(píng)論
共有 條評(píng)論