哈夫曼编码译码器

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

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

功能:

  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 
#include 
#include 
#include 
#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

二级菜单的显示:

直观的显示出程序的功能

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,可以先进行其他的地方,并从别的方向带入,或许就可以解决了。

你可能感兴趣的:(哈夫曼编码译码器)