分享
分享赚钱 收藏 举报 版权申诉 / 13

类型哈夫曼编译码器课程设计报告.doc

  • 上传人:精品资料
  • 文档编号:10622305
  • 上传时间:2019-12-08
  • 格式:DOC
  • 页数:13
  • 大小:299.50KB
  • 配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    哈夫曼编译码器课程设计报告.doc
    资源描述:

    1、 数据结构 课程设计报告题目: 哈夫曼编/译码器专业: 计算机科学与技术(对口)班级: 13(3)姓名: 陈霞指导教师:彭飞成绩:计算机学院2015 年 11 月 12 日学号 1508 2015-2016 学年 第 1 学期计算机学院 数据结构课程设计报告1目录1 设计内容及要求 .31.1 内容 .31.2 要求 .32 概要设计 .42.1 抽象数据类型定义 .42.2 模块划分 .43 设计过程及代码 .53.1 设计过程 .53.2 代码 .74 设计结果与分析 105 参考文献 12计算机学院 数据结构课程设计报告11 设计内容及要求1.1 内容利用哈夫曼编码进行信息通信可以大大提

    2、高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/ 译码系统。试为这样的信息收发站写一个哈夫曼编/译码系统。1.2 要求一个完整的系统应具有以下功能: (1)I:初始化(Initialization)。从终端读入字符集大小 n,以及 n 个字符和 n 个权值,建立哈夫曼树,并将它存于文件 hfmTree 中。 (2)E:编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件 htmTree 中读入),对文件 ToBeTran

    3、中的正文进行编码,然后将结果存入文件CodeFile 中。 (3)D:译码(Decoding)。利用已建好的哈夫曼树将文件 CodeFile 中的代码进行译码,结果存入文件 TextFile 中。 (4)P:印代码文件(Print )。将文件 CodeFile 以紧凑格式显示在终端上,每行 50 个代码。同时将此字符形式的编码写入文件 CodePrint 中。 (5)T:印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint 中。测试数据 (1)数据一:已知某系统在通信联络中只可能出现 8

    4、 种字符,其概率分别为 0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,以此设计哈夫曼编码。利用此数据对程序 进行调试。 (2)用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“ THIS PROGRAM IS MY FAVORITE”。字符 A B C D E F G H I J K L M频度 186 64 13 22 32 103 21 15 47 57 1 5 32 20字符 N O P Q R S T U V W X Y Z频度 57 63 15 1 48 51 80 23 8 18 1 16 1计算机学院 数据结构课程

    5、设计报告12 概要设计2.1 抽象数据类型定义ADT Stack 数据对象:D=ai|aiElemSet,i=1,2,.,n, n0 数据关系:若 D 为空集,则称为空树。 若 D 仅为一个数据元素,则 R 为空集,否则 R=H,H 是如下的二元关 系: (1)再 D 中存在唯一的称为根的数据元素 root,它在关系 H 下无前驱。 (2)若 D-root0)。 (3)对应于 D-root的划分,H-有唯一的一个划分H1,H2,Hm(m0)。 基本操作:InitTree(/结点权值 int weight;/权重 int parent;/双亲结点 int lchild;/左孩子 int rchi

    6、ld;/右孩子 HTNode; HTNode ht30; (2) 求哈夫曼编码类型 typedef struct char cd30;/存放当前结点的哈弗曼编码 int start;/cdstartcdn存放哈弗曼码 HCode; HCode hcd30;计算机学院 数据结构课程设计报告12、主要模块的算法描述计算机学院 数据结构课程设计报告1开始Int I;i #define n 27 /叶子数目 #define m (2*n-1) /结点总数#define maxval 10000.0 #define maxsize 100 /哈夫曼编码的最大位数typedef struct char c

    7、h; float weight; int lchild,rchild,parent;hufmtree; typedef struct char bitsn; /位串 int start; /编码在位串中的起始位置 char ch; /字符codetype;void huffman(hufmtree tree);/建立哈夫曼树 void huffmancode(codetype code,hufmtree tree);/根据哈夫曼树求出哈夫曼编码 void decode(hufmtree tree);/依次读入字符,根据哈夫曼树译码 int main() printf(“ 哈夫曼编码n“); p

    8、rintf(“总共有 %d 个字符n“,n); hufmtree treem;codetype coden;int i,j;/循环变量huffman(tree);/建立哈夫曼树huffmancode(code,tree);/根据哈夫曼树求出哈夫曼编码printf(“【输出每个字符的哈夫曼编码】n“); for(i=0;in;i+) printf(“%c: “,codei.ch); for(j=codei.start;jn;j+) printf(“%c “,codei.bitsj); printf(“n“); printf(“【读入字符,并进行译码】n“); decode(tree);/依次读入

    9、电文,根据哈夫曼树译码 void huffman(hufmtree tree)/建立哈夫曼树计算机学院 数据结构课程设计报告1int i,j,p1,p2;/p1,p2 分别记住每次合并时权值最小和次小的两个根结点的下标float small1,small2,f; char c; for(i=0;im;i+) /初始化 treei.parent=0;treei.lchild=-1; treei.rchild=-1; treei.weight=0.0; printf(“【依次读入前%d 个结点的字符及权值(中间用空格隔开)】n“,n); for(i=0;in;i+) /读入前 n 个结点的字符及权

    10、值 printf(“输入第%d 个字符为和权值“,i+1); scanf(“%c %f“, getchar();treei.ch=c; treei.weight=f; for(i=n;im;i+) /进行 n-1 次合并,产生 n-1 个新结点 p1=0;p2=0;small1=maxval;small2=maxval; /maxval 是 float 类型的最大值 for(j=0;ji;j+) /选出两个权值最小的根结点 if(treej.parent=0) if(treej.weightsmall1) small2=small1; /改变最小权、次小权及对应的位置 small1=treej

    11、.weight; p2=p1; p1=j; else if(treej.weightsmall2) small2=treej.weight; /改变次小权及位置 p2=j; treep1.parent=i; treep2.parent=i; treei.lchild=p1; /最小权根结点是新结点的左孩子 计算机学院 数据结构课程设计报告1treei.rchild=p2; /次小权根结点是新结点的右孩子 treei.weight=treep1.weight+treep2.weight; /huffman void huffmancode(codetype code,hufmtree tree)

    12、/根据哈夫曼树求出哈夫曼编码/codetype code为求出的哈夫曼编码 /hufmtree tree为已知的哈夫曼树int i,c,p; codetype cd; /缓冲变量 for(i=0;in;i+) cd.start=n; cd.ch=treei.ch; c=i; /从叶结点出发向上回溯 p=treei.parent; /treep是 treei的双亲 while(p!=0) cd.start-; if(treep.lchild=c) cd.bitscd.start=0; /treei是左子树,生成代码0else cd.bitscd.start=1; /treei是右子树,生成代码1

    13、 c=p; p=treep.parent; codei=cd; /第 i+1 个字符的编码存入 codei /huffmancode void decode(hufmtree tree)/依次读入字符,根据哈夫曼树译码 int i,j=0; char bmaxsize; char endflag=2; /电文结束标志取 2i=m-1; /从根结点开始往下搜索printf(“输入发送的编码(以2为结束标志):“); gets(b); printf(“译码后的字符为“); while(bj!=2) if(bj=0) i=treei.lchild; /走向左孩子else i=treei.rchild; /走向右孩子 计算机学院 数据结构课程设计报告1if(treei.lchild=-1) /treei是叶结点 printf(“%c“,treei.ch); i=m-1; /回到根结点 j+; printf(“n“); if(treei.lchild!=-1 /输入电文有错 /decode4 设计结果与分析图 4.1计算机学院 数据结构课程设计报告1图 4.2图 4.3计算机学院 数据结构课程设计报告1图 4.4图 4.55 参考文献1 黄同成,黄俊民,董建寅数据结构M北京:中国电力出版社,2008 2 董建寅,黄俊民,黄同成数据结构实验指导与题解M北京:中国电力出版社,2008

    展开阅读全文
    提示  道客多多所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:哈夫曼编译码器课程设计报告.doc
    链接地址:https://www.docduoduo.com/p-10622305.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    道客多多用户QQ群:832276834  微博官方号:道客多多官方   知乎号:道客多多

    Copyright© 2025 道客多多 docduoduo.com 网站版权所有世界地图

    经营许可证编号:粤ICP备2021046453号    营业执照商标

    1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png



    收起
    展开