赫夫曼程式設計C語言實現

2021-09-06 04:01:24 字數 1981 閱讀 4618

問題描述】

利用huffman編碼進行通訊可以大大提高通道利用率,縮短資訊傳輸時間,降低傳輸成本。但是,這要求在傳送端通過乙個編碼系統對待傳資料預先編碼,在接受端將傳來的資料編碼進行解碼(復原)。對於有些通道,每端都需要乙個完整的編/解碼系統。試為這樣的資訊收發站編寫乙個huffman的編/解碼系統。給定一組權值,構造一棵赫夫曼樹,並計算帶權路徑長度wpl。

【資料描述】

//- - - - - 赫夫曼樹的儲存表示 - - - - -

typedef struct htnode;    //用順序儲存結構表示赫夫曼樹的結點結構定義

//動態分配陣列儲存huffman編碼表

【演算法描述】

1.初始化:從鍵盤讀入n個字元,以及它們的權值,建立huffman樹

2.編碼:根據建立的huffman樹,求每個字元的huffman編碼。對給定的待編碼字串行進行編碼。

3.解碼:利用已經建立好的huffman樹,對上面的編碼結果解碼。解碼的過程是分解電文中的字串,從根結點出發,按字元』0』和』1』確定找左孩子或右孩子,直至葉結點,便求得該子串相應的字元。

4.列印 huffman樹。

【c源程式】

/*實現初始化,建立huffman樹,並完成字元的編碼*/

#include

#define n 10     /*待編碼字元的個數,即樹中葉結點的最大個數*/

#define m 2*n-1  /*樹中總的結點數目*/

typedef structhtnode;  /*樹中結點的結構*/

typedef struct htcode;

void init(htcode hc,int *n)htnode,*huffmantree;

typedef struct

char ch;

char *chs;

}huffmancode;

typedef struct

char ch;

int weight;

}sw;

typedef struct

huffmantree ht;

huffmancode *hc;

}huf;

void select(htnode * ht,int n,int *n1,int *n2)

int i=1;

int n3;

while(ht[i].parent!=0)

i++;

*n1=i;

i++;

while(ht[i].parent!=0)         i++;

*n2=i;

if(ht[*n1].weight

for(i++;i<=n;i++)

if(ht[i].parent==0)

for(;i<=m;i++,p++)

for(i=n+1;i<=m;i++)

select(ht,i-1,&s1,&s2);

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;

hc=(huffmancode *)malloc((n+1)*sizeof(char));

cd=(char *)malloc(n*sizeof(char));

cd[n-1]='\0';

for(i=1;i<=n;i++)

p=i;

}*r='\0';

printf("the chars are:");

puts(chars3);

}void input(int *n,sw *w)

int i;

printf("input the count of char:");   /*輸入字元的數目*/

scanf("%d",n);

for(i=1;i<=*n;i++,w++)

void main()

赫夫曼樹的c語言實現

一顆有n個葉子結點的赫夫曼樹共有2 n 1,可以儲存在乙個一維陣列中。編碼時候需要從葉子到根的路徑。故對每乙個結點而言,需要知道雙親的資訊和孩子的資訊。故利用以下儲存結構 typedef struct htnode,huffmantree 動態分配陣列儲存赫夫曼樹赫夫曼樹的構造演算法 1.每次從樹的...

赫夫曼樹 C 實現

赫夫曼樹,即最優二叉樹。給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。構造赫夫曼樹 1.把節點的權值按從小到大的順序排列。2.從序列中取出前兩個...

赫夫曼樹簡單實現

給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。權值可以看作節點中存放的值,路徑長度即為該葉子節點所處的層數減去1。其中 路徑長度 節點權值 相加...