Huffman編碼與解碼

2021-07-09 09:25:16 字數 3087 閱讀 6409

近期學習資料結構碰到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)編碼與解碼

利用哈夫曼編碼進行資訊通訊可以大大提高通道利用率,縮短資訊傳輸時間,降低傳輸成本。但是,這要求在傳送端通過乙個編碼系統對待傳輸資料預先編碼,在接收端將傳來的資料進行解碼。對於雙工通道,每端都需要乙個完整的編碼 解碼系統。試為這樣的資訊收發站寫乙個哈夫曼的編 解碼系統。乙個完整的系統具有以下幾種操作 ...