c语言 哈夫曼编码
程序员文章站
2024-02-03 14:45:34
哈夫曼编码:字符种数or叶子数+1,结点数:算出来m=67,父结点数为2*67-1=133仅对此文档有效,2*maxsymbs-1。
#include
#include
#defin...
哈夫曼编码:字符种数or叶子数+1,结点数:算出来m=67,父结点数为2*67-1=133仅对此文档有效,2*maxsymbs-1。
#include #include #define maxsymbs 68 //字符种数or叶子数+1 #define maxnode 133 //结点数:算出来m=67,父结点数为2*67-1=133仅对此文档有效,2*maxsymbs-1 void rate(); //求字符在文章中出现的频率 void sort(); //排序 void huffmantree();//构造哈夫曼树 void table(); //建立码表 void huffmancode(); //哈夫曼编码 void code_txt(); //对文档编码 void decode_txt(); //解码 int n[127] = {0}; //字符出现的次数 double symbrate[127] = {0}; //字符出现的频率 int num = 0; //字符总数 int m = 0; //字符种数or叶子数 int code_num = 0; //编码总数 struct huffnode { int weight; //权重 int flag; //标志 int parent; //父结点 int lchild; //左孩子 int rchild; //右孩子 } huff_node[maxnode]; struct huffcode { int bits[maxsymbs]; int start; } huff_code[maxsymbs], cd; struct tab //码表结构 { char ch; int ch_num; } tab[maxsymbs]; int main() { rate(); sort(); huffmantree(); huffmancode(); table(); code_txt(); decode_txt(); getchar(); return 0; } void rate() { file *fp, *out; char c; int i; if((fp=fopen("project_huffman.txt","r"))==null) { printf("project_huffman.txt文件打开失败..\n"); return ; } while(!feof(fp)) { c = fgetc(fp); for(i=0; i<=127; i++) { if(c == i) { num++; n[i]++; break; } } } fclose(fp); //printf("%d",num);//test out = fopen("rate.txt","w"); //创建文件用于存放数据 if(out == null) { printf("rate.txt打开失败"); return; } else { for(i=0; i<127; i++) { if(n[i]>0) { symbrate[i]=(double)n[i]/num; fprintf(out,"%d %c %d %lf\n",i,i,n[i],symbrate[i]); } } fprintf(out,"project_huffman.txt 字符总数: %d\n",num); fclose(out); } return; } void sort() { int i, j; int test = 0; struct tab t; for(i=0; i<127; i++) { if(n[i] > 0) { m++; tab[test].ch = i; tab[test].ch_num = n[i]; test++; } } for(i=0; i