南邮哈夫曼编码和译码系统
南邮数据结构实验二
![南邮数据结构实验二](https://img.taocdn.com/s3/m/8614bc52cf84b9d528ea7a20.png)
实验报告
( 2016 / 2017 学年第一学期)
课程名称数据结构A
实验名称二叉树的基本操作
及哈夫曼编码译码系统的实现
实验时间2017 年 5 月 1 日指导单位计算机学院计算机科学与技术系
指导教师邹志强
学生姓名吴爱天班级学号B15040916 学院(系) 计算机学院专业信息安全
实验报告
之后三步输出,对应的是三种遍历方式,应该输出的测试结果是:
先序:68 69 72 70 74 71 67 75 65 66
中序:72 69 74 70 71 75 67 68 65 66
后序:72 74 75 67 71 70 69 66 65 68
实验结果符合预期。
对于哈夫曼建树操作我自己又按照自己的想法重写了,里面也去学习了C++的字典类MAP,这个类非常好用,可以简单粗暴地提供一些方法和迭代器,让你将关键字和值绑定,这样我每新加入一个字母的数据块,我就可以记录下这对组合,不用之后搜索和解码的时
之后进行编码,其实也是一个搜索的过程,主要是调用了一个
测试:。
哈夫曼编码译码系统实验报告,数据结构课程设计报告
![哈夫曼编码译码系统实验报告,数据结构课程设计报告](https://img.taocdn.com/s3/m/8aab37a3b7360b4c2f3f641e.png)
v .. . ..安徽大学数据结构课程设计报告项目名称:哈弗曼编/译码系统的设计与实现姓名:鉏飞祥学号:E21414018专业:软件工程完成日期2016/7/4计算机科学与技术学院1 .需求分析1.1问题描述•问题描述:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(解码)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
试为这样的信息收发站设计一个哈夫曼编译码系统。
1.2基本要求(1)输入的形式和输入值的范围;(2)输出的形式;(3)程序所能达到的功能。
1.基本要求(1)初始化(Initialzation)。
从数据文件DataFile.data中读入字符及每个字符的权值,建立哈夫曼树HuffTree;(2)编码(EnCoding)。
用已建好的哈夫曼树,对文件ToBeTran.data中的文本进行编码形成报文,将报文写在文件Code.txt中;(3)译码(Decoding)。
利用已建好的哈夫曼树,对文件CodeFile.data中的代码进行解码形成原文,结果存入文件Textfile.txt中;(4)输出(Output)。
输出DataFile.data中出现的字符以及各字符出现的频度(或概率);输出ToBeTran.data及其报文Code.txt;输出CodeFile.data及其原文Textfile.txt;2. 概要设计说明本程序中用到的所有抽象数据类型的定义。
主程序的流程以及各程序模块之间的层次(调用)关系。
(1)数据结构哈夫曼树的节点struct huff{int weight;int parent;int l;int r;};哈夫曼编码的存储struct huff *hufftree;(2)程序模块选择1到i-1中parent为0且权值最小的两个下标void Select(struct huff *HT, int n, int &s1, int &s2)构建哈夫曼树:void huffmancoding(struct huff *ht,int *w,int n)对原文进行编码:void code(char *c)根据报文找到原文:void decoding(char *zifu)3. 详细设计核心技术分析:1:构建哈夫曼树及生成哈夫曼编码:根据每个字符权值不同,根据最优二叉树的构建方法,递归生成哈夫曼树,并且用数组存放哈夫曼树。
哈夫曼编码译码功能的简单实现
![哈夫曼编码译码功能的简单实现](https://img.taocdn.com/s3/m/380bb626cdbff121dd36a32d7375a417866fc1fe.png)
)
!科技风 "#$% 年 & 月
科技创新 !"#$%&$'(') *+&,-./&$01$21(3$&)%$4$4%%1
哈夫曼编码译码功能的简单实现
许子明
南京邮电大学!江苏南京!&%##$(
摘5要哈夫曼树是一种典型的数据结构由哈夫曼树生成的哈夫曼编码具有不等长的特点常被用于数据通信的二进制编 码中可以提高存储和处理文本的效率 本文提出一种建立简单的哈夫曼编码译码系统的方法 在建立完成的哈夫曼树的基础 上生成哈夫曼编码并对字符串进行编码对已有的数字编码进行译码
关键词哈夫曼树哈夫曼编码编码译码
%哈夫曼树和哈夫曼编码简介 给定 - 个权值作为 - 个叶子结点构造一棵二叉树若带 权路径长度达到最小称这样的二叉树为最优二叉树也称为 哈夫曼树 T`bbY_- =[QQ 哈夫曼树是带权路径长度最短的 树权值较大的结点离根较近 二叉树的路径长度是指由根结 点到所有叶子结点的路径长度之和 如果二叉树中的叶子结 点都有一定的权值则从根结点到每一个叶子结点的路径长度 与该叶子结点权值的乘积之和称为二叉树的带权路径长度 对于字符串序列如果对每个字符在计算机内采用固定长 度的二进制位来表示例如标准 JEA##码用 1 位二进制码表示 一个字符这种编码形式称为固定长度编码 若对于不同的字 符采用不同长度的二进制位来表示那么这种方式称为可变长 度编码 可变长度编码的特点是对出现频率不同的字符采用 不同长度的编码 对频率高的字符采用短编码对频率低的字 符采用长编码的方式 这样我们就可以减少数据的存储空间 提高存储和传输的效率 而通过哈夫曼树形成的哈夫曼编码
"编码原理 在哈夫曼编码成功后当输入由字符集中字符组成的任意 字符串时可以利用已生成的哈夫曼编码进行编码 在编码的 函数 M/-d 中有字符类参数 ,c 传入进行比较的字符还有结构 体参数 <=FGdQI用来指向树中的某个结点 开始时将第一个 字符与根结点作为参数传入 M/-d 函数中然后在 M/-d 函数中 将结点中存储的与字符串的字符进行比较若相同则记录下该 结点并将返回得到该字符的编码 若不相同则使用 M/-d 函 数递归遍历根节点的左右孩子节点不断递归直到找到需要的 字符为止 将所有字符的编码依次存储在队列中则可以得到 该字符串的编码 $译码原理 当输入数字编码时可以利用已经建成的哈夫曼树进行译 码 将数字编码存入队列中作为参数传入译码函数中 建立 结构体 <=FGdQ的指针 S初始化指向根节点 [GGI 当 S 指向的 结点不为空且该结点的左右孩子均不为空时取出数字编码 队列中队头的元素进行比较若为 %则 S 指向 S 的左孩子结 点若为 $则 S 指向 S 的右孩子结点 然后删除队头元素再 进行新的队头元素的比较直到 S 指向哈夫曼树的叶子节点为 止然后返回该叶子节点中存储的字符 或者当数字编码遍历 完之后结束译码函数 最后将译码得到的字符串输出即可
哈夫曼编码译码系统实验报告,数据结构课程设计报告书
![哈夫曼编码译码系统实验报告,数据结构课程设计报告书](https://img.taocdn.com/s3/m/db49f53ecc175527072208f4.png)
专业资料安徽大学数据结构课程设计报告项目名称:哈弗曼编/译码系统的设计与实现姓名:鉏飞祥学号:E21414018专业:软件工程完成日期2016/7/4计算机科学与技术学院1 .需求分析1.1问题描述•问题描述:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(解码)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
试为这样的信息收发站设计一个哈夫曼编译码系统。
1.2基本要求(1) 输入的形式和输入值的范围;(2) 输出的形式;(3) 程序所能达到的功能。
1.基本要求(1)初始化(Initialzation)。
从数据文件DataFile.data中读入字符及每个字符的权值,建立哈夫曼树HuffTree;(2)编码(EnCoding)。
用已建好的哈夫曼树,对文件ToBeTran.data中的文本进行编码形成报文,将报文写在文件Code.txt中;(3)译码(Decoding)。
利用已建好的哈夫曼树,对文件CodeFile.data 中的代码进行解码形成原文,结果存入文件Textfile.txt中;(4)输出(Output)。
输出DataFile.data中出现的字符以及各字符出现的频度(或概率);输出ToBeTran.data及其报文Code.txt;输出CodeFile.data 及其原文Textfile.txt;2. 概要设计说明本程序中用到的所有抽象数据类型的定义。
主程序的流程以及各程序模块之间的层次(调用)关系。
(1)数据结构哈夫曼树的节点struct huff{int weight;int parent;int l;int r;};哈夫曼编码的存储struct huff *hufftree;(2)程序模块选择1到i-1中parent为0且权值最小的两个下标void Select(struct huff *HT, int n, int &s1, int &s2)构建哈夫曼树:void huffmancoding(struct huff *ht,int *w,int n)对原文进行编码:void code(char *c)根据报文找到原文:void decoding(char *zifu)3. 详细设计核心技术分析:1:构建哈夫曼树及生成哈夫曼编码:根据每个字符权值不同,根据最优二叉树的构建方法,递归生成哈夫曼树,并且用数组存放哈夫曼树。
哈夫曼编码和译码的设计与实现
![哈夫曼编码和译码的设计与实现](https://img.taocdn.com/s3/m/984cdc4589eb172ded63b7ed.png)
算法与数据结构课程设计哈夫曼编码和译码的设计与实现1.问题描述利用哈夫曼编码进行通信可以大大提高信道的利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
试为这样的信息收发站设计一个哈夫曼码的编/译码系统。
2.基本要求a.编/译码系统应具有以下功能:(1)I:初始化(Initialization)。
从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。
(2)E:编码(Encoding)。
利用已建好的哈夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。
(3)D:译码(Decoding)。
利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。
(4)P:印代码文件(Print)。
将文件CodeFile以紧凑格式显示在终端上,每行50个代码。
同时将此字符形式的编码文件写入文件CodePrin中。
(5)T:印哈夫曼树(Tree printing)。
将已在内存中的哈夫曼树以直观的方式(树或凹入表形式或广义表)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。
b.测试数据(1)利用下面这道题中的数据调试程序。
某系统在通信联络中只可能出现八种字符,其概率分别为0.25,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 13.需求分析3.1程序的基本功能本程序可以对任何大小的字符型文件进行Huffman编码,生成一个编码文件。
哈夫曼编码译码系统
![哈夫曼编码译码系统](https://img.taocdn.com/s3/m/67d22d4a4028915f814dc274.png)
《数据结构》课程设计——赫夫曼编码/译码器设计指导教师:孙树森、周维达班级:09数媒(2)班学号:E09700227姓名:曾焕凯数据结构课程设计报告书一、实验目的1、提高分析问题、解决问题的能力,进一步巩固数据结构各种原理与方法。
2、熟悉掌握一门计算机语言,可以进行数据算法的设计。
二、实验原理1、哈夫曼树的定义:假设有n 个权值,试构造一颗有n 个叶子节点的二叉树,每个叶子带权值为wi,其中树带权路径最小的二叉树成为哈夫曼树或者最优二叉树;2、哈夫曼树的构造:weight 为输入的频率数组,把其中的值赋给依次建立的HT Node 对象中的data 属性,即每一个HT Node 对应一个输入的频率。
然后根据data 属性按从小到大顺序排序,每次从data 取出两个最小和此次小的HT Node,将他们的data 相加,构造出新的HTNode 作为他们的父节点,指针parent,leftchild,rightchild 赋相应值。
在把这个新的节点插入最小堆。
按此步骤可以构造构造出一棵哈夫曼树。
通过已经构造出的哈夫曼树,自底向上,由频率节点开始向上寻找parent,直到parent 为树的顶点为止。
这样,根据每次向上搜索后,原节点为父节点的左孩子还是右孩子,来记录1 或0,这样,每个频率都会有一个01 编码与之唯一对应,并且任何编码没有前部分是同其他完整编码一样的。
三、实验步骤先统计要压缩编码的文件中的字符字母出现的次数,按字符字母和空格出现的概率对其进行哈夫曼编码。
然后读入要编码的文件,编码后存入另一个文件;接着再调出编码后的文件,并对其进行译码输出,最后存入另一个文件中。
具体步骤:1.初始化,统计文本文件中各字符的个数作为权值,生成哈夫曼树;2.根据符号概率的大小按由大到小顺序对符号进行排序;3.把概率最小的两个符号组成一个节点;4.重复步骤2. 3 ,直到概率和为1;5.从根节点开始到相应于每个符号的“树叶”,概率大的标“0”,概率小的标“1”;6.从根节点开始,对符号进行编码;7.译码时流程逆向进行,从文件中读出哈夫曼树,并利用哈夫曼树将编码序列解码。
哈夫曼编码与译码
![哈夫曼编码与译码](https://img.taocdn.com/s3/m/ca2aeb0a03d8ce2f006623ae.png)
哈夫曼编码与译码孙宇E010141081.题目内容:利用Huffman编码进行通信可以大大提高信道的利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传数据进行预先编码,在接收端进行解码。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/解码系统。
2.基本要求:输入一段英文,系统自动计算出每个字符的权值,以及哈夫曼编码,显示哈夫曼树。
最终把字符串的编码的显示出来。
然后进行译码,把编码信息转换成相应的文字信息。
3.程序模块结构图4.详细程序设计#include "stdafx.h" #include<stdio.h> #include<malloc.h> 主函数模块编码模块解码模块打印代码模块打印树模块输入初始化模块#include<string.h>#define MAXSIZE 100#define N 100#define M 2*N-1typedef struct //建立哈夫曼树结点{char ch;int weight;int parent;int LChild;int RChild;}HTNode,HuffmanTree[MAXSIZE];typedef struct //定义结构体{char ch;int number;}NUM[MAXSIZE];typedef char * HuffmanCode[N+1];void menu(void);void getchars(char *str,int *len); //输入字符串void Init(int A[MAXSIZE],int *n); //输入结点的权值(备用)void CrtHuffmanTree(HuffmanT ree ht,NUM w,int n);//创建哈夫曼树void select(HuffmanT ree ht,int pos,int *s1,int *s2);void CrtHuffmanCode(HuffmanTree ht,HuffmanCode hc,int n);//创建哈夫曼编码void showHuffmanCode(HuffmanCode hc,int n,NUM w,char *str,char *code,int len);//显示哈夫曼编码及各结点详细信息void total(char str[MAXSIZE],NUM w,int *n,int len);void CrtHuffmanDecode(HuffmanTree ht,char *code,int n);//进行译码工作void CrtHuffmanDecode(HuffmanTree ht,char *code,int n) {char result[MAXSIZE]={0};int rootIndex=n*2-1;int i,j,root=rootIndex;printf("\n传过来的信息是:\n");puts(&code[1]);for(i=j=1;i<=(int)strlen(&code[1])+1;i++){if(ht[root].RChild==0){result[j++]=ht[root].ch;root=rootIndex;}if(code[i]=='1')root=ht[root].RChild;elseroot=ht[root].LChild;}result[j]=0;printf("\n译码的结果是:\n%s\n\n",&result[1]);puts(&result[1]);}void total(char str[MAXSIZE],NUM w,int *n,int len) {int i,j=1,k=1;for(i=1;i<=len;i++)w[i].number=0;w[k].ch=str[j];w[k].number++;k++;for(j=2;j<len;j++){for(i=1;i<k;i++)if(str[j]==w[i].ch){w[i].number++;break;}if(i==k){w[k].ch=str[j];w[k].number++;k++;}}*n=k-1;}void showHuffmanCode(HuffmanCode hc,int n,NUM w,char *str,char *code,int len){int i,j;printf("字符\t权值\t编码\n");for(i=1;i<=n;i++)printf("%c\t%d\t%s\n",w[i].ch,w[i].number,hc[i]);printf("\n字符编码是:\n");for(i=1;i<len;i++)for(j=1;j<=n;j++)if(str[i]==w[j].ch){// printf("%s",hc[j]);strcat(&code[1],hc[j]);// break;}puts(&code[1]);}void CrtHuffmanCode(HuffmanTree ht,HuffmanCode hc,int n) {int i,c,start,p;char *cd;cd=(char *)malloc((n+1)*sizeof(char));cd[n-1]='\0';for(i=1;i<=n;i++){start=n-1;c=i;p=ht[i].parent;while(p!=0){--start;if(ht[p].LChild==c)cd[start]='0';elsecd[start]='1';c=p;p=ht[p].parent;}hc[i]=(char *)malloc((n-start)*sizeof(char));strcpy(hc[i],&cd[start]);}free(cd);}void select(HuffmanT ree ht,int pos,int *s1,int *s2){int i,m1,m2;for(i=1;i<=pos;i++)if(ht[i].parent==0){m1=i;break;}for(i=1;i<=pos;i++)if(ht[i].weight<=ht[m1].weight && ht[i].parent==0) m1=i;*s1=m1;m2=m1;for(i=1;i<=pos;i++)if(ht[i].parent==0 && i!=m2){m1=i;break;}for(i=1;i<=pos;i++)if(ht[i].weight<=ht[m1].weight && ht[i].parent==0 && i!=m2)m1=i;*s2=m1;}void CrtHuffmanTree(HuffmanTree ht,NUM w,int n){//构造哈夫曼树ht[M+1],w[]存放n个权值int i,m,s1,s2;for(i=1;i<=n;i++){ht[i].ch=w[i].ch;ht[i].weight=w[i].number;ht[i].parent=0;ht[i].LChild=0;ht[i].RChild=0;}m=2*n-1;for(i=n+1;i<=m;i++){ht[i].ch=' ';ht[i].weight=0;ht[i].parent=0;ht[i].LChild=0;ht[i].RChild=0;}for(i=n+1;i<=m;i++){select(ht,i-1,&s1,&s2);ht[i].weight=ht[s1].weight+ht[s2].weight;ht[s1].parent=i;ht[s2].parent=i;ht[i].LChild=s1;ht[i].RChild=s2;}}void getchars(char *str,int *len){printf("请输入一行字符串:\n");gets(&str[1]);*len=strlen(str);}/*void Init(int w[MAXSIZE],int *n) {int num,i=1;printf("请输入一组权值(以0结束):");scanf("%d",&num);while(num){w[i]=num;i++;scanf("%d",&num);}*n=i-1;}*/void main(void){HuffmanTree ht;HuffmanCode hc;char code[MAXSIZE]="";NUM w;int n,len;char str[MAXSIZE];getchars(str,&len);total(str,w,&n,len);// Init(w,&n);CrtHuffmanTree(ht,w,n);CrtHuffmanCode(ht,hc,n);showHuffmanCode(hc,n,w,str,code,len);CrtHuffmanDecode(ht,code,n);}5.测试程序:输入一段英文I am sunyu,i am a student. 显示结果如下:运行成功!。
哈夫曼编码译码器实验报告
![哈夫曼编码译码器实验报告](https://img.taocdn.com/s3/m/c9e33566443610661ed9ad51f01dc281e43a5658.png)
哈夫曼编码译码器实验报告实验名称:哈夫曼编码译码器实验一、实验目的:1.了解哈夫曼编码的原理和应用。
2.实现一个哈夫曼编码的编码和译码器。
3.掌握哈夫曼编码的编码和译码过程。
二、实验原理:哈夫曼编码是一种常用的可变长度编码,用于将字符映射到二进制编码。
根据字符出现的频率,建立一个哈夫曼树,出现频率高的字符编码短,出现频率低的字符编码长。
编码过程中,根据已建立的哈夫曼树,将字符替换为对应的二进制编码。
译码过程中,根据已建立的哈夫曼树,将二进制编码替换为对应的字符。
三、实验步骤:1.构建一个哈夫曼树,根据字符出现的频率排序。
频率高的字符在左子树,频率低的字符在右子树。
2.根据建立的哈夫曼树,生成字符对应的编码表,包括字符和对应的二进制编码。
3.输入一个字符串,根据编码表将字符串编码为二进制序列。
4.输入一个二进制序列,根据编码表将二进制序列译码为字符串。
5.比较编码前后字符串的内容,确保译码正确性。
四、实验结果:1.构建哈夫曼树:-字符出现频率:A(2),B(5),C(1),D(3),E(1) -构建的哈夫曼树如下:12/\/\69/\/\3345/\/\/\/\ABCDE2.生成编码表:-A:00-B:01-C:100-D:101-E:1103.编码过程:4.译码过程:5.比较编码前后字符串的内容,结果正确。
五、实验总结:通过本次实验,我了解了哈夫曼编码的原理和应用,并且实现了一个简单的哈夫曼编码的编码和译码器。
在实验过程中,我充分运用了数据结构中的树的知识,构建了一个哈夫曼树,并生成了编码表。
通过编码和译码过程,我进一步巩固了对树的遍历和节点查找的理解。
实验结果表明,本次哈夫曼编码的编码和译码过程正确无误。
在实验的过程中,我发现哈夫曼编码对于频率较高的字符具有较短的编码,从而实现了对字符串的高效压缩。
同时,哈夫曼编码还可以应用于数据传输和存储中,提高数据的传输效率和存储空间的利用率。
通过本次实验,我不仅掌握了哈夫曼编码的编码和译码过程,还深入了解了其实现原理和应用场景,加深了对数据结构和算法的理解和应用能力。
数据结构实验,哈夫曼编码译码系统
![数据结构实验,哈夫曼编码译码系统](https://img.taocdn.com/s3/m/531ffe70ae1ffc4ffe4733687e21af45b307fe12.png)
数据结构实验,哈夫曼编码译码系统展开全文1. 实验名称: 二叉树的基本操作及哈夫曼编码译码系统的实现2.实验目的:创建一棵二叉树,实现先序、中序和后序遍历一棵二叉树,计算二叉树结点个数等操作。
哈夫曼编码/译码系统。
3. 实验任务:能成功演示二叉树的有关运算,运算完毕后能成功释放二叉树所有结点占用的系统内存。
4. 实验内容(1)在二叉链表上实现二叉树运算a) 设计递归算法,实现二叉树的基本运算:删除一棵二叉树,求一棵二叉树的高度,求一棵二叉树中叶子结点数,复制一棵二叉树,交换一棵二叉树的左右子树。
b) 设计算法,按自上到下,自左到右的次序,即按层次遍历一棵二叉树。
c) 设计main函数,测试上述每个运算。
d) 提示:队列结构可以辅助进行层次遍历,队列的元素类型是指向二叉树结点的指针类型。
(2)哈夫曼编码和译码系统a) 设计一个菜单可以循环显示B——建树:读入字符集和各字符频度,建立哈夫曼树。
T——遍历:先序和中序遍历二叉树。
E——生成编码:产生每个字符的哈夫曼编码。
C——编码:输入由字符集中字符组成的任意字符串,利用已经生成的哈夫曼编码进行编码,显示编码结果。
D——译码:利用已建成的哈夫曼树进行译码。
X——退出。
b) 提示:修改二叉树结点类BTNode,增加一个指向双亲的parent域,修改二叉树类的函数MakeTree设置该域的值;可以通过遍历哈夫曼树生成每个叶子结点的哈夫曼编码。
5. 概要设计1) 二叉树首先定义结点类BTNode包括对结点的访问,打印,交换结点左右元素等操作。
并将二叉树类BTree声明为友元类。
二叉树类中包含了建树,判断二叉树是否为空,求结点数,求高度,删除,交换左右子树,三种次序遍历及按层次遍历,清空二叉树等函数。
在主函数中调用实现这些功能。
类和类的层次设计主要算法:PreOrder:输出当前结点元素,左右孩子递归调用函数。
InOrder:左孩子递归调用函数,输出当前结点元素,右孩子递归调用。
哈夫曼编码译码系统实验报告
![哈夫曼编码译码系统实验报告](https://img.taocdn.com/s3/m/c552c1c1c850ad02df80417a.png)
目录摘要 (II)Abstract (II)第一章课题描述 (1)1.1 问题描述 (1)1.2 需求分析…………………………………………………..……………………………11.3 程序设计目标……………………………………………………………………………第二章设计简介及设计方案论述 (2)2.1 设计简介 (2)2.2 设计方案论述 (2)2.3 概要设计 (2)第三章详细设计 (4)3.1 哈夫曼树 (4)3.2哈夫曼算法 (4)3.2.1基本思想 (4)3.2.2存储结构 (4)3.3 哈夫曼编码 (5)3.4 文件I/O 流 (6)3.4.1 文件流 (6)3.4.2 文件的打开与关闭 (7)3.4.3 文件的读写 (7)3..5 C语言文件处理方式..............................................................................第四章设计结果及分析 (8)4.1 设计系统功能 (8)4.2 进行系统测试 (8)总结 (13)致 (1)4参考文献 (15)附录主要程序代码 (16)摘要在这个信息高速发展的时代,每时每刻都在进行着大量信息的传递,到处都离不开信息,它贯穿在人们日常的生活生产之中,对人们的影响日趋扩大,而利用哈夫曼编码进行通信则可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
在生产中则可以更大可能的降低成本从而获得更大的利润,这也是信息时代发展的趋势所在。
本课程设计的目的是使学生学会分析待加工处理数据的特性,以便选择适当的逻辑结构、存储结构以及进行相应的算法设计。
学生在学习数据结构和算法设计的同时,培养学生的抽象思维能力、逻辑推理能力和创造性的思维方法,增强分析问题和解决问题的能力。
此次设计的哈夫曼编码译码系统,实现对给定报文的编码和译码,并且任意输入报文可以实现频数的统计,建立哈夫曼树以及编码译码的功能。
哈夫曼编码和译码系统
![哈夫曼编码和译码系统](https://img.taocdn.com/s3/m/bd62f67ba32d7375a4178095.png)
题目:哈夫曼编码和译码系统院系:专业:姓名:学号:指导教师:日期:实训报告目录一.需求分析 (2)二.概要设计(1)建立哈夫曼树、编码 (3)(2)字符匹配 (3)(3)哈夫曼树遍历 (3)三.详细设计及编码实现 (3)四.流程图(1)总流程图 (15)(2)编码实现流程图 (16)(3)译码实现流程图 (17)五.调试分析(1)计算权值 (18)(1)生成哈夫曼树,建立编码表 (18)(3)将输入字符编码 (19)(4)输入新的字符串,进行译码 (19)(5)输入新的二进制数将其译为字符 (20)六. 系统维护 (20)七.实验总结 (20)八. 源代码 (21)一.需求分析《1》问题描述:在传送电文时,人们总是希望传送时间尽可能短,这就是要求使电文代码长度尽可能短。
利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统能够对待传输数据预先编码,在接收端将传来的数据进行译码。
对于双工信道(即可以双向传输信息的信道),每段都需要一个完整的编/译系统。
所以为这样的信息收发站写一个哈夫曼的编译码系统。
《2》打开一篇英文文章,统计该文章中每个字符出现的次数,然后以它们作为权值,对每一个字符进行编码,编码完成后再对其编码进行译码。
问题补充:1. 从硬盘的一个文件里读出一段英语文章。
2. 统计这篇文章中的每个字符出现的次数。
3. 以字符出现字数作为权值,构建哈夫曼树,并将哈夫曼树的存储结构的初态和终态进行输出。
4. 对每个字符进行编码并将所编码写入文件然后对所编码进行编译。
《3》这个哈夫曼编码译码主要是以英文字母输入进行编码与编译,编码译码过程由系统自动完成,人工操作部分就是电文的录入,和编译出来时的读操作。
二.概要设计本程序主要用到了三个算法。
(1)哈夫曼树建立、编码在初始化(I)的过程中间,要用输入的字符和权值建立哈夫曼树并求得哈夫曼编码。
先将输入的字符和权值存放到一个结构体数组中,建立哈夫曼树,将计算所得的哈夫曼编码存储到另一个结构体数组中。
实验模板——哈夫曼编译码系统
![实验模板——哈夫曼编译码系统](https://img.taocdn.com/s3/m/7aaa35016bec0975f565e278.png)
五、实验环境(使用的软硬件):
利用Visual C++集成开发环境进行本实验的操作。
六、实验步骤及操作:
1.启动VC++,新建工程/Win32 Console Application,选择“An Empty Project”建工程名为“哈夫曼编/译码系统”;
2.新建/C/C++Header Fole,文件名保存为“HuffmanUse.c”,选中菜单“add to project”;
3.程序如下:
…………………………………….
《3》.开始界面设计
void Start_Screen()
{
printf("\n\n\n");
printf("\t* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\t\n");
闽 江 学 院 电 子 系
实验报告
学生姓名:
班级:
学号:
课程:数据结构与算法
一、实验题目:哈夫曼编/译码系统的设计与实现
二、实验地点:计算机软件与网络实验室-实验楼A210
三、实验目的:
1.理解哈夫曼树的特征及其应用;
2.在对哈夫曼树进行理解的基础上,构造哈夫曼树,并用构造的哈夫曼树进行编码和译码;
字符
A
B
C
D
E
F
G
H
I
J
K
L
M
频度
64
13
22
32
103
21
15
47
57
哈夫曼编码译码器系统
![哈夫曼编码译码器系统](https://img.taocdn.com/s3/m/e21d1f6c71fe910ef02df861.png)
哈夫曼编码译码器系统目录(1)一、系统开发的背景 .......................................................................................................(1)二、系统剖析与设计 .......................................................................................................(2)三、系统的设计与实现 ...................................................................................................(一)设计初始化( Initialization) (2)(3)(二)设计编码( Encoding ) .......................................................................................(3)(三)设计译码( Decoding ) .......................................................................................(四)设计印代码文件( Print) (4)(五)设计印哈夫曼树( TreePrinting) (4)(5)四、系统测试 ...................................................................................................................(5)(一)测试 main 函数 .....................................................................................................(二)测试编码( Encoding )及译码( Decoding )函数 (5)(三)测试印代码文件( Print)函数 (6)(6)(四)测试有关的根目录 ................................................................................................(6)五、总结 ............................................................................................................................(7)六、附件(代码、部分图表) ........................................................................................哈夫曼编 / 译码器系统一、系统开发的背景为了提升信道利用率,缩短信息传输时间,降低传输成本,且在信息发送端经过一个编码系统对待传数据早先编码,在信息接收端将传来的数据进行译码(还原),所以设计哈夫曼编码/ 译码器系统。
数据结构课程设计哈夫曼编码译码器
![数据结构课程设计哈夫曼编码译码器](https://img.taocdn.com/s3/m/88cc2679cdbff121dd36a32d7375a417866fc199.png)
题目一: 哈夫曼编码与译码一、任务设计一个运用哈夫曼算法的编码和译码系统, 反复地显示并解决以下项目, 直到选择退出为止。
规定:1) 将权值数据存放在数据文献(文献名为data.txt, 位于执行程序的当前目录中) ;2) 初始化:键盘输入字符集记录字符权值、自定义26个字符和26个权值、记录文献中一篇英文文章中26个字母, 建立哈夫曼树;3) 编码: 运用建好的哈夫曼树生成哈夫曼编码;4) 输出编码(一方面实现屏幕输出, 然后实现文献输出);5)译码(键盘接受编码进行译码、文献读入编码进行译码);6) 界面优化设计。
二、流程图三、代码分解 //头文献 #include<stdio.h> #include<string.h> #include<stdlib.h> #include <conio.h> #define N 1000 #define M 2*N-1 #define MAXcode 6000 //函数声明void count(CHar &ch,HTNode ht[]);void editHCode(HTNode ht[],HCode hcd[],CHar &ch,int n,char bianma[]); //编码函数void printyima(HTNode ht[],HCode hcd[],int n,char bianma[]); //译码函数 void creatHT(HTNode ht[],int n);字符集记录符集记录权值 权值 至文献“哈夫曼树。
t xt” 菜单1.从键盘输入字符集进行编码2.从文献读入字符集进行编码1.从键盘输入编码进行译码2.从文献读入编码进行译码0.返回上级菜单 0.返回上级菜单void CreateHCode (HTNode ht[],HCode hcd[],int n);void DispHCode(HTNode ht[],HCode hcd[],int n);void input_key(CHar &ch);void input_file(CHar &ch);void input_cw(HTNode ht[]);void bianma1(HTNode ht[],HCode hcd[],CHar &ch,int n,char bianma[]); void bianma2(HTNode ht[],HCode hcd[],CHar &ch,int n,char bianma[]); void yima1(HTNode ht[],HCode hcd[],int n,char bianma[]);void yima2(HTNode ht[],HCode hcd[],int n,char bianma[]);void creat_cw();void bianmacaidan();void yimacaidan();void bianmayima();int caidan();//结构体typedef struct{char data;int parent;int weight;int lchild;int rchild;}HTNode;typedef struct{char cd[N];int start;}HCode;typedef struct{char s[N];int num;}CHar;CHar ch;HTNode ht[M];HCode hcd[N];//主函数int main(){int xh;while(1){system("color 1f"); //操作菜单背景颜色 xh=caidan(); //调用菜单函数switch(xh) //switch语句 {case 1:system("cls");creat_cw();break;case 2:system("cls");creatHT(ht,n);break;case 3:system("cls");CreateHCode(ht,hcd,n);DispHCode(ht,hcd,n);break;case 4:system("cls");bianmayima();break;case 0:system("cls");printf("\n\n\n\n\n\n\n\n\n\t\t\t\t感谢使用本系统!\n\n\n\n\n\n\n \t\t\t");exit(0);default:system("cls");putchar('\a');printf("\n\t\t输入有误, 请重新输入:\n");break;}}return 0;}//菜单函数int caidan() //菜单函数模块//{int xh;printf("\n\n\n");printf("\t\t 欢迎使用哈夫曼编码译码系统\n");printf("\t\t \n");printf("\t\t*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");printf("\t\t*= =*\n");printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*= =*\n");printf("\t\t*= 1.建立字符权值=*\n");printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*= =*\n"); printf("\t\t*= 2.建立并输出哈夫曼树=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*= =*\n"); printf("\t\t*= 3.生成并查看哈夫曼编码=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*= =*\n"); printf("\t\t*= 4.编码与译码=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*= =*\n"); printf("\t\t*= 0.退出系统=*\n"); printf("\t\t*= =*\n"); printf("\t\t*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n"); printf("\n\t\t请输入序号进行选择:");scanf("%d", &xh);return xh; //返回从键盘接受的选项}void bianmayima(){int xh;while(1){printf("\n\n\n\n\n");printf("\t\t 编码与译码\n"); printf("\t\t \n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n");printf("\t\t*= 1.编码=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 2.译码=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 0.返回上级菜单=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\n\t\t请输入序号进行选择:");scanf("%d",&xh);switch(xh) //switch语句{case 1:system("cls");bianmacaidan();break;case 2:system("cls");yimacaidan();break;case 0:system("cls");return;default:system("cls");putchar('\a');printf("\n\t\t输入有误, 请重新输入:\n");break;}}}void yimacaidan(){int xh;while(1){printf("\n\n\n\n\n");printf("\t\t 译码\n"); printf("\t\t \n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 1.键盘输入编码进行译码=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 2.文献读入编码进行译码=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 0.返回上级菜单=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\n\t\t请输入序号进行选择:");scanf("%d",&xh);switch(xh) //switch语句{case 1:system("cls");yima1(ht,hcd,n,bianma);break;case 2:system("cls");yima2(ht,hcd,n,bianma);break;case 0:system("cls");return;default:system("cls");putchar('\a');printf("\n\t\t输入有误, 请重新输入:\n");break;}}}void bianmacaidan(){int xh;while(1){printf("\n\n\n\n\n");printf("\t\t 编码\n"); printf("\t\t \n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 1.键盘输入字符集编码=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 2.文献读入文章编码=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 0.返回上级菜单=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\n\t\t请输入序号进行选择:");scanf("%d",&xh);switch(xh) //switch语句{case 1:system("cls");bianma1(ht,hcd,ch,n,bianma);break;case 2:system("cls");bianma2(ht,hcd,ch,n,bianma);break;case 0:system("cls");return;default:system("cls");putchar('\a');printf("\n\t\t输入有误, 请重新输入:\n");break;}}}void creat_cw(){int xh2;while(1){printf("\n\n\n\n\n");printf("\t\t 建立字符权值\n"); printf("\t\t \n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 1.从键盘输入字符集进行记录=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 2.从文献读入字符集记录=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 3.自定义字符权值=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\t\t*= 0.返回上级菜单=*\n"); printf("\t\t*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*\n"); printf("\n\t\t请输入序号进行选择:");scanf("%d",&xh2);switch(xh2) //switch语句{case 1:system("cls");input_key(ch);break;case 2:system("cls");input_file(ch);break;case 3:system("cls");input_cw(ht);break;case 0:system("cls");return;default:system("cls");putchar('\a');printf("\n\t\t输入有误, 请重新输入:\n");break;}}}//建立字符权值模块void input_key(CHar &ch){int i,j=0;char st[N];printf("请输入字符集(以‘#’结束):\n");for(i=0;i<N;i++){scanf("%c",&st[i]);if(st[i]=='#'){st[i]='\0';break;}}strcpy(ch.s,st);count(ch,ht);printf("按任意键返回!");getch();system("cls");return;}void input_file(CHar &ch){int i;FILE*fp;char filename[20];printf("请输入要打开的文献名(*.txt):");scanf("%s",&filename);if((fp=fopen(filename,"r"))==NULL){printf("\n\t\t文献打开失败");return;}for(i=0;!feof(fp);i++){fread(&ch.s[i],sizeof(char),1,fp);}printf("读入成功!\n");printf("文献中的字符集为:%s\n",ch.s);fclose(fp);count(ch,ht);printf("按任意键返回!");getch();system("cls");return;}void input_cw(HTNode ht[]){int i,w,s,j;char a;printf("要输入的字符总个数是?:");scanf("%d",&s);n=s;printf("请输入字符及其权值:\n");for(i=0;i<s;i++){printf("请输入第%d个字母:",i+1);scanf("%s",&a);ht[i].data=a;printf("请输入其权值:");scanf("%d",&w);ht[i].weight=w;}FILE *fp;if((fp=fopen("data.txt","w"))==0){printf("\n\t\t文献打开失败");return;}printf("\n定义权值成功!\n\n");printf("各字符及其权值为:\n\n");fprintf(fp,"各字符及其权值为:\n");printf(" 字符\t权值");fprintf(fp," 字符\t权值");for(j=0;j<i;j++){ printf("\n");fprintf(fp,"\n");printf(" %-8c%-8d",ht[j].data,ht[j].weight);fprintf(fp," %-8c%-8d%",ht[j].data,ht[j].weight); }printf("\n");printf("\n字符权值已输出至文献“data.txt”!");fclose(fp);printf("输入完毕, 按任意键返回!");getch();system("cls");return;}//记录字符权值函数void count(CHar &ch,HTNode ht[]){int i,j,m=0;char c[N];int sum[N]={0};for(i=0;ch.s[i]!='\0';i++){for(j=0;j<m;j++)if(ch.s[i]==c[j]||(c[j]>='a'&&c[j]<='z'&&ch.s[i]+32==c[j])) break;if(j<m)sum[j]++;else{if(ch.s[i]>='A'&&ch.s[i]<='Z')c[j]=ch.s[i]+32;else c[j]=ch.s[i];sum[j]++;m++;}}for(i=0;i<m;i++){ht[i].data=c[i];ht[i].weight=sum[i];}n=m;FILE *fp;if((fp=fopen("data.txt","w"))==0) {printf("\n\t\t文献打开失败"); return;}printf("\n记录权值成功!\n\n"); printf("各字符及其权值为:\n\n"); fprintf(fp,"各字符及其权值为:\n"); printf(" 字符\t权值");fprintf(fp," 字符\t权值");for(j=0;j<m;j++){ printf("\n");fprintf(fp,"\n");printf(" %-8c%-8d",ht[j].data,ht[j].weight);fprintf(fp," %-8c%-8d%",ht[j].data,ht[j].weight);}printf("\n");printf("\n字符权值已输出至文献“data.txt”!");fclose(fp);}//构造哈夫曼树void creatHT(HTNode ht[],int n){FILE *fp;if((fp=fopen("哈夫曼树.txt","w"))==0){printf("\n\t\t文献打开失败");return;}int i,j,k,lnode,rnode;int min1,min2;for (i=0;i<2*n-1;i++)ht[i].parent=ht[i].lchild=ht[i].rchild=-1;for (i=n;i<2*n-1;i++){min1=min2=32767;lnode=rnode=-1;for(k=0;k<=i-1;k++)if(ht[k].parent==-1){if (ht[k].weight<min1){min2=min1;rnode=lnode;min1=ht[k].weight;lnode=k;}else if(ht[k].weight<min2){min2=ht[k].weight;rnode=k;}}ht[lnode].parent=i;ht[rnode].parent=i;ht[i].weight=ht[lnode].weight+ht[rnode].weight;ht[i].lchild=lnode;ht[i].rchild=rnode;}printf("建立huffman树成功!\n");printf("输出huffman树:\n");fprintf(fp,"输出huffman树:\n");printf("\t字符\t权值\t父节点\t 左子节点\t右子节点");fprintf(fp,"\t字符\t权值\t父节点\t 左子节点\t右子节点");for(j=1;j<i;j++){ printf("\n");fprintf(fp,"\n");printf("\t %-8c%-8d%-10d%-14d%-10d",ht[j].data,ht[j].weight,ht[j].parent,ht[i]. lchild,ht[j].rchild);fprintf(fp,"\t %-8c%-8d%-10d%-14d%-10d",ht[j].data,ht[j].weight,ht[j].parent,h t[i].lchild,ht[j].rchild);}printf("\n");printf("哈夫曼树已输出至文献“哈夫曼树.txt”!按任意键返回!");fclose(fp);getch();system("cls");return;}//生成哈夫曼编码void CreateHCode (HTNode ht[],HCode hcd[],int n){int i,f,c,j=0;HCode hc;for(i=0;i<n;i++){hc.start=n;c=i;hc.cd[hc.start--]='0';f=ht[i].parent;while(f!=-1){if (ht[f].lchild==c)hc.cd[hc.start--]='0';elsehc.cd[hc.start--]='1';c=f;f=ht[f].parent;}hc.start++;for(j=0;j<hc.start;j++)hc.cd[j]=' ';hcd[i]=hc;}}void DispHCode(HTNode ht[],HCode hcd[],int n) {FILE *fp;if((fp=fopen("哈夫曼编码.txt","w"))==0){printf("\n\t\t文献打开失败");return;}int i,k;int sum=0,m=0,j;printf("输出字符哈夫曼编码:\n"); fputs("输出字符哈夫曼编码:\n",fp); for (i=0;i<n;i++){j=0;printf("%c:\t",ht[i].data);fprintf(fp,"\n%c:\t",ht[i].data);for (k=hcd[i].start;k<=n;k++){printf("%c",hcd[i].cd[k]);j++;fprintf(fp,"%c",hcd[i].cd[k]); }m+=ht[i].weight;sum+=ht[i].weight*j;printf("\n");}printf("\n哈夫曼编码已保存至文献“哈夫曼编码.txt!按任意键返回!”");fclose(fp);getch();system("cls");}//编码函数void bianma1(HTNode ht[],HCode hcd[],CHar &ch,int n,char bianma[]){int i;char str[N];printf("请输入要编码的字符集(以‘#’结束):\n");for(i=0;i<N;i++){scanf("%c",&str[i]);if(str[i]=='#'){str[i]='\0';break;}}strcpy(ch.s,str);ch.num=strlen(str);editHCode(ht,hcd,ch,n,bianma);getch();system("cls");}void bianma2(HTNode ht[],HCode hcd[],CHar &ch,int n,char bianma[]) {int i;FILE*fp;char filename[20];printf("请输入要打开的文献名(*.txt):");scanf("%s",&filename);if((fp=fopen(filename,"r"))==NULL){printf("\n\t\t文献打开失败");return;}for(i=0;!feof(fp);i++){fread(&ch.s[i],sizeof(char),1,fp);}ch.num=strlen(ch.s);printf("\n读入成功!\n");printf("文献中的字符集为:\n%s",ch.s);fclose(fp);editHCode(ht,hcd,ch,n,bianma);system("cls");return;}//译码函数void yima1(HTNode ht[],HCode hcd[],int n,char bianma[]) {int i;char code[MAXcode];printf("请输入编码进行译码(以‘#’结束):\n");for(i=0;i<MAXcode;i++){scanf("%c",&code[i]);if(code[i]=='#'){code[i]='\0';break;}}strcpy(bianma,code);printyima(ht,hcd,n,bianma);printf("\n译码完毕!按任意键返回!");getch();system("cls");return;}void yima2(HTNode ht[],HCode hcd[],int n,char bianma[]) {int i;FILE*fp;char filename[20];printf("请输入要打开的文献名(*.txt):");scanf("%s",&filename);if((fp=fopen(filename,"r"))==NULL){printf("\n\t\t文献打开失败");return;}for(i=0;!feof(fp);i++){fread(&bianma[i],sizeof(char),1,fp);}printf("读入成功!\n");printf("文献中的编码是:%s\n",bianma);printyima(ht,hcd,n,bianma);printf("\n译码完毕!按任意键返回!");getch();system("cls");}四、调试结果主菜单建立字符权值选择2.从文献读入字符进行记录输入测试文献名“cs.txt”输出个字符权值建立哈夫曼树并输出至文献生成哈夫曼编码并保存至文献编码选择2.从文献读入字符集编码编码结果保存至文献译码选择2.从文献读入编码, 读入上一步的编码译码完毕, 返回!退出系统。
哈夫曼编码译码系统(树应用)
![哈夫曼编码译码系统(树应用)](https://img.taocdn.com/s3/m/7d283dd6a58da0116c174916.png)
实验三哈夫曼编码/译码系统(树应用)一、实验目的1. 帮助读者复习C++语言程序设计中的知识。
2.哈夫曼树的建立,哈夫曼编码的生成,对编码信息的翻译的熟悉和运用。
[需求分析]利用哈夫曼编码进行通信,可以压缩通信的数据量,提高传输效率,缩短信息的传输时间,还有一定的保密性。
现在要求编写一程序模拟传输过程,实现在发送前将要发送的字符信息进行编码,然后进行发送,接收后将传来的数据进行译码,即将信息还原成发送前的字符信息。
二、实验内容和要求[问题要求]利用哈夫曼编码进行通信,可以压缩通信的数据量,提高传输效率,缩短信息的传输时间,还有一定的保密性。
现在要求编写一程序模拟传输过程,实现在发送前将要发送的字符信息进行编码,然后进行发送,接收后将传来的数据进行译码,即将信息还原成发送前的字符信息。
[问题分析]在本例中设置发送者和接受者两个功能,发送者的功能包括:输入待传送的字符信息;统计字符信息中出现的字符种类数和各字符出现的次数(频率);根据字符的种类数和各自出现的次数建立哈夫曼树;利用以上哈夫曼树求出各字符的哈夫曼编码;将字符信息转换成对应的编码信息进行传送。
接受者的功能包括:接收发送者传送来的编码信息;利用上述哈夫曼树对编码信息进行翻译,即将编码信息还原成发送前的字符信息。
本实验首先从文件中读取数据,然后分析数据对不同的元素依次存入一字符数组并统计其出现的次数并当做其权值,然后根据这些信息建立哈弗曼树,并对各个字符进行哈弗曼编码然后根据各个字符的编码对所有输入的一组字符进行哈弗曼编码。
译码是根据哈弗曼树和接收到的一组编码进行译码操作。
译码也就是对哈弗曼树的遍历三、算法设计首先读入一组字符,然后统计这些字符中不同字符出现的次数,并当做其权值,然后根据不同字符及其权值建立哈弗曼树。
建立哈弗曼树后即可得到这些不同字符的哈弗曼编码,然后即可根据这些哈弗曼编码对那组输入的一串字符进行哈弗曼编码。
译码是根据一组编码翻译成一组字符的操作,其算法就是根据这一串编码来对哈弗曼树进行遍历,每遍历到一个叶子结点即输出一个字符,直至将编码操作完即可完成多编码的翻译操作。
哈夫曼编译码系统实验报告
![哈夫曼编译码系统实验报告](https://img.taocdn.com/s3/m/22f6f58fe53a580216fcfeff.png)
数学与计算机学院数据结构实验报告年级大二学号********* 姓名******* 成绩专业电气信息类(计算机)实验地点主楼402 指导教师实验项目实验日期2010年11月20日一、实验目的和要求通过对简单哈夫曼编/译码系统的设计与实现来熟练掌握树型结构在实际问题中的应用。
此实验可以作为综合实验,阶段性实验时可以选择其中的几个功能来设计和实现。
二、问题描述利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
试为这样的信息收发编写一个哈夫曼码的编/译码系统。
三、数据结构设计1、构造哈夫曼树时使用静态链表作为哈夫曼树的存储。
在构造哈夫曼树时,设计一个结构体数组HuffNode保存哈夫曼树中各结点的信息,根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有2n-1个结点,所以数组HuffNode的大小设置为2n-1;描述结点的数据类型为:struct HNodeType{char data; //结点字符int weight;//结点权值int parent;int lchild;int rchild;int level;};2、求哈夫曼树编码时使用一维结构数组HuffCode作为哈夫曼编码信息的存储。
求哈夫曼编码,实质上就是在已建立的哈夫曼树中,从叶子结点开始,沿结点的双亲链域回退到根结点,每回退一步,就走过了哈夫曼树的一个分支,从而得到一位哈夫曼码值,由于一个字符的哈夫曼编码是从根结点到相应叶子结点所经过的路径上各分支所组成的0、1序列,因此先得到的分支代码为所求编码为所求编码的低位码,后得到的分支代码为所求编码的高位码,所以设计如下数据类型:struct HCodeType{int bit[MAXBIT];int start;};3、文件hfmtree.txt、codefile.txt、textfile.txt。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
lChild = l;
rChild = r;
}
};
实 验 报 告
template〈class T〉
class BinaryTree{
public:
BinaryTree(){
root = NULL;
}
~BinaryTree(){}
bool isEmpty() const{
return root == NULL;
bool IsEmpty() const{return n==0;}
bool IsFull() const{return n==maxSize;}
void Append(const T &x);
void Serve(T&x);
private:
void AdjustDown(int r, int j);
void AdjustUp (int j);
T* q;
int n,maxSize;
};
template <class T>
PrioQueue<T>::PrioQueue(int mSize){
maxSize=mSize;
n=0;
实 验 报 告
q=new T[maxSize];
}
template〈class T〉
if (t){
postClear(t —> lChild);
postClear(t —> rChild);
delete t;
}
}
实 验 报 告
template <class T>
BTNode<T>* BinaryTree〈T>::copy(BTNode〈T〉*t){
if(!t)return NULL;
BTNode<T〉*lChild, *rChild;
BTNode(){
lChild = rChild = NULL;
}
BTNode(const T& x){
element = x;
lChild = rChild = NULL;
}
BTNode(const T& x,BTNode〈T〉* l, BTNode〈T〉*r){
visit(t —〉element);
inOrder(t —> rChild);
}
}
template <class T〉
void BinaryTree<T>::postOrder(BTNode<T〉* t){
if (t){
postOrder(t -> lChild);
postOrder(t -> rChild);
#include〈iostream〉
#include <queue〉
#include〈string>
using namespace std;
int *weightArray;
string s;
string*codeArray;
template <class T>
struct BTNode{
T element;
if(!t) return 0;
else return size(t —> lChild) + size(t -〉rChild);
}
template〈class T〉
void BinaryTree〈T>::change(BTNode<T〉*t){
if(!t)return;
BTNode<T〉*q = copy(t —> rChild);
cout <〈x〈〈” ";
}
};
template〈class T>
bool BinaryTree<T>::retRoot(T& x) const{
if(root) {
x = root -〉element;
return true;
}else return false;
}
template <class T〉
实验题二:哈夫曼编码和译码系统
(1)所设计的系统重复显示以下菜单项:
B―――建树:读入字符集和各字符频度,建立哈夫曼树.
T―――遍历:先序和中序遍历二叉树。
E―――生成编码:根据已建成的哈夫曼树,产生各字符的哈夫曼编码。
C―――编码:输入由字符集中字符组成的任意字符串,利用已生成的哈夫曼编码进行编码,显示编码结果,并将输入的字符串及其编码结果分别保存在磁盘文件textfile.txt和codefile.txt中。
BTNode<T>*q = new BTNode<T>(t -〉element);
q -〉lChild = copy(t —> lChild);
q —〉rChild = copy(t —> rChild);
return q;
}
template <class T〉
int BinaryTree〈T〉::size(BTNode<T〉* t){
int height(BTNode〈T>*t);
void preOrder(BTNode<T>*t);
void inOrder(BTNode〈T〉*t);
void postOrder(BTNode〈T>*t);
void breathFirst(BTNode<T>*t);
void visit(T&x) {
}
x=q[0];q[0]=q[——n];
AdjustDown (0,n-1);
}
template <class T>
void PrioQueue<T>::AdjustDown(int r, int j) {
int child = 2 * r + 1;
T temp = q[r];
while (child <= j){
void PrioQueue〈T〉::AdjustUp (int j){
int i=j;T temp=q[i];
while(i〉0&& temp〈q[(i—1)/2]){
q[i]=q[(i—1)/2];
i=(i-1)/2;
}
q[i]=temp;
}
template <class T>
void PrioQueue<T〉::Append(const T&x)
left.root = right.root = NULL;
}
template <class T〉
void BinaryTree<T>::breakTree(T& x,BinaryTree<T>& left,BinaryTree〈T〉& right) {
if (!root||&left ==&right||left.root|| right。root) return;
BTNode〈T〉* root;
private:
void clear(BTNode<T〉* t);
void change(BTNode<T>* t);
void postClear(BTNode<T〉*t);
void prePrint(BTNode<T>* t);
int size(BTNode〈T〉*t);
visit(t —> element);
return;
}
prePrint(t —〉lChild);
prePrint(t —> rChild);
}
}
template〈class T〉
class PrioQueue {
public:
PrioQueue(int mSize=20);
~PrioQueue(){delete[] q;};
}
void change() {
change(root);
}
void breathFirst() {
breathFirst(root);
}
int height() {
return height(root);
}
void leaf() {
prePrint(root);
}
实 验 报 告
protected:
if(t){
visit(t —〉element);
preOrder(t -〉lChild);
preOrder(t —> rChild);
}
}
template <class T〉
void BinaryTree<T>::inOrder(BTNode<T〉*t){
if (t){
inOrder(t -〉lChild);
{
if(IsFull()) {
cout<〈"Overflow”;
urn;
}
q[n++]=x;
AdjustUp(n-1);
}
template〈class T>
void PrioQueue〈T〉::Serve(T&x)
{
if(IsEmpty()){
cout〈〈”Underflow”;
return;
visit(t —> element);
}
}
template〈class T〉
void BinaryTree<T>::clear(BTNode〈T>*t){