近期學習資料結構碰到huffman編碼與解碼問題,自己動手寫了一些,注釋比較全,ok,下面直接貼**。
#include
#include
#define telemtype char
#define wtype int
#define leafnumber 5 //預設權重集合大小
#define totalnumber 9 //樹節點個數=2*leafnumber-1
using namespace std;
struct huffmannode{ //樹結點的類定義
telemtype data; //資料
wtype weight; //權重
string code="huffman編碼:";
int lchild,rchild,parent; //指標
struct huffmantree{ //huffman樹結構定義
huffmannode elem[totalnumber]; //樹儲存陣列(靜態鍊錶)
int currentnumber; //當前外結點個數
void createhuffmantree( huffmantree& ht ,telemtype data, wtype w , int n ){
int i,j,p1,p2,min1,min2,maxvalue=10000; //p1記錄最小,p2記錄最小
for(i=0;iht.elem[i].data=data[i];
ht.elem[i].weight=w[i]; //對第i個葉子節點賦權重
for(i=0;i<2*n-1;i++)
ht.elem[i].parent=ht.elem[i].lchild=ht.elem[i].rchild=-1; //初始化所有結點的左,右孩子標誌和父標誌為-1
for(i=n;i<2*n-1;i++){
min1=min2=maxvalue;
for(j=0;jif(ht.elem[j].parent==-1) //父指標為空時才有資格參選
if(ht.elem[j].weightp2=p1;min2=min1; //原來最小的變為次小
p1=j;min1=ht.elem[j].weight; //記下新的最小
else if(ht.elem[j].weightp2=j;min2=ht.elem[j].weight; //記下新的次小
ht.elem[i].lchild=p1; //左最小
"0";
ht.elem[i].rchild=p2; //右次小
"1";
ht.elem[i].weight=ht.elem[p1].weight+ht.elem[p2].weight;
ht.elem[p1].parent=ht.elem[p2].parent=i; //鏈結父結點
ht.currentnumber=2*n-1;
void insert( int father , huffmantree &ht )
if(ht.elem[father].rchild!=-1||ht.elem[father].lchild!=-1)
ht.elem[ht.elem[father].lchild].code=ht.elem[father].code+"0";
ht.elem[ht.elem[father].rchild].code=ht.elem[father].code+"1";
insert( ht.elem[father].lchild , ht );
insert( ht.elem[father].rchild , ht );
void code( huffmantree &ht )
int i,root;
for(i=0;iif(ht.elem[i].parent==-1)
break;
root=i;
//coutvoid code(huffmantree& ht)
int i;
for(i=0;iint j=i;
while(ht.elem[j].parent!=-1){
if(ht.elem[ht.elem[j].parent].rchild==j)
ht.elem[j].code="1"+ht.elem[j].code;
if(ht.elem[ht.elem[j].parent].lchild==j)
ht.elem[j].code="0"+ht.elem[j].code;
j=ht.elem[i].parent;
void output( huffmantree& ht )
int i;
for(i=0;icoutcout<<"請輸入電文(0,1所組成的字串):"cin>>ch;
int i,root;
for(i=0;iif(ht.elem[i].parent==-1)
break;
root=i;
int father;
cout<<"解碼:";
for(i=0;ch[i]!='\0';)
father=root;
while(ht.elem[father].lchild !=-1)
if(ch[i]=='0')
father=ht.elem[father].lchild;
else if(ch[i]=='1')
father=ht.elem[father].rchild;
i++;
couthuffmantree ht;
int n,i;
cout<<"請輸入葉子結點個數">n;
wtype w[n];
telemtype data[n];
cout<<"請輸入結點代號(字元)">data[i];
cout<<"請輸入結點權重">w[i];
createhuffmantree( ht ,data, w , n );
code( ht ); //編碼
output( ht );
trans( ht ); //解碼
Huffman編碼與解碼的實現
huffman編碼相信學過資料結構這麼課的都知道,概念也比較好理解,但是一般好理解的演算法,在實際實現的過程中總是會遇到各種問題,一方面個人認為是對演算法的實現過程不熟,另一方面在實際實現的過程中可以提公升自己實現演算法的能力,將自己的想法實現後還是比較滿足的。下面是本人親自實現的huffman編碼...
Huffman編碼與解碼C 程式
huffman.h 葉子結點為n的哈夫曼樹共有2n 1個結點 ifndef huffman h define huffman h class huffmannode huffmannode const char data,const double wt,const int pa 1,const in...
哈夫曼(Huffman)編碼與解碼
利用哈夫曼編碼進行資訊通訊可以大大提高通道利用率,縮短資訊傳輸時間,降低傳輸成本。但是,這要求在傳送端通過乙個編碼系統對待傳輸資料預先編碼,在接收端將傳來的資料進行解碼。對於雙工通道,每端都需要乙個完整的編碼 解碼系統。試為這樣的資訊收發站寫乙個哈夫曼的編 解碼系統。乙個完整的系統具有以下幾種操作 ...