#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#define MAXVALUE 1000
#define MAXLEAF 30
#define MAXNODE (MAXLEAF*2-1)
#define MAXBIT 10
using namespace std;
typedef char TElemType;
typedef struct {
int weight;
int parent,lchild,rchild;
}HTNode;
typedef struct{
char bit[MAXBIT];
char ch;
int start;
}HTCode;
void HuffmanTree(HTNode HuffNode[],HTCode HuffCode[], int n){//構造哈夫曼樹
int i,j,m1,m2,x1,x2;
for(i=0;i<2*n-1;i++){
HuffNode[i].weight=0;
HuffNode[i].parent=-1;
HuffNode[i].lchild=-1;
HuffNode[i].rchild=-1;
}
printf("請輸入各個節點的元素:");
for(i=0;i<n;i++)
cin>>HuffCode[i].ch;
for(i=0;i<n;i++){
printf(" %c 的權重:",HuffCode[i].ch);
scanf("%d",&HuffNode[i].weight);
}
for(i=0;i<n-1;i++){
m1=m2=MAXVALUE;
x1=x2=0;
for(j=0;j<n+i;j++){
if(HuffNode[j].weight<m1&&HuffNode[j].parent==-1){
m2=m1;
x2=x1;
m1=HuffNode[j].weight;
x1=j;
}
else if(HuffNode[j].weight<m2&&HuffNode[j].parent==-1){
m2=HuffNode[j].weight;
x2=j;
}
}
HuffNode[x1].parent=n+i;
HuffNode[x2].parent=n+i;
HuffNode[n+i].weight=HuffNode[x1].weight+HuffNode[x2].weight;
HuffNode[n+i].lchild=x1;
HuffNode[n+i].rchild=x2;
}
}
void HuffmanCode(HTNode HuffNode[],HTCode HuffCode[], int n){//得到對應元素的編碼
HTCode cd;
int i,j,c,p;
for(i=0;i<n;i++){
cd.start=n-1;
c=i;
p=HuffNode[c].parent;
while(p!=-1){
if(HuffNode[p].lchild==c)
cd.bit[cd.start]='0';
else
cd.bit[cd.start]='1';
cd.start--;
c=p;
p=HuffNode[c].parent;
}
for(j=cd.start+1;j<n;j++)
HuffCode[i].bit[j]=cd.bit[j];
HuffCode[i].start=cd.start+1;
}
printf("------------------------\n");
for(i=0;i<n;i++){
printf(" %c 的編碼爲:",HuffCode[i].ch);
for(j=HuffCode[i].start;j<n;j++)
printf("%c",HuffCode[i].bit[j]);
printf("\n");
}
}
void HuffDecode(HTNode HuffNode[],HTCode HuffCode[], int n){//解碼
int i=0,k,j,l;
char Huff[MAXVALUE];
printf("請輸入哈夫曼編碼值:");
getchar();
loop: gets(Huff);
printf("譯碼爲:");
for(j=0;j<2*n-1;j++)
if(HuffNode[j].parent==-1)
l=j;
for(i=0;i<strlen(Huff);i++){
k=l;
while(HuffNode[k].lchild!=-1&&HuffNode[k].rchild!=-1){
if(Huff[i]=='0'){
k=HuffNode[k].lchild;
i++;
}
else if(Huff[i]=='1'){
k=HuffNode[k].rchild;
i++;
}
else {
printf("\r輸入錯誤請重新輸入:");
goto loop;
}
}
i=i-1;
printf("%c",HuffCode[k].ch);
}
}
int main(){
HTNode HuffNode[MAXNODE];
HTCode HuffCode[MAXLEAF];
char fin[MAXVALUE];
int n;
printf("請輸入節點個數:");
scanf("%d",&n);
HuffmanTree(HuffNode,HuffCode,n);
HuffmanCode(HuffNode,HuffCode,n);
HuffDecode(HuffNode,HuffCode,n);
}
哈夫曼樹編碼及反編碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.