https://download.csdn.net/download/L_Z_jay/68034163
(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