-
大小: 342KB文件類型: .rar金幣: 2下載: 0 次發(fā)布日期: 2021-05-29
- 語言: C/C++
- 標簽: 哈夫曼??數(shù)據(jù)結構??c++??
資源簡介
數(shù)據(jù)結構的哈夫曼樹,能輸入任意字符串,并計算出現(xiàn)頻率,同時統(tǒng)計編碼長度,可編碼,可解碼,能計算壓縮比,可執(zhí)行程序包括實驗報告

代碼片段和文件信息
#include
#include
#define?max?100
char?cha[max]string[max];
char?Hcode[max-1][max];
struct?huftree??????????????????????????????????????????????//huffman節(jié)點存儲結構
{
????int?weight;
????int?lchild;
int?rchild;
int?parent;
};
class?Huff
{
public:
void?selectmin(huftree?tree[]int?k);???????????????????//權值最小的兩個節(jié)點
????void?huffman(huftree?tree[]int?*wint?n);??????????????//生成huffman樹
????void?CreateTable(huftree?tree[]char?code[]int?nint?len[]int?weight[]int?length1);?????//生成哈夫曼編碼
????void?encode(int?n);?????????????????????????????????????//將從鍵盤上接收的字符轉(zhuǎn)變?yōu)楣蚵幋a
????void?decode(char?ch[]huftree?tree[]int?n);????????????//將從鍵盤上接收的二進制碼解碼為字符
private:
int?min1;
int?min2;
};
void?Huff::selectmin(huftree?tree[]int?k)??????????????????//找出權值最小的兩個節(jié)點
{
????int?i;
????for?(i=1;i<=k?&&?tree[i].parent!=0?;i++);?
min1=i;
????for?(i=1;i<=k;i++)
????????if?(tree[i].parent==0?&&?tree[i].weight min1=i;tree[i].weight=max;
????for?(i=1;i<=k;i++)
????????if?(tree[i].parent==0?&&?i!=min1)?
break;?
min2=i;
????for?(i=1;i<=k;i++)
????????if?(?tree[i].parent==0?&&?i!=min1?&&?tree[i].weight min2=i;tree[i].weight=max;
}
void?Huff::huffman(huftree?tree[]int?*wint?n)??????????????//生成huffman樹
{??
int?mi;
????if?(n<=1)?return;
????m=2*n-1;
????for?(i=1;i<=n;i++)
????{?
tree[i].weight=w[i];?tree[i].parent=0;
????????tree[i].lchild=0;????tree[i].rchild=0;?
}
????for?(i=n+1;i<=m;i++)
????{?
tree[i].weight=0;???tree[i].parent=0;
????????tree[i].lchild=0;???tree[i].rchild=0;?
}
????for?(i=n+1;i<=m;i++)
????{??
selectmin(tree?i-1);
????????tree[min1].parent=i;
????????tree[min2].parent=i;
????????tree[i].lchild=min1;
????????tree[i].rchild=min2;?????
????????tree[i].weight?=tree[min1].?weight+?tree[min2].weight;
?????}
}
void?Huff::CreateTable(huftree?tree[]char?code[]int?nint?len[]int?weight[]int?length1)???//生成哈夫曼編碼
{
int?startcipm;
????code[n-1]=‘\0‘;
float?length2=0;
????cout<<“各字符的哈夫曼編碼為:“< ????for(i=1;i<=n;i++)
{
????m=0;
start=n-1;
????????for(c=ip=tree[i].parent;p!=0;c=pp=tree[p].parent)
{
if(tree[p].lchild==c)
code[--start]=‘0‘;
????????????else?
code[--start]=‘1‘;
m++;
}
????????strcpy(Hcode[i]&code[start]);
????????cout< len[i]=m;
}
cout< ????for(int?j=0;j<=n;j++)
????????length2+=len[j]*weight[j];
length2=length2/8;
cout<<“編碼后字符串的大小為:“< ????<<“壓縮比為:“< }
void?Huff::encode(int?n)??????????????????????????????????//將從鍵盤上接收的字符轉(zhuǎn)變?yōu)楣蚵幋a
{
????cout< ????for?(int?i=0;string[i]!=‘\0‘;i++)
????{
????????for(int?j=0;string[i]!=cha[j]&&j<=n;)?j++;
????????if?(j<=n)??cout< ????}
????cout< }
void?Huff::decode(char?ch[]huftree?tree[]int?n)?????????//將從鍵盤上接收的二進制碼解碼為字符
{
int?ijm;char?b;
????m=2*n-1;
?
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????233568??2010-12-23?23:50??ffffeeee\Debug\ffffeeee.exe
?????文件?????262088??2010-12-23?23:50??ffffeeee\Debug\ffffeeee.ilk
?????文件?????250324??2010-12-23?23:50??ffffeeee\Debug\ffffeeee.pch
?????文件?????443392??2010-12-23?23:50??ffffeeee\Debug\ffffeeee.pdb
?????文件??????18276??2010-12-23?23:50??ffffeeee\Debug\main.obj
?????文件??????41984??2010-12-27?20:41??ffffeeee\Debug\vc60.idb
?????文件??????61440??2010-12-23?23:50??ffffeeee\Debug\vc60.pdb
?????文件???????4304??2010-12-23?23:52??ffffeeee\ffffeeee.dsp
?????文件????????524??2010-12-23?23:49??ffffeeee\ffffeeee.dsw
?????文件??????41984??2010-12-27?20:42??ffffeeee\ffffeeee.ncb
?????文件??????53760??2010-12-27?20:42??ffffeeee\ffffeeee.opt
?????文件????????250??2010-12-27?20:41??ffffeeee\ffffeeee.plg
?????文件???????4694??2010-12-23?23:50??ffffeeee\main.cpp
?????文件?????162816??2010-12-23?19:07??ffffeeee\哈夫曼編(解)碼器.doc
?????目錄??????????0??2010-12-23?23:50??ffffeeee\Debug
?????目錄??????????0??2010-12-27?20:42??ffffeeee
-----------?---------??----------?-----??----
??????????????1579404????????????????????16
評論
共有 條評論