问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言,数据结构,哈夫曼编/译码器

发布网友 发布时间:2022-04-25 16:58

我来回答

1个回答

热心网友 时间:2023-10-20 22:01

哈弗曼编码

#include<stdio.h>

#include<stdlib.h>

typedef struct Huffman

{

int w;    //权值

int l,r,p;//左孩子,右孩子,父亲

}HF;

int *p=NULL;

int Find(HF **hf,int val,int n)//在查找值为val的下标

{

int i;

for(i=1;i<=n;i++)

{

if(p[i]!=1)

{

if((*hf)[i].w==val)

{

p[i]=1;

break;

}

}

}

return i;

}

int Min(HF **hf,int n)//查找1~n中最小的权值

{

int i,min=1000;

for(i=1;i<=n;i++)

{

if(p[i]!=1)

{

if((*hf)[i].w<min)

min=(*hf)[i].w;

}

}

return min;

}

void Select(HF **hf,int *s1,int *s2,int n)//在第1~n中找出最小的两个权值

{

*s1=Find(hf,Min(hf,n),n);

*s2=Find(hf,Min(hf,n),n);

}

void Createhf(HF**hf,char **ch,int w[],int n)

{

int i,j;

int tmp1;

int s1,s2;

char *hfcode=NULL;

*hf=(HF*)malloc(sizeof(HF)*2*n);

p=(int*)malloc(sizeof(int)*2*n);

memset(p,0,sizeof(int)*2*n);

for(i=1;i<=n;i++)//初始化叶子节点

{

(*hf)[i].w=w[i-1];//给1~n个叶子节点赋权值

(*hf)[i].p=0;

(*hf)[i].r=0;

(*hf)[i].l=0;

}

for(;i<2*n;i++)//给n+1~2n-1个父节点初始化

{

(*hf)[i].w=0;

(*hf)[i].l=0;

(*hf)[i].r=0;

(*hf)[i].p=0;

}

for(i=n+1;i<2*n;i++)

{

Select(hf,&s1,&s2,i-1);

(*hf)[i].w=(*hf)[s1].w+(*hf)[s2].w;

(*hf)[i].l=s1;    

(*hf)[i].r=s2;      

(*hf)[s1].p=(*hf)[s2].p=i; 

}

hfcode=(char*)malloc(n+1);

hfcode[n]='\0';

tmp1=n-1;                              

for(i=1;i<=n;i++)

{

for(j=i;(*hf)[j].p!=0;j=(*hf)[j].p) 

{

if(j==(*hf)[(*hf)[j].p].l)    

{

hfcode[tmp1--]='0';      

}

else if(j==(*hf)[(*hf)[j].p].r) 

{

hfcode[tmp1--]='1';       

}

}

        strcpy(ch[i-1],&hfcode[++tmp1]);   

tmp1=n-1;

}

free(hfcode);

hfcode=NULL;

}

void main()

{

HF *hf=NULL;

int n,i;

char**ch=NULL;

int *w=NULL;

puts("请输入叶子结点数:");

scanf("%d",&n);

ch=(char**)malloc(sizeof(char *)*n);

    for(i=0;i<n;i++)

{

ch[i]=(char*)malloc(sizeof(char)*10);

}

w=(int*)malloc(sizeof(int)*n);

puts("请输入叶子节点的权值:");

for(i=0;i<n;i++)

{

scanf("%d",&w[i]);

}

Createhf(&hf,ch,w,n);

for(i=0;i<n;i++)

{

puts(ch[i]);

}

free(ch);

ch=NULL;

free(w);

w=NULL;

free(hf);

hf=NULL;

free(p);

p=NULL;

}

运行结果

望采纳!

追问这明显不对啊,要有初始化,编码,译码,打印这几个啊

追答你可以把输入那块改成初始化

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
刺身怎么下刀? 养老护理员资格证的等级是什么 养老护理员证有几级啊 工行手机银行如何提前还房贷 工行手机银行提前还房贷操作 工行手机银行app可以提前房贷还款吗_工行手机银行提前还房贷步骤... 金龙八部是什么时出版的 天龙八部陈浩民那一年出版的 金庸作品集:天龙八部图书信息 puum243请到柜面、网银或手机银行修改密码? 超重被交警抓一般怎么处理 哈夫曼编/译码器 数据结构实践题 数据结构哈夫曼编码流程图 QQ个性背景墙的图片。要多点类似这样的。反正只要好看就可以。推荐多点哦。 数据结构(C语言)-哈夫曼编码求助!! c++数据结构哈夫曼编码问题 qq背景墙图片带(我非良人)4个字的,求图, 一道关于求哈夫曼编码的数据结构题,求解答 数据结构哈夫曼编码问题,请高手帮忙 哈夫曼树及哈夫曼编码的C程序实现(数据结构题) 算法与数据结构哈夫曼编码及应用 数据结构,第二题,哈夫曼编码, 过程详细说明一下,谢谢 一个关于数据结构的问题,有关哈夫曼编码的,解答看不懂,求解答,谢谢! 数据结构之哈夫曼编码 求解,关于数据结构的哈夫曼编码的问题 利用 数据结构 实现 哈夫曼编码/译码实现 数据结构中的哈夫曼编码 哈夫曼编码的原理是什么? 氢气球到底是氢气还是氮气 氢气球一般能挺多久 氢气球是什么做得? 用这个做QQ背景墙,能反映出他是个怎样的人,求解 vivo手机通话录音保存在哪里可以找到 vivo手机怎么找电话录音? 用vivo手机打电话时一边打一边录音,但是找不到录音的音频文件? 电话的通话录音,录完后到那里去找出来重放啊? 美元指数上涨现货黄金就会下降,为什么黄金和美元指数一直呈现负相关的关系呢? vivo Xm手机通话录音在哪里存放? 美元指数和黄金T+D有怎样的关系,比如,美元指数98.2对应黄金多少元每克 美元指数与外汇黄金什么关系 美元指数对现货黄金和白银有什么影响 如何理解美元指数与黄金的负相关的关系 美元指数和黄金的走势是成什么关系的,什么情况下会同涨或者同跌? 美元指数和黄金价格的关系 我把银行卡绑在抖音极速版为何零钱提不到银行卡里? 银行入驻抖音有哪些好处? 如何矫正错误的拿筷子方式 在黑暗中,我错误的拿了她的书包英文 抖音小店绑银行卡时是否签署分期还是先垫付后? 我错误地拿走了弟弟的书包用英语 错误的拿笔方式能把字写好看吗?