精品文档,仅供学****与交流,如有侵权请联系网站删除
【精品文档】第 1 页
#include<iostream>
#include<string>
using namespace std;
#include<>
typedef struct{//霍夫曼树的结构体
char ch;
double weight; //权值,此处为概率
int parent,lchild,rchild;}
htnode,*hfmtree;
typedef char **hfmcode;
/*****************************全局变量*****************************/
hfmtree HT;
hfmcode HC;
int n=0;//霍夫曼树叶节点个数
int m=0;//霍夫曼树所有节点个数
int *code_length;
//用于记录每个消息字符的码长
/*****************************霍夫曼编码模块*****************************/
//对输入的字符进行检验
int Input_Char_Check()
{ int flag=1; int j;
for(int i=1;i<n&&flag;i++)
for(j=i+1;j<=n;j++)
if(HT[j].ch==HT[i].ch)
flag=0;
break;
return flag;}
//对输入的概率进行检测
int Input_Weight_Check(){
int flag=0; double sum=;
for(int i=1;i<=n;i++) {
if(!(HT[i].weight>0&&HT[i].weight<1))//概率越界
{ flag=1; return flag; }
else{ sum+=HT[i].weight;
continue; }
if(sum>1)//概率之和超过1
flag=2;
return flag;
void Select(int a,int *p1,int *p2) /*Select函数,选出HT树到a为止,权值最小和次小且parent为0的2个节点*/
int i,j,x,y;
for(j=1;j<=a;++j)
if(HT[j].parent==0)
x=j; break;
精品文档,仅供学****与交流,如有侵权请联系网站删除
【精品文档】第 2 页
for(i=j+1;i<=a;++i)
if(HT[i].weight<HT[x].weight&&HT[i].parent==0)
x=i; //选出权值最小的节点
for(j=1;j<=a;++j)
if(HT[j].parent==0&&x!=j)
y=j; break;
for(i=j+1;i<=a;++i)
if(HT[i].weight<HT[y].weight&&HT[i].parent==0
C 实现哈夫曼编码完整代码 来自淘豆网www.taodocs.com转载请标明出处.