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