精华内容
下载资源
问答
  • 哈夫曼编码译码

    2014-03-19 18:33:55
    哈夫曼编码译码,数据结构课程设计,C++语言
  • 《数据结构C语言哈夫曼编码译码》由会员分享,可在线阅读,更多相关《数据结构C语言哈夫曼编码译码(16页珍藏版)》请在人人文库网上搜索。1、实训报告题 目: 哈夫曼树编码译码院 系: 信息工程系专 业: 计算机科学...

    《数据结构C语言哈夫曼编码译码》由会员分享,可在线阅读,更多相关《数据结构C语言哈夫曼编码译码(16页珍藏版)》请在人人文库网上搜索。

    1、实训报告题 目: 哈夫曼树编码译码院 系: 信息工程系专 业: 计算机科学与技术(网络方向)姓 名: 梁展荣 学 号: 指导教师: 赵莹莹 刘欣 日 期: 2013年7月3日 桂林电子科技大学信息科技学院目 录一、设计思想11.1建立哈夫曼树的思想11.2建立哈夫曼编码表21.3对文件进行编码21.4对文件进行解码2二、算法流程图3三、运行结果8四、遇到的问题及解决10五、心得体会13一、设计思想要完成哈夫曼的编码和解码需要首先建立哈夫曼树,之后对所有字符根据权重进行编码,最后再对文件内容进行编码和解码。1.1建立哈夫曼树的思想。首先定义适合哈夫曼树的节点类型,需要定义的有当前节点的字符,当前。

    2、节点的左子、右子和父亲指针。在建立哈夫曼树之前还需要对出现的字符和权重进行统计和记录,并且定义一个可以筛选出最小权重的函数。初始化树节点之后开始建立哈夫曼树。先在所有可能出现的字符中筛选出当前权重最小的两个字符,将这两个字符分别作为新节点的左子和右子建立一个小的二叉树,并将两个字符的权重之和赋值给新节点,将新二叉树放入筛选字符中,再将筛选过的两个字符从筛选列表中淘汰掉。依次对列表中剩下的字符进行权重最小的筛选,直到根节点(如果编码表共有N个字符,则2*N-1就为最终根节点)为止,也就是当筛选列表为空的时候,哈夫曼树即建立完成。对于哈夫曼编码树来说,由于哈夫曼编码是前缀码,所以所有要编码的字符最。

    3、终都将是这颗树的叶子节点,而其它节点并没有真正的字符意义。即当哈夫曼编码树建立之后,对树的所有叶子节点进行打印可知道是否有字符遗漏或多余。1.2建立哈夫曼编码表。建立编码表时要根据每个出现的字符的权重对建立的哈夫曼树的每个叶子节点进行编码。编码时要从叶子节点出发向根节点进行逆向编码。判断如果当前节点为左子则对其编码0,如果当前节点为右子则对其编码1。以此类推进行编码直到根节点为止。此时的编码是逆向的,所以需要将码值逆向存储。依次对每一个叶子节点进行编码操作,即可得到当前哈夫曼树的编码表。对于码值的逆向存储可以使用栈结构,先将一个码的每一步编码存入栈,再在一个码结束后出栈至空。当然也可以定义一个。

    4、字符型数组,将值从后向前存入数组,再将数组有值部分粘贴到新的数组中进行存储。本次采用了后者,因为个人认为为此一步操作建立栈结构不划算,而且前一个设计也已经熟练掌握了栈的方法,此处进行新的尝试会更好。1.3对文件进行编码。首先需要建立一个原始文件,在文件中输入需要编码的内容。之后将文件打开,将其中的内容存储到字符串中以便程序编码调用。开始对需要编码的字符进行编码,将字符逐一读取与刚刚建立的编码表中的每个叶子节点代表的字符进行比较,找出相同的对象,并将当前节点的编码打印到屏幕,并将编码存入到新建的密码文件当中。1.4对文件进行解码。先打开密码文件,将之前编码后得到的密文内容存储到字符串中以便解码调。

    5、用。开始对密文的字符串进行解码,树索引从根节点开始走,当密文中的当前字符是0的时候,则索引走向左子节点;当是1的时候,则走向右子节点。以此类推,一直走到叶子节点为止,则当前叶子节点所代表的字符即为前一段密文的解码结果,。再对下一个字符依次从根节点开始解码,如此循环对每一段密文进行解码直到解码结束。将解码打印到屏幕,并将解码结果存入到新的解码文件当中。在解码之前,还应该先确认之前是否建立了哈夫曼树并且是否构建了编码表。不过由于本次将a到z都进行了编码,所以此步省略了,因为编码表是唯一的。需要的时候可以在Encoder 函数中先进行判定。将编码和解码写在了一起,可以在运行时进行选择调用。二、算法流。

    6、程图第一步:建立哈夫曼树。图1建立哈夫曼树的算法流程图第二步:构建哈夫曼编码表。图2构建哈夫曼编码表的算法流程图第三步:编码。图3 编码算法流程图第四步:解码。图4 解码算法流程图四、运行结果原文文件:图5 中缀转后缀运行结果图编码图:图6 编码图密文文件:图7 密文文件图解码图:图8 解码图译文文件:图9 译文文件图整体运行图:图10 编码解码整体运行图五、遇到的问题及解决这部分我主要遇到了如下两个问题,其内容与解决方法如下所列:l 第一个问题是权重的筛选部分出现了错误解决办法:一开始对于筛选最小权重的代码编写如下:void SelectMin(HFMT T,int i,int *p1,in。

    7、t *p2) int j, min=999;for(j=0;jTj.weight)min=Tj.weight; *p1=j; min=999; for(j=0;jTj.weight&j!=(*p1)min=Tj.weight; *p2=j; 因为权重中最大的就是字符e的权重103,所以为初始值min赋值时觉得999就已经是无限大了。但是后来发现编码不知确,就开始思考是什么问题。发现每次筛选都将会把最小的两个权重进行相加,所以很快就会超过999,编码自然就出现了问题。所以后来将min定义成了long型,并赋值,问题就解决了。l 第二个问题是生成编码表的时候如何将逆向编码正向存储解决办法:对于求编。

    8、码的时候,由于是从叶子节点向根顺次而求,所以编码结果将是逆向的。一开始想到的办法是利用栈的结构,将编码依次存入栈中,再在一个字符编码结束时将栈倒空,这样就可以将编码正向存储了。但是又在考虑如果不用栈时候也可以做到。后来想到了strcpy函数对字符数组进行链接。所以就可以定义一个数组,从后向前存储编码,再在一个字符编码结束时将这个数组有值的重新存入新数组中,即可以成为正向编码了。最终实现编码如下:HFCode hfEn(HFMT T) int i,f,c,start;HFCode hc;char *cd;hc=(char *)malloc(N+1)*sizeof(char*); cd=(char。

    9、)malloc(N*sizeof(char); cdN-1=0; for(i=0;iN;i+) start=N-1;for(c=i,f=Ti.parent;f!=-1;c=f,f=Tf.parent)if(Tf.left=c) cd-start=0;else cd-start=1;hci=(char *)malloc(N-start)*sizeof(char); strcpy(hci,&cdstart); return hc;六、心得体会通过对本次的编写,使我掌握了哈夫曼编码的特点、存储方法和基本原理,培养了我运用C语言正确编写程序以及调试程序的能力。哈夫曼编码的结构取决于可能出现的字符的个数和其所对应的权值,权值大的编码短,权值小的编码长。这样的结构会利用比较小的空间存储数据。而且,利用树的结构对其编码和对其解码,也是比较规格话,比较方便的。本次编程还运用了结构体,便捷的对树节点和树以及编码表进行定义和调用。并且了解到当求解一个算法时,不是拿到问题就不假思索去做,而应该首先对它有个整体的概念,再一步步对其进行分析。在分析的过程中也应该学会随时总结问题,将遇到的问题融会贯通,以便在将来需要的时候能够应用自如。本次设计中也存在一些一开始不容易解决的问题,但当对算法的进一步分析和对相关信息的查阅,也比较顺利的完成了设计。虽然路途比较艰辛,但奋斗的经历却成为了最宝贵的人生经验。

    展开全文
  • 哈夫曼 编码 译码

    2015-11-26 22:54:55
    printf(" 赫夫曼编码译码 \n"); printf(" 1.初始化 \n"); printf(" 2.输入对应的正文内容 \n") ; printf(" 3.进行赫夫曼编码 \n"); printf(" 4.进行赫夫曼译码 \n") ; printf(" 5.退出赫夫曼操作 \n"); ...
  • C语言哈夫曼编码译码

    2009-12-12 13:28:42
    哈夫曼编码译码数据结构作业 数据结构作业哈夫曼编码译码哈夫曼编码译码
  • 哈夫曼编码译码器实验报告.rar
  • 哈夫曼编码译码器数据结构C语言 一、需求分析 目前,进行快速远距离通信的主要手段是电报,即将需传送的文字转化成由二级制的字符组成的字符串。例如,假设需传送的电文为“ABACCDA”,它只有4种字符,只需两个字符...

    41528d3028836879cd698677c3999917.gif哈夫曼编码译码器数据结构C语言

    一、需求分析 目前,进行快速远距离通信的主要手段是电报,即将需传送的文字转化成由二级制的字符组成的字符串。例如,假设需传送的电文为“ABACCDA”,它只有4种字符,只需两个字符的串,便可以分辨。假设A、B、C、D、的编码分别为00,01,10和11,则上述7个字符的电文便为“100”,总长14位,对方接受时,可按二位一分进行译码。 当然,在传送电文时,希望总长尽可能地短。如果对每个字符设计长度不等的编码,且让电文中出现次数较多的字符采用尽可能短的编码,则传送电文的总长便可减少。如果设计A、B、C、D的编码分别为0,00,1,01,则上述7个字符的电文可转换成总长为9的字符串“”。但是,这样的电文无法翻译,例如传送过去的字符串中前4个字符的字串“0000”就可以有很多种译法,或是“AAAA”或者“BB”,或者“ABA”等。因此,若要设计长短不等的编码,则必须是任一字符的编码都不是另一个字符的编码的前缀,这种编码称作前缀编码。 然而,如何进行前缀编码就是利用哈夫曼树来做,也就有了现在的哈夫曼编码和译码。 二、概要设计 利用哈夫曼树编/译码 (一)、建立哈夫曼树 (二)、对哈夫曼树进行编码 (三)、输出对应字符的编码 (四)、译码过程 主要代码实现: struct code//结构体的定义 { char a; int w; int parent; int lchild; int rchild; }; void creation(code *p,int n,int m);//建立哈夫曼树 void coding(code *p,int n);//编码 void display(code *p,int n,int m);//输出函数 void translate(char **hc,code *p,int n);//译码 三、 详细设计 10 序号: 7 6 5 3 1 2 4 (1) 、建立哈夫曼树 a b * c * d * 字符: * * * c 6 4 6 d b a a b * c * 10 6 3 4 3 2 1 权值: 3 3 3 3 3 a b * 1 2 2 1 1 2 图3-2 图3-3 图3-1 从叶子到根逆向求编码 (2) 、对哈夫曼树进行编码 主要代码实现: for(c=i,f=p[i].parent;f!=0;c=f,f=p[f].parent) 1 a b * c * d * { if(p[f].lchild==c)//左孩子编码为 0 1 0 { cd[--start]= 0 ; 0 1 } else//右孩子编码为 1 { 图3-4 cd[--start]= 1 ; } } (3) 、输出对应字符的码 字符 编码 a 110 b 111 c 10 d 表3-1 0 (4) 、译码过程 主要代码实现: if(strcmp(a,hc[i])==0)//比较两个字符串是否相等,相等则输出0 { for(c=2*n-1,j=0;a[j]!= \0 ;j++)//从根出发,按字符 0 或 1 确定找左孩子或右孩子 从跟到叶子顺向求字符 { if(a[j]== 0 )//左孩子 a b * c * d * { 1 0 c=p[c].lchild; } 1 0 else 1 0 { c=p[c].rchild;//右孩子 } 图3-5 } 四、 调试分析 (一)、数字的输入判断 图4-1 (二)、字母的输入判断 图4-2 (三)、程序是否继续进行的 判断 图4-3 五、 用户手册 (1) 、首先根据提示输入初始化数据,提示输入一个数字,请输入一个数a,0

    展开全文
  • java哈夫曼编码译码

    2017-12-23 17:46:47
    java实现对文件进行哈夫曼编码译码实现。。。。。。。。
  • 用C语言实现哈夫曼编码译码.pdf
  • 信息论哈夫曼编码译码程序,适用于多进制哈夫曼编译码。
  • 这个简单的小程序用C语言编写,实现了简单的哈夫曼编码译码,是通过文件操作实现的,数据结构很实用的代码,更好理解。
  • 哈夫曼编码译码 .

    2010-09-30 14:16:53
    哈夫曼编码译码(源代码) .
  • 哈夫曼编码译码

    千次阅读 多人点赞 2020-02-08 16:47:21
    标题数据结构课设:哈夫曼编码译码器 总结一下这次的课程设计,遇到的问题是如何解决的。 功能: 将权值数据存放在数据文件data.txt中。 键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树。 利用建好的哈夫曼...

    标题数据结构课设:哈夫曼编码译码器

    总结一下这次的课程设计,遇到的问题是如何解决的。

    功能:

    1. 将权值数据存放在数据文件data.txt中。
    2. 键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树。
    3. 利用建好的哈夫曼树生成哈夫曼编码。
    4. 使用data.txt中的权值数据生成的哈夫曼编码,将文件Text.txt中的字符串编码保存到HuffmanCode.txt文件中。
    5. 使用data.txt中的权值数据生成的哈夫曼编码,将文件HuffmanCode.txt中的哈夫曼编码解码生成字符串保存到Text.txt文件中。
    6. 输出哈夫曼编码到code.txt文件。

    其中,功能1、2、3、6是基本课程设计要求的功能,为了增加代码的实用性,
    导师提议我增加4、5功能。

    结构体定义:

    typedef struct { //定义二叉树结点类型
        char data ;
    	double weight;
        int lchild, rchild ,parent; 
    } HTNode , *HuffmanTree;//定义二叉树结点指针类型
    typedef struct{//定义哈夫曼编码的结构体
    	char cd[11];
    	char data;
    	int len;
    }HCNode , *HuffmanCode;
    

    实现代码:

    功能:

    • 建立哈夫曼树哈夫曼编码
    • 键盘输入字符
    • 完成哈夫曼编码和字符的转换
    • 从文件中读取数据并保存
    • 将得到的数据保存到文件中
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
    #include "huff2.h"
    #define MAX_LINE 1024
    //选择最小的两个结点
    void Select(HuffmanTree &HT,int i,int &s1,int &s2){
    	int k=0;
    	s1=i-1;
    	s2=i;
    	for(int j=i;j>0;j--){
    		if(HT[j].parent==0){
    			if(HT[j].weight<HT[s2].weight){
    				s1=s2;
    				s2=j;
    			
    			}
    			if(HT[j].weight<HT[s1].weight&&j!=s2){
    				s1=j;
    			}
    		
    		}
    
    	}
     	if(HT[s1].parent!=0){
    		s1=1;
    		for(;k<i;k++){
    			if(HT[k].parent==0){
    				if(HT[k].weight<HT[s1].weight){
    					s1=k;
    				}
    			}
    		}
    	}
    }
    //构造哈夫曼树及求字符的编码
    void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,char data[],double weight[],int n){
    	int i,m,start,c,f;
    	char cd[26]={0};
    	if(n<=1) return;
    	m = 2*n-1;
    	HT = (HuffmanTree)malloc((m+1)*sizeof(HTNode));
    	HC = (HuffmanCode)malloc((n+1)*sizeof(HCNode));
    	//构建哈夫曼树
    	for(i=1;i<=n;i++) {
    		HT[i].data = data[i-1];
    		HT[i].weight = weight[i-1];
    		HT[i].parent = 0;
    		HT[i].lchild = 0;
    		HT[i].rchild = 0;
    	}
    
    	for(;i<=m;i++) {
    		HT[i].data = NULL;
    		HT[i].weight = 0.000000;
    		HT[i].parent = 0;
    		HT[i].lchild = 0;
    		HT[i].rchild = 0;
    	}
    	for(i=n+1;i<=m;i++){
    		int s1,s2;
    		Select(HT,i-1,s1,s2);
    		HT[s1].parent = i;
    		HT[s2].parent = i;
    		HT[i].lchild = s1;
    		HT[i].rchild = s2;
    		HT[i].weight = HT[s1].weight + HT[s2].weight;
    	}
    	//求哈夫曼编码
    	for(i=1;i<=n;i++){
    		start = n-1;
    		for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent){
    			if(HT[f].lchild==c)
    				cd[--start] = '0';
    			else cd[--start] = '1';
    		}
    		HC[i].len = n-start-1;
    		for(int z=0;start<n;start++,z++){
    			
    			HC[i].cd[z] = cd[start];
    			
    		}
    		HC[i].data = HT[i].data;
    	}
    
    }
    //将编码表输出到文件code.txt中
    void CreateHuffman(HuffmanCode &HC,int n){
    	FILE * fp=fopen("code.txt","w+");
    	if(fp==NULL){
    		printf("无法打开code.txt");
    		exit(0);
    	}
        for(int i=1;i<=n;i++){
    		fputc(HC[i].data,fp);
    		fputs("    ",fp);
    		fputs(HC[i].cd,fp);
    		fputc('\n',fp);
    	}
    	if(fclose(fp)){
    		printf("无法关闭code.txt");
    		exit(0);
    	}
    }
    
    //将编码保存到文件HuffmanCode.txt
    void CodePrintTxt(char code[],int i){
    	FILE * fp=fopen("HuffmanCode.txt","w+");
    	int j;
    	if(fp==NULL){
    		printf("无法打开HuffmanCode.txt");
    		exit(0);
    	}
        for(j=0;j<=i;j++){
    		fputc(code[j],fp);
    	}
    	if(fclose(fp)){
    		printf("无法关闭HuffmanCode.txt");
    		exit(0);
    	}
    }
    //将编码保存到文件Text.txt
    void DataPrintTxt(char data[],int i){
    	FILE * fp=fopen("Text.txt","w+");
    	int j;
    	if(fp==NULL){
    		printf("无法打开Text.txt");
    		exit(0);
    	}
        for(j=0;j<=i;j++){
    		fputc(data[j],fp);
    	}
    	if(fclose(fp)){
    		printf("无法关闭Text.txt");
    		exit(0);
    	}
    }
    
    
    
    //初始化数据之从文件data.txt中读出权值数据
    void init1(HuffmanTree &HT,HuffmanCode &HC){
    	int j,q,w;
    	char data[52]={0};
    	double weight[52]={0};
    
    	FILE *file=fopen("data.txt","r");
    	if(file==NULL){
    		printf("数据为空!!!");
    	}else{
    		for(j=0;j<182;j++){		
    			fscanf(file, "%c%lf", &data[j],&weight[j]);
    		}
    		fclose(file);
    		//将数据正常填装到两个数据集合中
    		for(q=0;q<26;q++){
    			data[q]=data[2*q];
    			weight[q]=weight[2*q];
    		}
    		for(w=0;w<25;w++){
    			for(q=0;q<25;q++){
    				if(weight[q]<weight[q+1]){
    					char d;
    					double w;
    					w=weight[q+1];
    					weight[q+1]=weight[q];
    					weight[q]=w;
    					d=data[q+1];
    					data[q+1]=data[q];
    					data[q]=d;
    				}
    			}
    		}
    	}
    	HuffmanCoding(HT,HC,data,weight,26);
    
    	CreateHuffman(HC,26);
    }
    //从键盘输入
    void init2(HuffmanTree &HT,HuffmanCode &HC){
    	int q,e,i;
    	double w;
    	char data[26]={0};
    	char d[26]={0};
    	double weight[26]={0};
    
    	printf("请输入您想定义的字符串\n");
    	scanf("%s",data);
    	
    	//排除相同的字符
    	q=0;
    	while(data[q]){
    		e=q+1;
    		while(data[e]){
    			if(data[e]==data[q]){
    				i=e;	
    				while(data[i+1]){
    					data[i]=data[i+1];
    					i++;
    				}
    				data[i]=NULL;
    			}
    			else
    				e++;
    		}
    		q++;
    	}
    	q=0;
    	while(data[q]){
    		printf("请输入%c的权值:\n",data[q]);
    		scanf("%lf",&w);
    		weight[q] = w;
    		q++;
    	}	
    	for(i=0;data[i];i++){
    		for(q=0;data[q];q++){
    			if(weight[q]<weight[q+1]){
    				char d;
    				double w;
    				w=weight[q+1];
    				weight[q+1]=weight[q];
    				weight[q]=w;
    				d=data[q+1];
    				data[q+1]=data[q];
    				data[q]=d;
    			}
    		}
    	}
    	HuffmanCoding(HT,HC,data,weight,q);
    	
    	CreateHuffman(HC,q);
    }
    
    //将编码转换成数据(解码)
    void CodeToData(HuffmanTree HT,char code[]){//n为编码的长度,data为编码
    	int i,m,w,c;
    	char data[MAX_LINE]={0};
    	i=0;c=0;w=0;	
    	while(HT[w].parent!=0){
    		w++;
    	}
    	printf("解码为:");
    	i=0;
    	while(code[i]){
    		if(code[i]==' '){
    			data[c++] = ' ';
    			printf(" ");
    		}
    		m=w;
    		while(1){
    			if(code[i]=='0') m=HT[m].lchild;
    			else if(code[i]=='1') m = HT[m].rchild;
    			else {
    				i++;
    				if(!code[i])
    					break;
    				continue;
    			}
    			i++;
    			if(HT[m].lchild==0&&HT[m].rchild==0){
    				data[c++] = HT[m].data;
    				printf("%c",HT[m].data);
    				break;
    			}
    		}
    	}
    	printf("\n");
    	DataPrintTxt(data,i);//将数据保存到文件Text.txt
    }
    //将数据转换成编码(编码)
    void DataToCode(HuffmanCode HC,char data[]){//data为字符数据,p为保存的编码,n为字符的长度
    	int j,k,l,i;
    	char code[10000]={0};
    	j=0;i=0;
    	while(data[j]){
    		if(data[j]==' ')
    			code[i++] = ' ';
    		for(k=1;k<27;k++){
    			if(data[j]==HC[k].data){
    				//把每个字符的哈夫曼码保存到p中
    				for(l=0;l<HC[k].len;l++){
    					code[i++] = HC[k].cd[l];
    				}
    			}
    		}
    		j++;
    	}
    	printf("哈夫曼编码为:");
    	for(j=0;j<=i;j++){
    		printf("%c",code[j]);
    	}
    	printf("\n");
    	CodePrintTxt(code,i);//将编码保存到文件HuffmanCode.txt
    }
    //读取Text文件内容并保存
    void ReadTxtT(HuffmanCode HC,char data[]){//n的作用:用来识别读出哪种文件.
    	FILE * fp=fopen("Text.txt","r");
    	if(fp==NULL){
    		printf("无法打开Text.txt");
    		exit(0);
    	}
    
    	while(fgets(data,MAX_LINE,fp) != NULL)
    	{
    		DataToCode(HC,data);//将数据转换成编码
    	}
    
    	if(fclose(fp)){
    		printf("无法关闭Text.txt");
    		exit(0);
    	}	
    }
    //读取HuffmanCode文件内容并保存
    void ReadTxtH(HuffmanTree HT,char code[]){//n的作用:用来识别读出哪种文件.
    	FILE * fp=fopen("HuffmanCode.txt","r");
    	if(fp==NULL){
    		printf("无法打开HuffmanCode.txt");
    		exit(0);
    	}
    	while(fgets(code,MAX_LINE,fp) != NULL)
    	{
    		CodeToData(HT,code);//将编码转换成数据
    	}
    
    	if(fclose(fp)){
    		printf("无法关闭HuffmanCode.txt");
    		exit(0);
    	}	
    }
    
    
    

    二级菜单的显示:

    直观的显示出程序的功能

    void menu1(){
    	printf("		|*******************************************************************************|\n");
    	printf("		|-------------------Huffman编码解码器使用菜单-----------------------------------|\n");
    	printf("		|-------------------功能1:读取文件并建立哈夫曼树和哈夫曼编码--------------------|\n");
    	printf("		|-------------------功能2:键盘输入字符以及权值建立哈夫曼树和哈夫曼编码----------|\n");
    	printf("		|-------------------功能3:编码或解码文件中的数据--------------------------------|\n");	
    	printf("		|-------------------功能0:退出系统----------------------------------------------|\n");
    	printf("		|-------------------请输入数字:0、1、2使用相对应的功能-------------------------|\n");
    	printf("		|*******************************************************************************|\n");
    }
    void menu2(){	
    	printf("		|*******************************************************************************|\n");
    	printf("		|-------------------Huffman编码解码器使用菜单-----------------------------------|\n");
    	printf("		|-------------------功能1:编码--------------------------------------------------|\n");
    	printf("		|-------------------功能2:解码--------------------------------------------------|\n");
    	printf("		|-------------------功能0:退出系统----------------------------------------------|\n");
    	printf("		|-------------------请输入数字:0、1、2使用相对应的功能-------------------------|\n");
    	printf("		|*******************************************************************************|\n");
    }
    

    主函数小黑窗功能选项的实现:

    显示出代码的功能,二级菜单的穿接,友好的提示词。

    
    void main()
    {
    	int fun;
    	char data[MAX_LINE]={0};
    	char code[10000]={0};
    	HuffmanTree HT; 
    	HuffmanCode HC;
    	menu1();
    	scanf("%d",&fun);
    	switch(fun){
    		case 1:
    			init1(HT,HC);
    			menu2();
    			scanf("%d",&fun);		
    			while(fun){
    				switch(fun){
    					case 1:
    						printf("请输入A-Z字符(大写):\n");
    						scanf("%s",data);
    						printf("(如果您输入了错误的字符串,则编码为空!)");
    						DataToCode(HC,data);
    						break;
    					case 2:
    						printf("请输入编码:\n");
    						scanf("%s",code);
    						printf("(如果您输入了错误的字符,则跳过错误的字符,不够一个编码的舍去。)");
    						CodeToData(HT,code);
    						break;
    					case 0:
    						printf("谢谢使用!\n");
    						break;
    					default:
    						printf("你的输入错误!请重新输入!\n");
    						break;
    				}
    				menu2();
    				scanf("%d",&fun);
    			}
    			
    			break;
    		case 2:
    			init2(HT,HC);
    			menu2();
    			scanf("%d",&fun);
    			while(fun){
    			   switch(fun){
    					case 1:
    						printf("请输入您设定的字符串:\n");
    						scanf("%s",data);
    						printf("(如果您输入了错误的字符串,则编码为空!)");
    						DataToCode(HC,data);
    						break;
    					case 2:
    						printf("请输入编码:\n");
    						scanf("%s",code);
    						printf("(如果您输入了错误的字符,则跳过错误的字符,不够一个编码的舍去。)");
    						CodeToData(HT,code);
    						break;
    					case 0:
    						printf("谢谢使用!\n");
    						break;
    					default:
    						printf("你的输入错误!请重新输入!\n");
    						break;
    				}
    				menu2();
    				scanf("%d",&fun);
    			}
    			break;
    		case 3:
    			init1(HT,HC);
    			menu2();
    			scanf("%d",&fun);
    			while(fun){
    				switch(fun){
    					case 1:
    						ReadTxtT(HC,data);
    						break;
    					case 2:
    						ReadTxtH(HT,code);
    						break;
    					case 0:
    						printf("谢谢使用!\n");
    						break;
    					default:
    						printf("你的输入错误!请重新输入!\n");
    						break;
    				}
    				menu2();
    				scanf("%d",&fun);
    			}
    			break;
    		case 0:
    		    printf("谢谢使用!\n");
    		    exit(0);
    		default:
    			printf("你的输入错误!请重新启动!\n");
    			break;
    	}
    }
    

    总结:这次的数据结构使我认识到了,代码应该要认识到代码存在的意义,是为什么服务的,要充分的想到使用者会遇到的误点,通过代码强制阻止或者友好的提示词提示使用者,从而增强代码的健壮性。当实现了最基本的功能之后要看看能不能提高代码的实用性。毕竟只有有用的代码才有存在的意义。最后,bug无处不在,只有一次次的调试、修改才能使bug无处可躲,当遇到暂时无法解决的bug,可以先进行其他的地方,并从别的方向带入,或许就可以解决了。

    展开全文
  • 哈夫曼编码译码器 数据结构课程设计 哈夫曼树以及编码译码问题
  • MFC写的哈夫曼编码译码小程序

    热门讨论 2010-09-18 18:06:54
    MFC写的哈夫曼编码译码小程序 MFC 哈夫曼编码译码 附源程序代码
  • 哈夫曼编码译码C语言编写 10 [?标签 哈夫曼, 编码, 译码?] 如上题 C语言编个程序 懂的帮搞个能运行的程序来#11别到网上找那些 我找过了没用的 蝶风待夕魂 回答:2 人气:19 解决时间:2009-05-14 18:44 满意答案 好评率...
  • 数据结构课程设计 题目哈夫曼编码译码 姓名 专业通信工程 学号 指导教师吴泽晖 0 目 录 目录1 一需求分析2 二设计要求2 三概要设计2 1流程图2 2设计包含的几个部分4 四详细设计2 五显示结果9. 六心得体会10 七参考...
  • 哈夫曼编码译码数据结构课程设计报告 内附概要设计,详细设计,源码
  • 哈夫曼编码译码器,任务书,看清楚
  • PAGEPAGE #PAGEPAGE #一、需求分析目前,进行快速远距离通信的主要手段是电报, 即将需... 假设A、B、C、D、的编码分别为00,01,10和11, 则上述7个字符的电文便为“ 0001001010110(”,总 长14位,对方接受时,可按二...

    PAGE

    PAGE #

    PAGE

    PAGE #

    一、需求分析

    目前,进行快速远距离通信的主要手段是电报, 即将需传送的文字转化成由二级制的字符组成的字 符串。例如,假设需传送的电文为“ ABACCDA ”, 它只有4种字符,只需两个字符的串,便可以分辨。 假设A、B、C、D、的编码分别为00,01,10和11, 则上述7个字符的电文便为“ 0001001010110(”,总 长14位,对方接受时,可按二位一分进行译码。

    当然,在传送电文时,希望总长尽可能地短。如 果对每个字符设计长度不等的编码,且让电文中出现 次数较多的字符采用尽可能短的编码,则传送电文的 总长便可减少。如果设计 A、B、C、D的编码分别 为0,00,1,01,则上述7个字符的电文可转换成总长为 9的字符串“ 000011010'。但是,这样的电文无法翻 译,例如传送过去的字符串中前4个字符的字串

    “ 0000”就可以有很多种译法,或是“ AAAA ”或者 “ BB ”,或者“ ABA ”等。因此,若要设计长短不等 的编码,则必须是任一字符的编码都不是另一个字符 的编码的前缀,这种编码称作前缀编码。

    然而,如何进行前缀编码就是利用哈夫曼树来

    做,也就有了现在的哈夫曼编码和译码。

    二、概要设计

    利用哈夫曼树编/译码

    (一人建立哈夫曼树

    (一人

    建立哈夫曼树

    (二人 对哈夫曼树进行编码

    (三)、输出对应字符的编码

    译码过程

    主要代码实现:

    struct code〃结构体的定义

    char a; int w;

    int parent; int (child; int rchild;

    void creation(code *p,int njnt m); //建立哈夫曼树

    〃编码void coding(code *p,int n);

    〃编码

    void displays code 木pjnt njnt m); 〃输出函数

    void translate* char *^hc,code wp,int n);

    三、详细设计

    x~)>

    x~)>建立哈夫曩树

    宀 o ooo

    64623 4 3 6 13图图

    646

    23 4 3 6 1

    3

    (一)、对哈夫曼树进行编码主要代码实现:

    (一)、对哈夫曼树进行编码

    从叶子到根逆for(c=i,f=p[i].pare nt;f!=O;c=f,f=p[f].pare nt) {

    从叶子到根逆

    if(p[f]」child==c)

    {

    } else//右孩子编码为'1' 01

    } else

    //右孩子编码为'1' 01

    {

    cd[--start]='1:

    }

    }

    (二)、输出对应字符的码

    字符

    编码

    a

    110

    b

    111

    c

    10

    d

    0

    三)、译码过程 要代码实现:

    if(strcmp(a,hc[i])==O) //比较两个字符串是否相等,

    则输出0

    for(c=2* n-1,j=0;a[j]!='\0';j++)

    'O'或'1'确定找左孩子或右孩子

    {

    if(a[j]=='0')〃左孩子

    {

    c=p[c].lchild;

    }

    else

    //从根出发,按字从跟到叶子顺0 1{

    //从根出发,按字

    从跟到叶子顺

    0 1

    c=p[c].rchild;II 右孩子

    ”的藪字血入雾冲號字臓第if ?数罕运和字母的输图

    ”的藪字血入雾冲號字臓第if ?数罕运和

    字母的输

    S'

    s and S

    制⑴?用扎臺个数号:按峯一个鮒字返帶》

    H 修新轲人1

    也字桃1职臺靜入一个数和=

    三、调试分析

    数字的输入判断

    巒心咲?<二二二二二二

    g新输人

    )丄丄i11111

    gWfftA.

    涣定?Cluu*u*?KLt s

    涣定?Cluu*u*?KLt s anil Sr lt,jLTk£ff \ AiLa.JLiuLsli.ajLiixA it Hi '.buf 1 sulX Vebu.E ^ iLuLlM^ ..

    程序是否继续进行的萨卸

    判断

    lifl

    毛否誉滞 '汽術几用者V)否曲辿”

    |lBTe^E; -Bjay hey 七? k. ohi t. iiiiAE!

    四、用户手册

    (一)、首先根据提示输入初始化数据,提示输入一 个数字,请输入一个数a,0

    (二)在某一界面结束后,会有“请按回车继续下面 操作"提示,请按提示进行操作,如输入其他数字则 无效,知道输入回车符界面才会跳转。

    (三)对界面的操作可以自行选择,在询问是否译码 的时候,请按

    展开全文
  • 用python写的,面向对象的哈夫曼编码译码器,有基于Tkinter简单图形界面,可从文件中导入,每个字符的频度存储在文件nodes.txt中,可自行修改,可通过类似于Tree命令的方式输出哈夫曼树,解压后运行dialog.pyw
  • 课程设计 大二的自己的课程设计 主要是哈夫曼编码和译码的c++的程序 包括根据字符的权重进行编码 并对文件进行编码译码

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,803
精华内容 1,121
关键字:

哈夫曼编码译码