哈夫曼樹編碼及反編碼

#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);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章