数据结构与算法电文的编码和译码.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构与算法电文的编码和译码

电文的编码和译码问题描述 从键盘接受一串电文字符,输出对应的哈夫曼编码;同时能翻译由哈夫曼编码生成的代码串,输出对应的电文字符串。设计要求构造一棵哈夫曼树。实现哈夫曼编码,并用哈夫曼编码生成的代码进行译码。程序中字符和权值是可变的,实现程序的灵活性。数据结构 本课程设计采用结构体数组作为数据结构,来储存哈夫曼树及其编码。分析与实现 在电报通信中,电文是以二进制代码传送的。在发送时,需要将电文中的字符转换成二进制代码串,即编码;在接收时,要将收到的二进制代码串转化成对应的字符序列,即译码。字符被使用的频率是非均匀的。在传送电文时,要想使电文总长尽可能短,就需要让使用频率高的字符编码长度尽可能短。因此,若对某字符集进行不定长编码设计,则要求任一一个字符编码都不能使其他字符编码的前缀,这种编码称作前缀编码。 由哈弗曼树求得的编码是最优前缀码,也称哈夫曼编码。给出字符集和各个字符的概率分布,构造哈弗曼树,将哈夫曼树中每个分支结点的左分支标0,右分支标1,从根到每个叶子的路径上的标号连起来就是给叶子所代表字符的编码。构造哈夫曼树 根据哈弗曼算法,若已知n个叶结点,则构造的哈弗曼树有2n-1个结点。 第一步:先输入字符集中的n个字符(叶结点)和表示其概率分布的权值,储存在ht(HuffNode型)数组的前n个数组元素中。然后将2n-1个结点的双亲和孩子结点均置为0。 第二步:在所有的结点中,选取双亲为零且具有最小权值m1和次小权值m2的两个结点,用p1和p2指示这两个结点在数组中的位置。将根为ht[p1]和ht[p2]的两棵树合并,使其成为新结点ht[i]的左右孩子,ht[i]的权值为最小权值m1和次小权值m2之和;ht[p1]和ht[p2]的双亲指向i。共进行n-1次合并,产生n-1个结点,依次放入ht数组中数组下标从n+1到2n-1。这样就构成了一棵哈夫曼树。编码 基本思想是:从哈弗曼树的叶结点ht[i] (1≤i≤n)出发,通过双亲parent找到其双亲ht[f],通过ht[f]的域left和right,可知ht[i]是ht[f]的左分支还是右分支,若是左分支,生成的代码0;若是右分支,生成代码1。代码存放在数组cd的下标start中,然后把ht[f]作为出发点,重复上述过程,直到找到根为止。显然这样生成的代码序列与要求的编码次序相反,为了得到正确的代码,把最先生成的代码存放在数组的第n个(虽然各个字符的编码长度不一,但都不会超过n个)位置处,再次生成的代码存放在数组的第n-1个位置处,以此类推。用变量start来指示编码在数组cd中的起始位置,start的初始值为n,生成一个代码后,start的值就减1。译码 基本思想是:首先输入二进制代码串,存放在数组ch中,以#为结束标志;接下来,将代码与编码表比较,如果为0,转向左子树,如果为1,转向右子树,直到叶结点结束,此时输出叶结点的数据域,即所对应的字符;继续译码,直到代码串结束。源代码#includestdio.h#includestring.h#includestdlib.h#define MAXSIZE 50typedef char DataType;typedef struct //哈夫曼树结点的结构{DataType data; //数据用字符表示int weight; //权值int parent; //双亲int lchild,rchild; //左右孩子} HuffNode;typedef struct //哈夫曼编码的存储结构{DataType cd[MAXSIZE]; //存放编码位串int start; //编码的起始位置} HuffCode;void HuffmanCreate(HuffNode *ht,int n){int i,j,p1,p2,m1,m2;for(i=1;i=n;i++){getchar(); //接收回车printf(第%d个字符及其权重分别为(用空格分隔):\n,i);scanf(%c %d,ht[i].data,ht[i].weight);}for(i=1;i=2*n-1;i++) //对数组初始化ht[i].parent=ht[i].lchild=ht[i].rchild=0;for(i=n+1;i=2*n-1;i++){m1=m2=32767; //令m1、m2为整数最大值p1=p2=1;for(j=1;ji;j++) //找出parent为0且权值最小的两个结点if(ht[j].parent==0)if(ht

文档评论(0)

shenlan118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档