}*tre;
struct shfm
{
char date;//字符数据
int len;//编码长度
char bianm[11];//哈夫曼编码,最大编码数为11(可根据实际修改!)
}hfm[100];//哈夫曼编码对应真实数据表
void gettree(tree tr[],int shij,intyoux)//构造哈夫曼树,tr树集合,shij集合实际数据个数,youx集合有效数据个数
{
//模拟动态增长数组,每次构造新的树就插入有效数据后面
if (2*youx-1!=shij)
{
printf('参数不符合!');
return;
}
int c=0;
while(youx!=shij)//当有效个数==实际个数时,构造完成!
{
for (int i=c;i
{
//每次循环取两个最小值并将两个最小值放置在当前循环起始两位
if (tr[i].quanzhi
{
tree p=tr[i];
tr[i]=tr[c];
tr[c]=p;
}
if (tr[i].quanzhi
{
tree p=tr[i];
tr[i]=tr[c+1];
tr[c+1]=p;
}
}
//以下为通过最小值构造的新树
tr[youx].quanzhi=tr[c].quanzhi+tr[c+1].quanzhi;
tr[youx].you=&tr[c];//新树右孩子指向当前循环的最小值之一
tr[youx].zuo=&tr[c+1];//新树左孩子指向当前循环的最小值之一
youx++;//新树插入当前有效数据个数后面 并使有效数据个数+1
c=c+2;
}
return ;
}
void bianltree(tree *tr)//哈夫曼编码
{
//通过遍历树,得到每个节点的编码
static char ch[100];
static int i=0;
if (!tr->min)//叶子节点
{
ch[i]='0';
i++;
bianltree(tr->zuo);//左节点编码为'0'
ch[i]='1';
i++;
bianltree(tr->you);//右节点编码为'1'
}
if (tr->min)
{
ch[i]='\0';//结束标记()
printf('%c %s \n',tr->date,ch);
hfm[hfmb].date=tr->date;
hfm[hfmb].len=i;
int j=0;
while(j!=i||i>10)
{
hfm[hfmb].bianm[j]=ch[j];
j++;
}//保存编码映射表
hfmb++;
}
i--;//递归走入右节点时,取消当前赋值(当前必为左边叶子节点)
}
void chushihuahmf(tree *hfmtree,char *str,int i)
{//初始化哈夫曼树数组!参数:含哈夫曼树数组,待编码数据串,数据串长度
int j=0;
while(*str)
{//初始化有效的数组元素
hfmtree->date=*str;//待编码数据
hfmtree->min=true;//是否叶子节点
hfmtree->quanzhi=*str;//权值
str++;
hfmtree++;
j++;
}
while(j<=2*i-2)
{
//初始化非有效数组元素
hfmtree->min=false;//全部非叶子节点
j++;
hfmtree++;
}
//注:本函数权值是根据字符ascll码判断!可根据实际情况重新定义初始化函数!
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-27154-3.html
必须抵制美国货