数据结构课程设计(赫夫曼编码)概要

上传人:今*** 文档编号:108140960 上传时间:2019-10-22 格式:DOC 页数:20 大小:165.50KB
返回 下载 相关 举报
数据结构课程设计(赫夫曼编码)概要_第1页
第1页 / 共20页
数据结构课程设计(赫夫曼编码)概要_第2页
第2页 / 共20页
数据结构课程设计(赫夫曼编码)概要_第3页
第3页 / 共20页
数据结构课程设计(赫夫曼编码)概要_第4页
第4页 / 共20页
数据结构课程设计(赫夫曼编码)概要_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《数据结构课程设计(赫夫曼编码)概要》由会员分享,可在线阅读,更多相关《数据结构课程设计(赫夫曼编码)概要(20页珍藏版)》请在金锄头文库上搜索。

1、数据结构课程设计报告专业班级:15信息一班学 号:20151209031004姓 名:任亚亭指导教师:张宇敬信息管理与工程系2016年 12 月30日题目:为信息收发站写一个赫夫曼码的编/译码系统一、 需求分析1、 问题描述:利用赫夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端讲传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。2、 基本要求:(1) I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立赫夫曼

2、树,并将它存于文件hfmTree中。(2) E:编码(Encoding)。利用已建好的赫夫曼树,对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。(3) D:译码(Decoding)。利用已建好的赫夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。(4) P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrin中。(5) T:印赫夫曼树(Tree Printing)。将已在内存中的赫夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的赫夫

3、曼树写入文件TreePrint中。3、 实现提示:(1) 编码结果以文本方式存储在文件CodeFile中。(2) 用户界面可以设计为“菜单”方式:显示上述功能符号,再加上“Q”,表示退出运行Quit。请用户键入一个选择功能符。此功能执行完毕后再显示此菜单,直至某次用户选择了“Q”为止。二、 概要设计1. 元素类型:typedef structint weigt;/权值int parent,lchild,rchild;/双亲,左孩子,右孩子HTNode,*HuffmanTree;typedef char* HuffmanCode;/存放各个字符的前缀编码2. 本程序包括六个大板块:(1)主程序:

4、 int main() 输出菜单;选择功能选项并调用对应的函数; (2)初始化函数: void Initialization(HuffmanTree &ht,FILE *fp) 安全打开文件;输入字符数量以及各字符及其权值;对各节点进行初始化;创建赫夫曼列表;(需要调用Select()函数选择权职最小的两个节点) void Select(HuffmanTree &ht,int i,int &s_1,int &s_2)找出第一个非零结点;找出第二个非零结点;遍历比较找出权值最小的两个节点;(3)编码函数:void Encoding(HuffmanTree &ht,HuffmanCode &hc,

5、FILE *fp1,FILE *fp2)安全打开文件;for:1n,双亲不为空If(为左孩子)str-start=0;elsestr-start=1;储存各字符的编码;从文件中读取正文;依次遍历正文各字符,显示其编码;(4)译码函数:void Decoding(HuffmanTree &ht,HuffmanCode &hc,FILE *fp1,FILE *fp2)安全打开文件;While(成功读取字符)遍历目前的编码中是否有对应的字符;if(有)输出该字符;else跳到循环体首;(再次读入一个字符再判断)(5)印代码文件:void Print(FILE *fp1,FILE *fp2)安全打开文

6、件;从文件中读取字符,50个一行输出;(6)印赫夫曼树:void Treeprinting(HuffmanTree ht)安全打开文件;调用print_tree(ht,root)函数;void print_tree(HuffmanTree ht, int r)if(存在节点)深度+1;递归调用print_tree(ht,htr.rchild);/先输出右子树用深度控制格式;输出对应的字符;递归调用print_tree(ht,htr.lchild);/再输出左子树深度-1三、 详细设计#include #include #include typedef structint weigt;int p

7、arent,lchild,rchild;HTNode,*HuffmanTree;typedef char* HuffmanCode;/存放各个字符的前缀编码/此全局文件指针用于输出赫夫曼树到对应文件,便于调用递归FILE *TreePrint=NULL;char *s;/存放各字符int *w;/存放各字符的权值int n;int m;int dep=0;/存放各字符的深度void Select(HuffmanTree ht,int i,int s_1,int s_2)/挑选出权值最小的两个结点int j;for(j=1;j=i;j+)/找出第一个非零结点if(htj.parent=0)s_1

8、=j;break;for(j=s_1+1;j=i;j+)/找出第二个非零结点if(htj.parent=0)s_2=j;break;for(j=1;j=i;j+)/遍历出权值最小的两个结点if(htj.parent=0)/必须要判断双亲是否为空if(htj.weigthts_1.weigt&htj.weigthts_2.weigt)s_2=j;void Initialization(HuffmanTree ht,FILE *fp)int i,s1,s2;if(fp=fopen(hfmTree.txt,w)=NULL)/安全打开文件printf(File hfmTree.txt cannot o

9、pened.n);exit(1);/输入各字符以及权值printf(请输入字符集大小n :);scanf(%d,&n);s=(char *)malloc(n*sizeof(char);w=(int *)malloc(n*sizeof(int);printf(请输入各字符:n);getchar();/getchar();/处理换行符/scanf(%s,s);gets(s);printf(请输入各字符对应的权值:n);for(i=0;in;i+)scanf(%d,&wi);if(n=1)return;m=2*n-1;/节、结点的个数ht=(HuffmanTree)malloc(m+1)*sizeo

10、f(HTNode);for(i=1;i=n;i+)/分别对各结点赋值hti.weigt=wi-1;hti.parent=hti.lchild=hti.rchild=0;for(i=n+1;i=m;i+)hti.weigt=hti.parent=hti.lchild=hti.rchild=0;/构建赫夫曼树for(i=n+1;i=m;i+)Select(ht,i-1,s1,s2);/选出权值最小的叶子节点hts1.parent=hts2.parent=i;hti.lchild=s1;hti.rchild=s2;hti.weigt=hts1.weigt+hts2.weigt;/构建新结点的权值/输

11、出赫夫曼列表printf(赫夫曼列表为:n);for(i=1;i=n;i+)/叶子节点fprintf(fp,t%ct%dt%dt%dt%dn,si,hti.weigt,hti.parent,hti.lchild,hti.rchild);printf(t%ct%dt%dt%dt%dn,si-1,hti.weigt,hti.parent,hti.lchild,hti.rchild);for(i=n+1;i=m;i+)/非叶子节点fprintf(fp,t t%dt%dt%dt%dn,hti.weigt,hti.parent,hti.lchild,hti.rchild);printf(t t%dt%d

12、t%dt%dn,hti.weigt,hti.parent,hti.lchild,hti.rchild);fclose(fp);void Encoding(HuffmanTree ht,HuffmanCode hc,FILE *fp1,FILE *fp2)/编码int i,j,c,f,start;char *str;/用于存放编码char data100;/用于存放文件正文字符if(fp1=fopen(ToBeTran.txt,r)=NULL)printf(File ToBeTran.txt cannot opened.n);exit(1);if(fp2=fopen(CodeFile.txt,w)=NULL)printf(File CodeFile.txt cannot opened.n);exit(1);/根据赫夫曼树得到各字符对应的编码hc=(HuffmanCode)malloc(n+1)*sizeof(char *);str=(char *)malloc(n*sizeof(char);/n个字符中的最长的编码个数为n-1strn-1=0;/编码从后开始往前存放for(i=1;i=n;i+)start=n-1;for(c=i,f=hti.parent;f

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号