前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >哈夫曼编码

哈夫曼编码

作者头像
AngelNH
发布2020-04-16 11:22:08
4250
发布2020-04-16 11:22:08
举报
文章被收录于专栏:AngelNIAngelNI

哈夫曼编码

数据结构上的代码实现。

代码语言:javascript
复制
#include<stdio.h>
#include<malloc.h>
#include<string.h>
typedef struct
{
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;

void Select(HuffmanTree &HT,int n,int &s1,int &s2)
{
    
    for (int i = 0; i < n; i++)
    {
        if (HT[i].parent == 0)
        {
            s1=i;    
            break;
        }
    }
    for (int i = 0; i <n; i++)        
    {
        if ((HT[s1].weight > HT[i].weight) && (HT[i].parent == 0))        
        {
            s1 = i;
        }
    }
    
    for (int i = 0; i <n; i++)
    {
        if ((HT[i].parent == 0)&&i!=s1)        
        {
            s2 = i;    
            break;
        }
    }
    for (int i = 0; i <n; i++)        
    {
        if ((HT[s2].weight > HT[i].weight) && (HT[i].parent == 0) && (i != s1))
        {
            s2 = i;
        }
    }
    
}
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n)
{
	int i,m,s1,s2,start;
 	char *cd;
 	unsigned int c, f;
 	if(n<=1)
		return;
 	m=2*n-1;
 	HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
 	for(i=1;i<=n;i++)
 	{
  		HT[i].weight=w[i-1];
  		HT[i].parent=0;
  		HT[i].lchild=0;
  		HT[i].rchild=0;
 	}
 	for(i=n+1;i<=m;i++)
 	{
 		HT[i].weight=0;
  		HT[i].parent=0;
  		HT[i].lchild=0;
  		HT[i].rchild=0;
 	}
 	for (i=n+1;i<=m;i++)
 	{ 
  		Select(HT,i-1,s1,s2);
  		HT[s1].parent=i; HT[s2].parent=i;
  		HT[i].lchild=s1; HT[i].rchild=s2;
  		HT[i].weight=HT[s1].weight+HT[s2].weight;
 	}
 	cd=(char *)malloc(n*sizeof(char)); 
 	cd[n-1]='\0'; 
 	for(i=1;i<=n;++i)
 	{ 
 		start=n-1; 
 		for (c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
 			if (HT[f].lchild==c)
				cd[--start]='0';
 			else
				cd[--start]='1';
		HC[i]=(char*)malloc((n-start)*sizeof(char));
  		strcpy(HC[i],&cd[start]); 
 	}
 	free(cd);
}
int main()
{
	int i,n;
	int *w;
	HuffmanTree HT;
	HuffmanCode HC;
    //汉字编码出了问题。。。。。。。
	//printf("锟斤拷锟斤拷锟斤拷权值锟斤拷锟斤拷锟斤拷\n");
	scanf("%d",&n); 
	w=(int *)malloc(n*sizeof(int)); 
	//printf("锟斤拷锟斤拷锟斤拷权值锟斤拷\n"); 
	for ( i=0;i<n;i++) 
		scanf("%d",&w[i]);

	HC=(char **)malloc((n+1)*sizeof(char*));
	HT=(HuffmanTree)malloc((2*n+1+1)*sizeof(HTNode));
	HuffmanCoding(HT, HC, w, n);
	for(i=1;i<n+1;i++)
	{
		puts(HC[i]); 
		free(HC[i]); 
	}
	free(HC);
	free(HT);
	return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-10-19|,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档