問題描述】
利用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。其中 路徑長度 節點權值 相加...