【数据结构】哈夫曼树编译码器【课程设计】

(注:

本代码是使用vc++6.0完成的,不同编译器一些内部判断机制可能存在差异,导致代码不能进行正常运行

本代码直接复制下来,肯定会存在问题,原因在于文件是如何操作的,如果你一点基础都没有的话,不建议您看这篇博客)

!!!更加详细的解释在后边的代码注释中,如果程序有问题,请检查相应的文件名是否正确,

最后祝你好运,加油!!!

附上实验链接包,需要付费的,如果不想下载,请认真阅读本文,你一样也能做出来的。

https://download.csdn.net/download/L_Z_jay/68034163 

课设目标:

                             【数据结构】哈夫曼树编译码器【课程设计】_第1张图片

课设的功能函数: 

                                             

(1) int  read_File( )   //读文件操作

(2) void  calculate(int chWeight[], int reRow)  //源文件中字符的频度是多少

(3) void  createHuffmantree(Huffman ht[], int chWeight[], int n) //创建哈夫曼树
    1) void  select (Huffman ht[], int n, int *s1, int *s2) 
                 //建立哈夫曼树,每次查找没有双亲结点且是最小的两个数

(4) void  huffmanCode(Huffman tree[], codetype code[], int n)  //对各个字符进行编码

(5) void huffmanTrans(codetype *code , int n)   //对输入的字符进行编码并保存到文件中
    1)    //将输入的字符串进行编码,
          //打印编码结果
          //并将编码结果存储进文件中
        void  memory_File(codetype *code , char b[],int n)
    2)    //将输入的字符串进行编码,
          //打印编码结果
        void printCode(codetype *code , char b[],int n)

(6)void huffDecode(codetype *code, int n) //对某个文件进行译码,并将译码的结果存储在另一个文件中


***main()函数为程序的入口,这个就不在详说了

 课设代码:

//注:	
//system("pause"); 作用:是让程序暂时暂停,当你在有新的指令时,才会进行下一步
//本文传值的数字7的含义:我是从下标为0开始存储字符,且文件中只有ABCDEFG这几种字符
//若你无法解决数字7,欢迎留言,我尽力解答
//若你想了解更多,欢迎留言
//有任何的问题,都欢迎您的留言,谢谢
//我会将我所用到的文件等信息展示出来,希望可以帮助到你
//最后,谢谢您的观看!!!

#include 
#include 
#include 
#define N 50 
typedef struct node{
	int Weight;     //代表字符的权重
	char ch;        // 代表的是哪个字符
	int Parent;     // 双亲结点
	int Lchild;     // 左孩子
	int Rchild;     // 右孩子
}Huffman;
typedef struct code{
	char bits[N];   //字符的编码串
	int start;      //编码在位串中的起始位置
	char ch;        //存储的字符是谁?
}codetype;
int flag=0;         //判断读文件是否是首次进入读文件函数的
char container[100][100];     //从源文件中读出的内容 
char ex_container[100][100];  // 从文件中读出需要译码的内容
void select (Huffman ht[], int n, int *s1, int *s2);
void memory_File(codetype *code, char b[] ,int n);
void printCode(codetype *code, char b[] ,int n);
int  read_File( ){
		FILE *fp;
		int len,i=0;	
		//flag的作用是判断是否是首次进入读文件函数,
		//理由:因为题目的要求是我们要从文件中获取字符并统计其出现的频度
		if(flag == 0){	
			flag = 1;
			//这里是打开01.souce.txt,这个是我本机上的文件,你可能没有,
			//而且我这里用的是相对路径,相对的意思就是相对代码文件的位置在什么地方
			//如果不能正确写出来,可以在下方留言,我会尽快解答
			fp = fopen("01.souce.txt","r+");
				if(fp == NULL){
					printf("文件打开失败");
					return 0;
				}
				else
				{
					printf("恭喜恭喜,文件成功打开!!!\n");
					printf("这样您就可以进行后续步骤啦!!!\n");
					//读文件成功
					//每行的最大字符
					//这里为什么这样写请自行百度查查fgets()函数的用法和作用
					//每次读取的是一行的内容
						while(fgets(container[i],100,fp) != NULL){
								len = strlen(container[i]);
								if(i<2){
									container[i][len-1] = '\0';
								//	printf("%d %d\n",container[i][len-1],len);
								}
								/*else{

									printf("%d %d\n",container[i][len-1],len);
								}*/	
								i++;
							}
					printf("\n");
					fclose(fp);
					system("pause");
					return i-1;
					
				}
		}
		else{
				//这个是打开的是里边存的是一些有效编码的文件
				fp = fopen("explain.code.txt","r+");
				if(fp == NULL){
					printf("文件打开失败");
					return 0;
				}
				else
				{
					printf("打开成功\n");
					//读文件成功
					//每行的最大字符
					//只能实现单行文本的读取
					//每次读取的是一行的内容
					while(fgets(ex_container[i],100,fp) != NULL){
						len = strlen(ex_container[i]);
						//printf("%c",ex_container[i][len-1]);
						i++;
					}
					printf("\n");
					fclose(fp);
					system("pause");
					return i-1;
					
				}
			}
}
void  calculate(int chWeight[], int reRow){
		int i,j,k;
		int len;
		for(i = 0;i <= reRow;++i){
				len = strlen(container[i]);
				for(j = 0;j < len ;++j){
					k = (int)(container[i][j] - 'A');
					chWeight[k]++;
				}
		}
		printf("各个字符的详细情况如下表示 :\n");
		printf("\t-----\n");
		printf("\t|字符|权重|\n");
		printf("\t-----\n");
		for(i = 0;i<7;i++){
			printf("\t|%2c | %2d |\n",('A'+i),chWeight[i]);
			printf("\t-----\n");
		}
		system("pause");
}
void  createHuffmantree(Huffman ht[], int chWeight[], int n){
		int m,i;
		int s1,s2;
		m = 2*n-1;
		//创建哈夫曼树
		for(i = 0;i < n;++i){
			ht[i].Weight = chWeight[i];
			ht[i].ch = 'A'+i;
			ht[i].Parent = -1;
			ht[i].Lchild = -1;
			ht[i].Rchild = -1;
		}
		for(i = n;i < m;++i){
			ht[i].Weight = 0;
			ht[i].ch = '0';
			ht[i].Parent = -1;
			ht[i].Lchild = -1;
			ht[i].Rchild = -1;
		}
		for(i = n;i ht[*s2].Weight){
			*s1 = *s1 + *s2;
			*s2 = *s1 - *s2;
			*s1 = *s1 - *s2;
		}
}
//将输入的字符串进行编码,
//打印编码结果
//并将编码结果存储进文件中
void  memory_File(codetype *code , char b[],int n){
		int i,j=0,k;
		FILE *fp;
		fp = fopen("written.code.txt","w");
		if(fp == NULL){
			printf("文件打开失败,请重新尝试!!!");
		}
		else{
			printf("编码结果如下:\n");
			for(i=0;i

 前提文件准备:

【数据结构】哈夫曼树编译码器【课程设计】_第2张图片

 【数据结构】哈夫曼树编译码器【课程设计】_第3张图片

 【数据结构】哈夫曼树编译码器【课程设计】_第4张图片

运行结果截图如下:

【数据结构】哈夫曼树编译码器【课程设计】_第5张图片

 【数据结构】哈夫曼树编译码器【课程设计】_第6张图片

 【数据结构】哈夫曼树编译码器【课程设计】_第7张图片

 【数据结构】哈夫曼树编译码器【课程设计】_第8张图片

 【数据结构】哈夫曼树编译码器【课程设计】_第9张图片

 【数据结构】哈夫曼树编译码器【课程设计】_第10张图片

 【数据结构】哈夫曼树编译码器【课程设计】_第11张图片

【数据结构】哈夫曼树编译码器【课程设计】_第12张图片

                          希望能对您有所帮助,谢谢您的观看,如果觉得对您有所帮助,请点赞,谢谢支持 

你可能感兴趣的:(课程设计,数据结构,c++,c语言)