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