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

•哈夫曼编/译码器•完成Huffman编码的译码过程。即输入一个码串,请翻译成相应的字符串。要求有编码过程和解码过程。IEDPT... •哈夫曼编/译码器•
完成Huffman编码的译码过程。即输入一个码串,请翻译成相应的字符串。要求有编码过程和解码过程。
IEDPT
展开
 我来答
百度网友881ca15
2014-11-26 · TA获得超过5317个赞
知道小有建树答主
回答量:223
采纳率:100%
帮助的人:146万
展开全部

哈弗曼编码

#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;

}

运行结果

望采纳!

追问
这明显不对啊,要有初始化,编码,译码,打印这几个啊
追答
你可以把输入那块改成初始化
光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式