哈夫曼编译码器课程设计报告材料完整版.doc
《哈夫曼编译码器课程设计报告材料完整版.doc》由会员分享,可在线阅读,更多相关《哈夫曼编译码器课程设计报告材料完整版.doc(30页珍藏版)》请在三一办公上搜索。
1、wordXXX学院本科数据结构课程设计总结报告 设计题目:实验一、哈夫曼编/译码器 学生某某:XXX 系 别:XXX 专 业:XXX 班 级:XXX 学 号:XXX 指导教师:XXX XXXxxx学院课 程 设 计 任 务 书题目一、赫夫曼编译码器 专业、班级xxx 学号xxx 某某 xxx主要内容、根本要求、主要参考资料等:1. 主要内容利用哈夫曼编码进展信息通信可大大提高信道利用率,缩短信息传输时间,降低传输本钱。要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进展译码复原。对于双工信道既可以双向传输信息的信道,每端都需要一个完整的编/译码系统。试为这样的信息收发站写一
2、个哈夫曼的编/译码系统。2. 根本要求 系统应具有以下功能:1C:编码Coding。对文件tobetrans中的正文进展编码,然后将结果存入文件codefile中,将以此建好的哈夫曼树存入文件HuffmanTree中2D:解码Decoding。利用已建好的哈夫曼树将文件codefile中的代码进展译码,结果存入textfile中。3P:打印代码文件Print。将文件codefile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件codeprint中。4T:打印哈夫曼树Tree Printing。将已在内存中的哈夫曼树以直观的方式树或凹入表形式显示在终端上,同时将此字符
3、形式的哈夫曼树写入文件treeprint中。3. 参考资料:数据结构C语言版 严蔚敏、吴伟民编著; 数据结构标准教程 胡超、闫宝玉编著完 成 期 限: 2012年6月21 日 指导教师签名:课程负责人签名:一、设计题目任选其一实验一、哈夫曼编/译码器二、 实验目的1巩固和加深对数据结构的理解,提高综合运用本课程所学知识的能力;2 深化对算法课程中根本概念、理论和方法的理解;3 巩固构造赫夫曼树的算法;4 设计试验用程序实验赫夫曼树的构造。三、运行环境软、硬件环境Windows xp sp3,英文版四、算法设计的思想1初始化赫夫曼树,输入文件tobetrans2编码Coding。对文件tobet
4、rans中的正文进展编码,然后将结果存入文件codefile中3D:解码Decoding。利用已建好的哈夫曼树将文件codefile中的代码进展译码,结果存入textfile中。4P:打印代码文件Print。将文件codefile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件codeprint中。5T:打印哈夫曼树Tree Printing。将已在内存中的哈夫曼树以直观的方式显示在终端上,同时将此字符形式的哈夫曼树写入文件treeprint中。五、 流程图六、 算法设计分析1.赫夫曼树节点的数据类型定义为:typedef struct /赫夫曼树的结构体char c
5、h;int weight; /权值int parent,lchild,rchild;HTNode,*HuffmanTree;2.void HuffmanCoding(HuffmanTree &,char *,int *,int);建立赫夫曼树的算法,此函数块调用了Select函数。void select(HuffmanTree HT,int j,int *x,int *y);从已建好的赫夫曼树中选择parent为0,weight最小的两个结点。3利用已建好的哈夫曼树从文件hfmtree.txt中读入,对文件中的正文进展编码,然后将结果存入文件codefile.txt中。4. coding 编码
6、功能:对输入字符进展编码5. Decoding译码功能: 利用已建好的哈夫曼树将文件codefile.txt中的代码进展译码,结果存入文件textfile.txt 中。6. Print() 打印功能函数:输出哈夫曼树以与对应的编码。七、源代码/#include #include #include /定义赫夫曼树结点的结构体typedef struct char ch; /增加一个域,存放该节点的字符int weight; int parent,lchild,rchild;HTNode,*HuffmanTree;typedef char *HuffmanCode; /指向赫夫曼编码的指针void
7、 tips(); /打印操作选择界面void HuffmanCoding(HuffmanTree &,char *,int *,int); /建立赫夫曼树的算法void select(HuffmanTree HT,int j,int *x,int *y); /从已建好的赫夫曼树中选择parent为0,weight最小的两个结点void Init(); void Coding(); /编码void Decoding(); /译码void Print_code(); /打印译码好的代码void Print_tree(); /打印哈夫曼树int Read_tree(HuffmanTree &); /
8、从文件中读入赫夫曼树void find(HuffmanTree &HT,char *code,char *text,int i,int m); /译码时根据01字符串寻找相应叶子节点的递归算法void Convert_tree(unsigned char T100100,int s,int *i,int j); /将内存中的赫夫曼树转换成凹凸表形式的赫夫曼树HuffmanTree HT; /全局变量int n=0; /全局变量,存放赫夫曼树叶子结点的数目int main()char select;while(1) tips(); scanf(%c,&select); switch(select
9、) /选择操作,根据不同的序号选择不同的操作 case 1:Init();break; case 2:Coding();break; case 3:Decoding();break; case 4:Print_code();break; case 5:Print_tree();break; case 0:exit(1); default :printf(Input error!n); getchar();return 0;void tips() /操作选择界面printf( -n);printf( - 请选择操作 -n);printf( -n);printf( n);printf( -1初始化
10、赫夫曼树 -n);printf( -2编码 -n);printf( -3译码 -n);printf( -4打印代码文件 -n);printf( -5打印赫夫曼树 -n);printf( -0退出 -n);printf( -n);/初始化函数,输入n个字符与其对应的权值,根据权值建立哈夫曼树,并将其存于文件hfmtree中void Init() FILE *fp;int i,n,w52; /数组存放字符的权值char character52; /存放n个字符printf(n输入字符个数 n:);scanf(%d,&n); /输入字符集大小printf(输入%d个字符与其对应的权值:n,n);fo
11、r (i=0;in;i+) char b=getchar(); scanf(%c,&characteri); scanf(%d,&wi); /输入n个字符和对应的权值 HuffmanCoding(HT,character,w,n); /建立赫夫曼树if(fp=fopen(hfmtree.txt,w)=NULL) printf(Open file hfmtree.txt error!n);for (i=1;i=2*n-1;i+) printf(File write error!n);printf(n赫夫曼树建立成功,并已存于文件hfmtree.txt中n);fclose(fp);/建立赫夫曼树的
12、算法void HuffmanCoding(HuffmanTree &HT,char *character,int *w,int n)int m,i,x,y;HuffmanTree p;if(n=1) return;m=2*n-1;HT=(HuffmanTree)malloc(m+1)*sizeof(HTNode);for(p=HT+1,i=1;ich=*character;p-weight=*w;p-parent=0;p-lchild=0;p-rchild=0;for(;ich=0;p-weight=0;p-parent=0;p-lchild=0;p-rchild=0;for(i=n+1;i=
13、m;+i) select(HT,i-1,&x,&y); HTx.parent=i;HTy.parent=i; HTi.lchild=x;HTi.rchild=y; HTi.weight=HTx.weight+HTy.weight;/从HT1到HTj中选择parent为0,weight最小的两个结点,用x和y返回其序号void select(HuffmanTree HT,int j,int *x,int *y)int i;/查找weight最小的结点for (i=1;i=j;i+) if (HTi.parent=0) *x=i;break;for (;i=j;i+) if (HTi.parent
14、=0)&(HTi.weightHT*x.weight) *x=i; HT*x.parent=1;/查找weight次小的结点for (i=1;i=j;i+) if (HTi.parent=0) *y=i;break;for (;i=j;i+) if (HTi.parent=0)&(i!=*x)&(HTi.weightHT*y.weight) *y=i;/对文件tobetrans中的正文进展编码,然后将结果存入文件codefile中void Coding() FILE *fp,*fw;int i,f,c,start;char *cd;HuffmanCode HC;if(n=0) n=Read_t
15、ree(HT);/从文件hfmtree.txt中读入赫夫曼树,返回叶子结点数/求赫夫曼树中各叶子节点的字符对应的的编码,并存于HC指向的空间中HC=(HuffmanCode)malloc(n+1)*sizeof(char*);cd=(char *)malloc(n*sizeof(char);cdn-1=0;for(i=1;i=n;+i) start=n-1; for(c=i,f=HTi.parent;f!=0;c=f,f=HTf.parent) if(HTf.lchild=c) cd-start=0; else cd-start=1; HCi=(char *)malloc(n-start)*s
16、izeof(char); strcpy(HCi,&cdstart);free(cd);if(fp=fopen(tobetrans.txt,rb)=NULL) printf(Open file tobetrans.txt error!n);if(fw=fopen(codefile.txt,wb+)=NULL) printf(Open file codefile.txt error!n);char temp;fscanf(fp,%c,&temp); /从文件读入第一个字符while(!feof(fp) for(i=1;i=n;i+) if(HTi.ch=temp) break; /在赫夫曼树中查找
17、字符所在的位置 for(int r=0;HCir!=0;r+) /将字符对应的编码存入文件 fputc(HCir,fw); fscanf(fp,%c,&temp); /从文件读入下一个字符fclose(fw);fclose(fp);printf(n已将文件hfmtree.txt成功编码,并已存入codefile.txt中!nn);/将文件codefile中的代码进展译码,结果存入文件textfile中void Decoding() FILE *fp,*fw;int m,i;char *code,*text,*p; if(n=0) n=Read_tree(HT);/从文件hfmtree.txt中
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈夫曼编 译码器 课程设计 报告 材料 完整版
链接地址:https://www.31ppt.com/p-1090963.html