⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 哈夫曼编码.cpp

📁 结构清晰的哈夫曼编码,哈夫曼编码,对于初学者很有帮助.程序有注释
💻 CPP
字号:
#define INT_MAX 10000
#define ENCODING_LENGTH 1000
#include "stdio.h"
#include "string.h"
#include "malloc.h"
typedef enum{none,left_child,right_child}Which;//标记是左孩子还是右孩子
typedef char Elemtype;//元素类型
typedef struct TNode{
    Elemtype letter; 
    int weight;
    int parent;
    Which sign;
    char *code;
}HTNode,*HuffmanTree;
int n;
char coding[50];//储存代码
char str[ENCODING_LENGTH];//保存要翻译的句子
void InitTreeNode(HuffmanTree &HT){//初始前N个结点,后M-N个结点置空
    int i;int w;char c;
    int m=2*n-1;
    HuffmanTree p;
    HT=(HuffmanTree)malloc((m)*sizeof(HTNode));
    printf("Input %d database letter and weight:",n);
	printf("(For example:a1b2c3d4)\n");
    p=HT;
    getchar();
    for (i=1;i<=n;i++){
        scanf("%c%d",&c,&w);
        p->code='\0';
        p->letter=c;
        p->parent=0;
        p->sign=none;
        p->weight=w;
        p++;
    }
    for (;i<=m;i++,p++){
        p->code='\0';
        p->letter=' ';
        p->parent=0;
        p->sign=none;
        p->weight=0;
    }
}//INITTREENODE
void Select(HuffmanTree HT,int end,int *s1,int *s2){//在0~END之间,找出最小和次小的两个结点序号,返回S1,S2
int i;
int min1=INT_MAX;
int min2;
for (i=0;i<=end;i++){//找最小的结点序号
     if (HT[i].parent==0&&HT[i].weight<min1){ 
         *s1=i;
         min1=HT[i].weight;
}
}
     min2=INT_MAX;
      for(i=0;i<=end;i++){//找次小结点的序号
          if (HT[i].parent==0&&(*s1!=i)&&min2>HT[i].weight){
              *s2=i;
              min2=HT[i].weight;
          }
      }
}
void HuffmanTreeCreat(HuffmanTree &HT){//建立HUFFMAN树
    int i;int m=2*n-1;
    int s1,s2;
    for(i=n;i<m;i++){
        Select(HT,i-1,&s1,&s2);
        HT[s1].parent=i;
        HT[s2].parent=i;
        HT[s1].sign=left_child;
        HT[s2].sign=right_child;
        HT[i].weight=HT[s1].weight+HT[s2].weight;
    }
}

void HuffmanTreeCode(HuffmanTree HT){//HUFFMAN译码
int i;
char *temp;
temp=(char *)malloc(n*sizeof(char));
temp[n-1]='\0';
int p;int s;
for (i=0;i<n;i++){
     p=i;
     s=n-1;
    while (HT[p].parent!=0){//从结点回溯,左孩子为0,右孩子为1
        if (HT[p].sign==left_child)
              temp[--s]='0';
        else if (HT[p].sign==right_child)
            temp[--s]='1';
        p=HT[p].parent;
    }
    HT[i].code=(char *)malloc((n-s)*sizeof(char));//分配结点码长度的内存空间
    strcpy(HT[i].code,temp+s);
    printf("%s\n",HT[i].code);    
}
}
void GetCodingSen(char *sentence){//输入要编码的句子
    int l;
	getchar();
	printf("Please input your letters.");
	printf("(For example:abcd)\n");
    gets(sentence);
    l=strlen(sentence);
    sentence[l]='\0';
}
void HuffmanTreeEncoding(char sen[],HuffmanTree HT){//将句子进行编码
int i=0;int j;
while(sen[i]!='\0'){
    for(j=0;j<n;j++){
        if (HT[j].letter==sen[i]) //字母吻合则用代码取代
        {strcat(coding,HT[j].code);
        break;
        }
    }
    i++;
    if (sen[i]==32) i++;
}
printf("The codes refered to the letters is:\n");
printf("(Following up-steps,you will see:110111100.110:a 111:b 10:c 0:d)");
printf("\n%s",coding);
}
void main(){
	printf("This project accomplishs the turn between letter and code.\n");
    HTNode hnode;
    HuffmanTree huff;
    huff=&hnode;
    printf("Input the letter for coding number:");
	printf("(For example:4)\n");
    scanf("%d",&n);
    InitTreeNode(huff);
    HuffmanTreeCreat(huff);
    HuffmanTreeCode(huff);
    GetCodingSen(str);
    HuffmanTreeEncoding(str,huff);
	getchar();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -