数据结构实验报告 实验五

数据结构实验报告 实验五

ID:19193596

大小:15.50 KB

页数:6页

时间:2018-09-29

数据结构实验报告 实验五_第1页
数据结构实验报告 实验五_第2页
数据结构实验报告 实验五_第3页
数据结构实验报告 实验五_第4页
数据结构实验报告 实验五_第5页
资源描述:

《数据结构实验报告 实验五》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、数据结构实验报告实验五  一.实验内容:  实现哈夫曼编码的生成算法。  二.实验目的:  1、使学生熟练掌握哈夫曼树的生成算法。  2、熟练掌握哈夫曼编码的方法。  三.问题描述:  已知n个字符在原文中出现的频率,求它们的哈夫曼编码。  1、读入n个字符,以及字符的权值,试建立一棵Huffman树。  2、根据生成的Huffman树,求每个字符的Huffman编码。并对给定的待编码字符序列进行编码,并输出。  四.问题的实现  (1)郝夫曼树的存储表示  typedefstruct{  unsignedintweight;  unsignedin

2、tparent,lchild,rchild;  }HTNode,*HuffmanTree;//动态分配数组存储郝夫曼树  郝夫曼编码的存储表示  typedefchar**HuffmanCode;//动态分配数组存储郝夫曼编码  (2)主要的实现思路:  a.首先定义郝夫曼树的存储形式,这里使用了数组  b.用select()遍历n个字符,找出权值最小的两个  c.构造郝夫曼树HT,并求出n个字符的郝夫曼编码HC  总结  1.基本上没有什么太大的问题,在调用select()这个函数时,想把权值最小的两个结点的序号带回HuffmanCoding(),

3、所以把那2个序号设置成了引用。  2.在编程过程中,在什么时候分配内存,什么时候初始化花的时间比较长  3.最后基本上实现后,发现结果仍然存在问题,经过分步调试,发现了特别低级的输入错误。把HT.weight=HT.weight+HT.weight;中的s2写成了i  附:  //动态分配数组存储郝夫曼树  typedefstruct{  intweight;//字符的权值  intparent,lchild,rchild;  }HTNode,*HuffmanTree;  //动态分配数组存储郝夫曼编码  typedefchar**HuffmanCo

4、de;  //选择n个(这里是k=n)节点中权值最小的两个结点  voidSelect(HuffmanTree&HT,intk,int&s1,int&s2)  {inti;  i=1;  while(i  //下面选出权值最小的结点,用s1指向其序号  s1=i;  for(i=1;i  {  if(HT.parent==0&&HT.weight  }  //下面选出权值次小的结点,用s2指向其序号  for(i=1;i  {  if(HT.parent==0&&i!=s1)break;  }  s2=i;  for(i=1;i  {  if(HT.

5、parent==0&&i!=s1&&HT.weight  }  }  //构造Huffman树,求出n个字符的编码  voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,int*w,intn)  {  intm,c,f,s1,s2,i,start;  char*cd;  if(n  m=2*n-1;//n个叶子n-1个结点  HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//0号单元未用,预分配m+1个单元  HuffmanTreep=HT+1;  w++;//w

6、的号单元也没有值,所以从号单元开始  for(i=1;i  {  p->weight=*w;  p->parent=p->rchild=p->lchild=0;  }  for(;i  {  p->weight=p->parent=p->rchild=p->lchild=0;  }  for(i=n+1;i  {  Select(HT,i-1,s1,s2);//选出当前权值最小的  HT.parent=i;  HT.parent=i;  HT.lchild=s1;  HT.rchild=s2;  HT.weight=HT.weight+HT.weig

7、ht;  }  //从叶子到根逆向求每个字符的郝夫曼编码  HC=(HuffmanCode)malloc((n+1)*sizeof(char*));//分配n个字符编码的头指针变量  cd=(char*)malloc(n*sizeof(char));//分配求编码的工作空间  cd='';//编码结束符  for(i=1;i  {  start=n-1;//编码结束符位置  for(c=i,f=HT.parent;f!=0;c=f,f=HT.parent)//从叶子到根逆向求编码  {  if(HT.lchild==c)cd='0';  else  

8、cd='1';  }  HC=(char*)malloc((n-start)*sizeof(char));/

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。