b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

哈夫曼编码数据结构c_数据结构哈夫曼树_数据结构哈夫曼树算法(3)

电脑杂谈  发布时间:2017-01-18 15:00:08  来源:网络整理

}*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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...