数据结构大作业_第1页
数据结构大作业_第2页
数据结构大作业_第3页
数据结构大作业_第4页
数据结构大作业_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上预习分操作分报告分总成绩实 验 报 告学 号 姓 名 实验名称 哈夫曼编码器设计 指导老师 班 级 实验日期 实验报告具体内容一般应包括:一、实验目的和要求;二、实验原理;三、主要仪器设备(软件);四、实验内容及实验数据记录;五、实验数据处理与分析;六、问题与建议一、实验目的和要求:哈夫曼(Huffman)树与哈夫曼码 1输入一个文本,统计各字符出现的频度,输出结果;2使用二叉链表或三叉链表作存储结构,构造哈夫曼(Huffman)树;3确定和输出各字符的哈夫曼码;4.  输入一个由0和1组成的代码序列,翻译并输出与之对应的文本;要求:一个完整的系统

2、应具有以下功能:(1)初始化: 从终端读入一段英文字符,统计每个字符出现的频率,建立赫夫曼树,并将该树存入某文件;(2)编码: 利用建好的赫夫曼树对各字符进行编码,用列表的形式显示在屏幕上,并将编码结果存入另一文件中; (3)解码:利用保存的赫夫曼编码,对任意输入的0,1序列能正确解码二、实验思路:对输入的一串字符串,用循环进行出现频率的统计,出现频率即为节点的权值。为了方便将叶子节点数定义成为全局变量。创建哈夫曼树时,先给哈夫曼树创建一个节点,依次对叶子节点和非叶子节点进行初始化。将全部的叶子节点中最小权值的两个节点的权值进行相加即为非叶子节点。进行哈夫曼编码时,从叶子节点到根节点进行编码。

3、而进行解码时,是从根节点到叶子节点,向左为0向右为1。由于书上有相关代码,一部分代码直接借用。三、实验代码:#define MAX 50typedef structint weight;int parent,lchild,rchild;HTNode,*HuffmanTree;typedef char *HuffmanCode;int n; /叶子结点数char aMAX; /接受字符串的数组void select(HuffmanTree *ht,int i,int *s1,int *s2)int j=1;for(j=1;j<=i;j+)if(*ht)j.parent=0)*s1=j;br

4、eak;for(j=1;j<=i;j+)if(j=*s1) continue;elseif(*ht)j.parent=0)*s2=j;break;for(j=1;j<=i;j+) /选择两个最小权值的结点if(*ht)j.weight<(*ht)*s1.weight&&(*ht)j.parent=0&&(*ht)*s1.weight!=(*ht)*s2.weight)*s1=j;for(j=1;j<=i;j+)if(j=*s1) continue;else if(*ht)j.weight<(*ht)*s2.weight&&a

5、mp;(*ht)j.parent=0)*s2=j;void Creattree(HuffmanTree *ht,HuffmanCode *hc,int *w)int m,i,s1,s2;m=2*n-1;*ht=(HuffmanTree)malloc(m+1)*sizeof(HTNode);printf("Haffmantree:n");for (i=1;i<=n;i+) /数组Huffnode 初始化 (*ht)i.weight=wi; (*ht)i.parent=0; (*ht)i.lchild=0; (*ht)i.rchild=0; for(i=n+1;i<

6、=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+) /建立非叶子结点,Huffmantreeselect(ht,i-1,&s1,&s2);(*ht)s1.parent=i;(*ht)s2.parent=i;if(*ht)s1.weight<(*ht)s2.weight)(*ht)i.lchild=s1;(*ht)i.rchild=s2;else(*ht)i.lchild=s1;(*ht)i.rchild=s2;(*ht)i.weight

7、=(*ht)s1.weight+(*ht)s2.weight;printf("%d=<%d,%d>n",(*ht)i.weight,(*ht)s1.weight,(*ht)s2.weight);void charge(int *w)printf("put in a stringn");scanf("%s",&a);int i,j,k=1;for(k=1;k<=n;k+)wk=1;k=1;for(i=0;ai!='0'i+)if(ai='#') continue;for(j=i+

8、1;aj!='0'j+)if(ai=aj) wk+;aj='#'printf(" %c的频数为: ",ai);printf("%dn",wk);k+;void creatnode(HuffmanTree *ht,HuffmanCode *hc)char *cd;int i,start,c,p;*hc=(HuffmanCode)malloc(n+1)*sizeof(char *);cd=(char*)malloc(n*sizeof(char);cdn-1='0'printf("haffman编码:n

9、");for(i=1;i<=n;i+)start=n-1;for(c=i,p=(*ht)i.parent;p!=0;c=p,p=(*ht)p.parent)if(*ht)p.lchild=c)cd-start='0'else cd-start='1'(*hc)i=(char*)malloc(n-start)*sizeof(char);strcpy(*hc)i,&cdstart);printf("w=%d ",(*ht)i.weight);printf("%sn",(*hc)i);free(cd);v

10、oid translate(HuffmanTree *ht,int *w)int p;char sMAX;int m,k,i;m=0;printf("请输入一串01代码:n");scanf("%s",s); p=2*n-1;printf("对应的字符为:n");for(i=0;si!='0'i+)if(si='0') p=(*ht)p.lchild;if(si='1') p=(*ht)p.rchild;if(*ht)p.lchild=0&&(*ht)p.rchild=0)for(k=1;wk!=(*ht)p.weight;k+)m=m+wk;printf("%c",am);if(si!='0') p=2*n-1;m=0;printf("n");四、实验数据五、实验小结:通过这次试验,我学会了如何进行哈夫曼树的创建,哈弗曼编码以及解码。实验中遇到的问题有:如何统计一个字符串中一个字符出现的次数以及如何将每个字符出现的次数保存;如何将一个数组传入到子函数中,在试验中常常出现数据无法传入子函数中的情况;如何在所有的节点中查找出最小的两个叶子节点;通过这次试验发现自己对子函数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论