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

急求用“哈夫曼编码”解决问题

发布网友 发布时间:2022-04-23 04:24

我来回答

1个回答

热心网友 时间:2022-04-26 13:08

//能成功不过可能不太符合你的要求

#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<string.h>

#define ERROR 0;
#define OK 1;

typedef int Status;

typedef struct{
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;

typedef char * * HuffmanCode;

Status InitHuffmanTree(HuffmanTree &HT,int n){
int i,tem;
HT=(HTNode *)malloc((2*n-1)*sizeof(HTNode));
if(!HT){
return ERROR;
}

for(i=0;i<n;i++){
scanf("%d",&tem);
HT[i].weight=tem;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}

for(;i<2*n-1;i++){
HT[i].parent=-1;
}

return OK;
}

void Select(HuffmanTree &HT,int n,int &fi,int &si){
int i=0,tem;
if(n>=2){
while((HT+i)->parent){
i++;
}
fi=i;

i++;
while((HT+i)->parent){
i++;
}
si=i;

if((HT+fi)->weight>(HT+si)->weight){
tem=fi;
fi=si;
si=tem;
}

for(i++;i<n;i++){
if((HT+i)->parent==0){
if((HT+i)->weight<(HT+fi)->weight){
si=fi;
fi=i;

}
else{
if((HT+i)->weight<(HT+si)->weight){
si=i;
}
}
}//printf("%d %d\n",fi,si);
}
}

}

int HuffmanTreeAllReady(HuffmanTree HT,int m){
int sum=0,i;
for(i=0;i<m;i++){
if((HT+i)->parent==0){
sum++;
}
if(sum>1){
return 0;
}

}
return 1;
}

void CreateHuffmanTree(HuffmanTree &HT,int n){
int s1,s2;
while(!HuffmanTreeAllReady(HT,n)){
Select(HT,n,s1,s2);

HT[n].parent=0;
HT[n].lchild=s1;
HT[n].rchild=s2;
HT[n].weight=HT[s1].weight+HT[s2].weight;
HT[s1].parent=n;
HT[s2].parent=n;
n++;

}

}

void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int n){
char * str;
int len=0,tem,i,j;
unsigned int p;
str=(char *)malloc(n*sizeof(char));

for(i=0;i<n;i++){
p=i;
len=0;
while(tem=HT[p].parent){

if(HT[tem].lchild==p){
str[len]='0';
}
else{
str[len]='1';
}
len++;
p=tem;
}

HC[i]=(char *)malloc((len+1)*sizeof(char));

if(HC[i]){
for(j=0;j<len;j++){
HC[i][j]=str[len-1-j];
}
HC[i][len]='\0';
str[len]='\0';
}
//printf("%d,%d\n",HC[i][0],len);
}
}

int main(){
HuffmanTree HT;
HuffmanCode HC;
int n,i,j,a,b;
HC=(char * *)malloc((n)*sizeof(char *));
scanf("%d",&n);
InitHuffmanTree(HT,n);

/*
for(i=0;i<2*n-1;i++){
printf("%d ",HT[i].parent);
}
printf("\n");
*/
Select(HT,i,a,b);
//printf("a=%d %d, b=%d %d",a,HT[a].weight,b,HT[b].weight);

CreateHuffmanTree(HT,n);

/*
for(i=0;i<2*n-1;i++){
printf("w=%d p=%d l=%d r=%d\n",HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild);
}

printf("\n\n\n");
*/
HuffmanCoding(HT,HC,n);
for(i=0;i<n;i++){
printf("%s\n",HC[i]);
}

return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...的话有啥影响,怎么听说对六年后换证有影响? ...重新刷学时吗,科一科二科三科四可以转校吗? 考完科一科二科三科四要多久 ...但是科目三的学时没有打满对以后有没有影响? 我的学时卡没有打过,一点都没有,不过我科一科二科三科四都全部考完了... 五行穿搭2021年10月8日五行属什么怎么穿衣 十月八日上到十月几日 ipadmini和iphone6是充电器不一样、还是数据线不一样呢?可以互相使用充 ... iphone6的插头可以通用ipad mini 吗 iphone6和ipad mini的充电器可以通用吗 吃人参果真的可以延年益寿吗? 如何判断人参果的生熟? 霍夫曼编码的平均码长怎么求 人参果长什么样子? 哈夫曼编码问题(有要求,请给完整程序)满足要求的追加 人参果是什么水果 关于哈夫曼编码试题的计算 人们常说的人参果是什么?和人参有关么? 第一题 哈夫曼编码 人参果是什么科植物 人参果好吃吗什么味道 哈夫曼树每个字符可以有不同的编码方式,但是每个字符的编码长度是一样的吗? 哈夫曼编码的介绍 人参果有什么营养??? 如何叙述哈夫曼编码 哈夫曼编码码长怎么算? 高中生有什么又好看又好打理的发型推荐? 人参果是一种含有很高营养价值的水果种类,经常吃对身体有什么坏处... 哈夫曼编码算法设计 人参的花、果实和种子是怎样的? 哈夫曼编码C语言实现 人参果的危害是什么? 关于哈夫曼树的一题,望给出详细解释,感激不尽!在线等 人参果是长在树上还是土里 哈夫曼编编码使整个电文编码长度最短,求总得编码总长度 huffman编码如果编码长度超过8位,还能实现文本压缩吗? n个权值的哈夫曼编码 非警校毕业的学生,怎样才能成为一名人民警察? 车辆的全险包括车子划痕险吗 请问汽车保险,买的是全险,包括划痕险吗 非警察专业怎样才能当警察? 新车全险包括划痕险吗 从警察学院毕业怎样才能当警察? 全险包括划痕险吗? 普通大学毕业后怎样当警察? 新车全险包括划痕险吗? 怎么样能当上警察 豢豕非不饱寸茎山上春答一动物?在图里面放大看 全险包括划痕险吗 怎样才能当上警察?