⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 huffman.cpp

📁 huffman的排序算法
💻 CPP
字号:
#include "stdio.h"
#include "Huffman.h"

void main(){
	HuffmanTree HT;
	HuffmanCode HC;
	
	FILE *fp1;
	char filename[20];
	printf("请输入需要进行Huffman编码的文件名:  ");
	scanf("%s",filename);
	if((fp1=fopen(filename,"r"))==NULL) exit(0);

	int *w;
	w=(int *)malloc((100)*sizeof(int));

	printf("进行Huffman编码...\n\n");

/*****************************************************************************************************************
                       统计ASC码从32——122的字符以及换行符的出现次数,存入数组w(共92个)
*****************************************************************************************************************/
	int i;
	char findch;
	findch=' ';
	for(i=0;i<=90;i++){
		w[i]=emergetime(filename,findch);
		findch++;
	}
	w[91]=emergetime(filename,char(10));//记录换行符

	HuffmanCoding(HT,HC,w,92);

	printf("统计结果及Huffman编码:\n\n");

	int j;
	for(j=0;j<=90;j++){
	    printf("字符 %c 出现的次数为:%d   \t",' '+j,w[j]);
		printf("Huffman编码:  %s\n", HC[j+1]);
	}
	printf("换行符出现的次数为:%d   \t",w[91]);
	printf("Huffman编码:  %s\n", HC[92]);

	printf("\n");

/*****************************************************************************************************************
                                          将编码表存入myfile2文件中
*****************************************************************************************************************/
	FILE *fp2;
	if((fp2=fopen("myfile2.txt","w"))==NULL) exit(0);
	fprintf(fp2,"%s\n","编码表:");
	for(j=1;j<=91;j++){
		fprintf(fp2,"%c   ",' '+j-1);
		fprintf(fp2,"%s\n",HC[j]);
	}


	fprintf(fp2,"%s   ","换行符");
	fprintf(fp2,"%s\n",HC[92]);

/*****************************************************************************************************************
                                   对原文件中英文文章编码,存入文件myfile2中
*****************************************************************************************************************/

	fprintf(fp2,"%s\n","编码后的文章为:");
	char ch;
	ch=fgetc(fp1);
	while(ch!=EOF){
		for(j=1;j<=91;j++){
			if(ch==' '+j-1) fprintf(fp2,"%s",HC[j]);	
		}
	    if(ch==char(10)) fprintf(fp2,"%s",HC[92]);
		ch=fgetc(fp1);
	}

	fclose(fp1);
	fclose(fp2);
	printf("编码表和编码文章已存入文件myfile2中。\n\n");


/*****************************************************************************************************************
                                 对编码文件解码,生成原文件存入文件myfile3中
*****************************************************************************************************************/

	printf("下面将编码文件译为原文...\n");
	system("pause");
	system("cls");

/*************************************读编码表********************************************/
	
	if((fp2=fopen("myfile2.txt","r"))==NULL) exit(0);
	char str[30];
        fgets(str,30,fp2); //读取一行(使文件当前指针跳过“编码表:”字样) 
	for(i=0;i<91;i++){
		fgets(str,30,fp2);
		HCode[i].ch=str[0]; 
		strcpy(HCode[i].str,&str[4]);//Huffman编码从第四个字符开始
	}

	fgets(str,30,fp2);  //读取换行符编码
	HCode[91].ch=char(10); 
	strcpy(HCode[91].str,&str[9]);

/***************************根据编码表建立二叉树,用于将Huffman编码译为原文****************/
	
	BiTree T;
	T=(BiTree)malloc(sizeof(BiTNode));
	T->lchild=NULL;
	T->rchild=NULL;
	for(i=0;i<92;i++){
		CreateTree(T,HCode[i]);		
	}


/**********************下面开始读取编码文件进行译码并写入文件********************************/

	FILE *fp3;
	if((fp3=fopen("myfile3.txt","w"))==NULL) exit(0);
	
	fgets(str,30,fp2); //读取一行(使文件当前指针跳过“编码文件如下:”字样)

	BiTree F;
	F=T;  //先指向建立的二叉树T的根
	ch=fgetc(fp2);
	while(ch!=EOF){
		if(ch=='0')
		{
			if(F->lchild)  {F=F->lchild;ch=fgetc(fp2);}
			else 
			{
				printf("%c",F->data);          //F已经是叶子节点,则输出该节点字符.
			                                   //此时的ch已经属于下一个字符的编码,故不需要ch=fgetc(fp);
				fprintf(fp3,"%c",F->data);

				F=T;                           //再让F指向T的根,翻译下一个字符
			}

		}
		else 
		{
			if(F->rchild)  {F=F->rchild;ch=fgetc(fp2);}
			else 
			{
				printf("%c",F->data); 
				fprintf(fp3,"%c",F->data);
				F=T;
			}
		}
	}

	printf("该文章已存入文件myfile3中。");
	fclose(fp2);
	fclose(fp3);

}



/*****************************************************************************************************************
                                                   end...
*****************************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -