[huffman 编码]Huffman编码完整代码_huffman编码c语言

更新时间:2014-06-26 来源:保证书 点击:

【www.0477edu.com--保证书】

  huffman编码是一种可变长编码方式,于1952年由huffman提出。依据字符在需要编码文件中出现的概率提供对字符的唯一编码,并且保证了可变编码的平均编码最短,被称为最优二叉树,有时又称为最佳编码。以下是由阳光网小编整理关于Huffman编码完整代码的内容,希望大家喜欢!

  Huffman编码完整代码

  //利用哈夫曼树进行编码,

  #include <dos.h>

  #include <conio.h>

  #include <stdio.h>

  #include <stdlib.h>

  #include <string.h>

  #include<iostream>

  #include<malloc.h>

  using namespace std;

  typedef struct //定义哈夫曼树

  { int weight; //结点权值

  int parent,lchild,rchild; //结点的父指针,左右孩子指针

  }HTNode,*HuffmanTree;

  typedef char **HuffmanCode; //数组存储哈夫曼编码表

  void CreateHuffmanTree(HuffmanTree &,unsigned int*,int ); //生成哈夫曼树

  void HuffmanCoding(HuffmanTree,HuffmanCode &,int ); //哈夫曼树编码

  void PrintHuffmanCode(HuffmanCode,unsigned int*,int); //显示编码结果

  void Select(HuffmanTree,int,int&,int&); //在数组中寻找权值最小的两个结点

  void main()

  {HuffmanTree HT; //哈夫曼树HT

  HuffmanCode HC; //哈夫曼编码表HC

  int n,i; //n是哈夫曼树叶子结点数

  unsigned int *w; //w存放叶子结点权值

  cout<<"huffman编码使用说明"<<endl ; //使用说明

  cout<<"例如:输入需要进行编码的字符数目2"<<endl;

  cout<<"然后输入每个字符的权值(整数)"<<endl;

  cout<<"例如:5 29 "<<endl;

  cout<<"则构造一棵哈夫曼树,哈夫曼编码如下"<<endl;

  cout<<" 5---0"<<endl<< "29---1"<<endl;

  printf("请需要进行编码的字符数目:");

  scanf("%d",&n);

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

  printf("输入每个字符的权值(整数):\n");

  for(i=0;i<n;i++) scanf("%d",&w[i]); //输入各字符出现的次数/权值

  CreateHuffmanTree(HT,w,n); //生成哈夫曼树

  HuffmanCoding(HT,HC,n); //进行编码

  PrintHuffmanCode(HC,w,n); //显示编码

  }

  void CreateHuffmanTree(HuffmanTree &HT,unsigned int *w,int n)

  {//构造哈夫曼树

  int i,m;

  int s1,s2;

  HuffmanTree p;

  if(n<=1) return;

  m=2*n-1; //n个叶子结点,共需2*n-1个结点

  HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //开辟空间

  for(p=HT+1,i=1;i<=n;++i,++p,++w) //初始化

  {p->weight=*w;

  p->parent=0;

  p->lchild=0;

  p->rchild=0;

  }

  for(;i<=m;++i,++p)

  {p->weight=0;

  p->parent=0;

  p->lchild=0;

  p->rchild=0;

  }

  for(i=n+1;i<=m;++i) //建哈夫曼树

  {Select(HT,i-1,s1,s2);

  HT[s1].parent=i; HT[s2].parent=i; //修改s1和s2结点的父指针parent

  HT[i].lchild=s1; HT[i].rchild=s2; //修改i结点的左右孩子指针

  HT[i].weight=HT[s1].weight+HT[s2].weight; //修改权值指向在数组中的位置

  }

  }

  void HuffmanCoding(HuffmanTree HT,HuffmanCode &HC,int n)

  {//将哈夫曼树进行编码,所编的码存放在HC,从叶子到根逆向求每个叶子结点的哈夫曼编码

  int i,c,f,start;

  char *cd;

  HC=(HuffmanCode)malloc((n+1)*sizeof(char *)); //分配n个编码的头指针向量

  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'; //若是右孩子编为'1'

  HC[i]=(char *)malloc((n-start)*sizeof(char)); //为第i个编码分配空间

  strcpy(HC[i],&cd[start]); //将编码从cd复制到HC中

  }

  free(cd);

  }

  void PrintHuffmanCode(HuffmanCode HC,unsigned int *w,int n)

  {//显示输入的n个叶子结点的哈夫曼树的编码表

  int i;

  printf("HuffmanCode is :\n");

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

  {printf(" %3d---",w[i-1]);

  puts(HC[i]);

  }

  printf("\n");

  }

  //在HT[1...t]中选择parent不为0且权值最小的两个结点,其序号分别为s1和s2

  void Select(HuffmanTree HT,int t,int&s1,int&s2)

  { int i,m,n;

  m=n=10000;

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

  {if(HT[i].parent==0&&(HT[i].weight<m||HT[i].weight<n))

  if(m<n)

  {n=HT[i].weight;s2=i;}

  else {m=HT[i].weight;s1=i;}

  }

  if(s1>s2) //s1放较小的序号

  {i=s1;s1=s2;s2=i;}

  }

  Huffman代码流程

Huffman编码完整代码_huffman编码c语言


1.课后答案免费下载合集

2.神秘国度爱情故事完整代码(C语言)

本文来源:http://www.0477edu.com/wendang/3613/

为您推荐

新手开超市注意事项|新手开母婴店的注意事项有哪些

母婴店的发展是现在比较流行的,新手开母婴店有很多需要注意的事情发生。下面就让烟花美文网小编给大家分享一下母婴店的知识吧,希望能对你有帮助!新手开母婴店的注意事项1 确保进货质量:婴儿用品的使用对象是小宝宝,对产品的质量要求特别高,不一定是要进特别高档的产品,但一定是要进质量有保证的商品,正规供应商

2019-01-14 10:19:40   母婴店装修注意事项  

[批发市场的保证金主要有]全国眼镜批发市场主要有哪些

开眼镜店的你是否也需要到眼镜批发市场去进货呢?主要去的地方有?以下是烟花美文网小编给大家带来眼镜批发市场介绍,以供参阅。深圳横岗眼镜城眼镜批发市场深圳本地宝购物提供深圳购物打折优惠信息,深圳横岗眼镜城眼镜批发市场地址大全有关的信息,导语:深圳市横岗眼镜城,位于深圳市龙岗区横岗镇,是深圳人民买眼镜和批

2019-01-12 01:19:40   广州眼镜批发市场  

[汽车仪表盘各种图标的意义及作用是什么意思]汽车仪表盘各种图标的意义及作用是什么

汽车仪表盘上这些图标对于我们日常行车却起着十分重要的作用,看懂这些图标所代表的含义,可以帮助我们及时发现车辆存在的故障,及早修复从而保证行车安全。那你知道是什么吗?以下是烟花美文网小编为你整理的汽车仪表盘各种图标的意义及作用,希望能对你有所帮助。汽车仪表盘各种图标的意义及作用发动机自检提示灯在每次着

2019-01-07 17:19:40   电动汽车仪表盘各图标  

[太阳能热水器怎么清洗]太阳能热水器清洗的小妙招

太阳能热水器清洗也不是一件简单的事情,太阳能热水器水垢是比较能清洗的。面是烟花美文网小编整理的太阳能热水器清洗的方法,希望能帮助到你!太阳能热水器清洗的方法1、根据当地的水质和空气的等相关因素,定期清洗太阳能热水器真空管内的水垢和清洗真空管外壁的灰尘以保证太阳能热水器真空管的集热效果。2、根据当地气

2018-11-20 04:19:40   太阳能热水器清洗视频  

燃气热水器选购攻略|选购燃气热水器必看的几个要素

燃气热水器现在已经成为大多数家庭的首要选择,而且在使用的时候是非常方便的,燃气热水器如何选购是个问题,下面是烟花美文网小编整理的燃气热水器选购方法,希望能帮助到你!燃气热水器选购要素第一是安全。虽然目前直排式热水器已经禁止销售,强排式热水器的安全有所保证,但热水器的安全问题仍是消费者最关心的问题。9

2018-11-15 23:19:40   如何选购燃气热水器