huffman编码&解码器

原创 2003年05月08日 12:06:00

/*huffman coder & decoder*/

include<stdio.h>
#ifndef N
#define N 27
#endif
#define M (2*N-1)
#define Max (100*N)
#define Min  5
/*define each node's imformation*/
typedef struct nodetype
{
int weight ;
int lch;
int rch;
int parent;
char data;
}node;
/*structure code*/
typedef struct codetype
{
int bits[N];/*0,1*/
int start;/*1..n*/
}code;
/*assistant variable*/
typedef struct sign
{
int wt;
int num;
}tag;



/*typedef node huftree;
typedef code hufcode;*/

/*create huftree*/
void Create(struct nodetype  ht0[],struct codetype  hcd0[])
{
int h,i,j,l,k;
int wt;
int c1,sgn=0,r=1;
char chr;
tag flag[M];
tag md;
code cd;

for(i=1;i<=M;i++)
{
ht0[i-1].parent=0;
ht0[i-1].lch=ht0[i-1].rch=0;
}

for(i=1;i<=N;i++)
{
getchar();
printf("/n/t/t请输入第%d个数",i);
printf("/n/t/t请输入数据信息:字符--");
chr=getchar();
if(((chr>='a')&&(chr<='z'))||((chr>='A')&&(chr<='Z')))
     ht0[i-1].data=chr;
else
{
printf("/n/t/t太不小心了吧!Again!AgainAgain!!");
i++;
continue;
}
printf("/n/t/t请输入数据信息:权重--");
scanf("%d",&wt);
ht0[i-1].weight=wt;
}
   printf("/n/t/t辛苦了:).上帝是仁慈的,瞧!有结果了.仰天长笑吧!哈-哈哈!");

for(i=N+1;i<=M;i++)
{

for(k=1,j=0;k<=i-1;k++)
if(ht0[k-1].parent==0)
{
j++;
flag[j-1].wt=ht0[k-1].weight;
flag[j-1].num=k;
           }
for(l=1;l<j;l++)
{
for(h=l+1;h<=j;h++)

if(flag[l-1].wt>flag[h-1].wt)
{
md=flag[l-1];
flag[l-1]=flag[h-1];
flag[h-1]=md;
}
}
ht0[flag[1-1].num-1].parent=i;
ht0[flag[2-1].num-1].parent=i;
ht0[i-1].lch=flag[1-1].num;
ht0[i-1].rch=flag[2-1].num;
ht0[i-1].weight=ht0[flag[1-1].num-1].weight+ht0[flag[2-1].num-1].weight;
}
/**/

for(i=0;i<=N;i++)
cd.bits[i-1]=0;
for(r=1;r<=N;r++)
{
cd.start=N;
c1=r;
sgn=ht0[c1-1].parent;

while(sgn)
{
if(ht0[sgn-1].lch==c1)
cd.bits[cd.start-1]=0;

else if(ht0[sgn-1].rch==c1)
cd.bits[cd.start-1]=1;
cd.start--;
c1=sgn;
sgn=ht0[sgn-1].parent;
}
hcd0[r-1]=cd;
}
}


/**/
void Table(struct nodetype ht[],struct codetype hcd[])
{
int i,j;
Create(ht,hcd);
for(i=1;i<=N;i++)
{
printf("/n%c/t",ht[i-1].data);
for(j=hcd[i-1].start+1;j<=N;j++)
{
printf("%d",hcd[i-1].bits[j-1]);
}
}

}

/**/
void Coding(node ht2[],code hcd2[])
{
char str1[Max];
int h,i,j,k=0;
Create(ht2,hcd2);
printf("/n/t请输入正文:/n");
for(h=0;(str1[h]=getchar())!='#';h++);/*great!!!!!!!!!!!!*/
while(str1[k]!=0)
{
for(i=1;i<=N;i++)
if(ht2[i-1].data==str1[k])
for(j=hcd2[i-1].start+1;j<=N;j++)
printf("%d",hcd2[i-1].bits[j-1]);
k++;
}
printf("/n/t/t哇塞!太幸福了. ");
}
/**/
void Decoding(node ht3[],code hcd3[])
{
char *str2=" ";
node q;
Create(ht3,hcd3);
printf("/t/t请输入编码:/n");
scanf("%s",str2);
while(*str2)
{
q=ht3[M-1];
while(q.lch!=0)
{
if(*str2=='0')
{
q=ht3[q.lch-1];
str2++;
}
else if (*str2=='1')
{
q=ht3[q.rch-1];
str2++;
}
}
printf("%c",q.data);
}
printf("/n/t/t呼呼!看不懂得01真的很浪漫哟:)");
}

/**/


void main()
{
    char ctrl,ctrl1,ctrl2;
    int i=0;
    node ht1[M];
    code hcd1[N];

 do
 {
printf("/n/t/t欢迎你来到哈夫曼王国!!/n/t/t该系统具有以下功能:/n/t/t(1):建立哈夫曼编码树/n/t/t(2):输出编码表/n/t/t(3):编码/n/t/t(4):译码/n/t/t(0):退出。再见!!!!/n/t/t选择 :--|0|1|2|3|4|/n/t/t可实现你的要求:--");
i++;
  scanf("%c",&ctrl);
  scanf("%c",&ctrl2);
  if(ctrl=='1')
Create(ht1,hcd1);
else if(ctrl=='2')
       Table(ht1,hcd1);
    else if(ctrl=='3')
     Coding(ht1,hcd1);
  else if(ctrl=='4')
   Decoding(ht1,hcd1);
   else if(ctrl=='0')
        goto loop;
else if(Min-i>0)
{
     printf("/n/t哈哈!你错了哟!看一看提示吧:)/n/t要珍惜机会哦!!/n/t/tp(^_^)q/n");

}

    if ((Min-i)==0)
      printf("/n/t欢迎再来!/n/tBye,HAVE A GOOD DAY!/n/t/t/t  ");
  else
      {
printf("/n/t/t只有%d次机会了",Min-i);
printf("/n/t/t还要继续吗?加油喔:)/n/n/t/t/t/ty|n");
printf("/n/n/t/t/t/t");
scanf("%c",&ctrl1);
    }
    getchar();/*waiting*/
    }while((ctrl1=='y')&&(i<=Min-1));
   loop:
   ;
 }

设计hafuman 编码器与解码器 C++实现

这是本人在本科阶段的哈弗曼树的代码实现。设计hafuman 编码器与解码器 问题描述:利用哈夫曼编码进行信息通讯可以大大提高信道的利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个...
  • ggxxkkll
  • ggxxkkll
  • 2012年04月20日 13:11
  • 1152

Huffman编码原理详解

1、概述      huffman编码是一种可变长编码(  VLC:variable length coding))方式,于1952年由huffman提出。依据字符在需要编码文件中出现的概率提供...
  • yang6464158
  • yang6464158
  • 2014年10月07日 11:38
  • 1970

【数据结构与算法】Huffman树&&Huffman编码(附完整源码)

赫夫曼树(Huffman Tree),又称最优二叉树,是一类带权路径长度最短的树。假设有n个权值{w1,w2,...,wn},如果构造一棵有n个叶子节点的二叉树,而这n个叶子节点的权值是{w1,w2,...
  • mmc_maodun
  • mmc_maodun
  • 2014年02月15日 00:27
  • 23648

Huffman编码用MTLAB的实现及编码注释----------Matlab

一、实验内容 1、用Matlab实现Huffman编码算法程序; 2、要求程序输出显示所有的码字以及编码效率;         3、设计简单的输入界面(可以是简单的文字提示信息),程序运行时提示...
  • CSDNJay
  • CSDNJay
  • 2015年06月24日 22:13
  • 3407

数据结构和算法——Huffman树和Huffman编码

Huffman树是一种特殊结构的二叉树,由Huffman树设计的二进制前缀编码,也称为Huffman编码在通信领域有着广泛的应用。在word2vec模型中,在构建层次Softmax的过程中,也使用到了...
  • google19890102
  • google19890102
  • 2017年02月04日 15:43
  • 1845

Huffman编码实现压缩解压缩

Huffman编码实现压缩解压缩 什么是Huffman压缩 Huffman( 哈夫曼 ) 算法在上世纪五十年代初提出来了,它是一种无损压缩方法,在压缩过程中不会丢失信息熵,而且可以证明 Huffm...
  • u013290075
  • u013290075
  • 2016年04月04日 23:22
  • 1792

【贪心算法】Huffman编码

问题描述有一组字符集{c1, c2, …, cn},在使用这组字符集的过程中,通过统计发现每个字符都有其相应的出现频率,假设对应的频率为{f1, f2, …, fn}。现在需要对这些字符进行二进制编码...
  • hongchh
  • hongchh
  • 2016年08月16日 11:04
  • 1787

huffman编解码算法实验与压缩效率分析

一、基本原理 1、huffman编码原理 huffman编码是一种无失真编码方式,是可变长(VLC)编码的一种。 huffman编码基于信源的概率统计模型,基本思路是出现概率大的信源符号编长码,出现概...
  • zsy2415535899
  • zsy2415535899
  • 2017年04月29日 11:36
  • 386

Huffman编码的C语言实现

Huffman 编码(1) Huffman Coding (霍夫曼编码)是一种无失真编码的编码方式,Huffman 编码是可变字长编码(VLC)的一种。 (2)Huffman 编码基于信源的概率统计...
  • yingqi_lok
  • yingqi_lok
  • 2017年04月19日 22:12
  • 1203

Huffman编码实现压缩、解压文件

Huffman编码:根据词频构建Huffman树,实现对文本的前缀编码。 1、统计文本中每个字符出现的次数,放入优先队列中,构建一棵空的二叉树; 2、取出频率最小的两个字符a、b,字符a、b的频率...
  • niuxiunan
  • niuxiunan
  • 2015年11月14日 01:15
  • 2676
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:huffman编码&解码器
举报原因:
原因补充:

(最多只允许输入30个字)