输入:字符及其权值,待译码字符串,待解码字符串
功能要求:输出各字符的哈夫曼编码,输出译码字符串,输出解码字符串
哈夫曼树构造过程:
1.从所有待编码的节点中选取权值最小的两个节点S1,S2,合并成一颗二叉树T1,T1的叶子节点为S1,S2,根节点为S1,S2之和。
2.选取除这两个节点以外最小的节点,将其和T1作为叶子构造一棵新的树。
3.重复上述过程,直到所有代编码的节点都加入到树中。
解码过程:
按照构造的哈夫曼树,从根节点开始,遇到0往左子树走,遇到1走向右子树,这样就可以达到解码的过程
代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<conio.h> 5 #define MAXNUM 60 6 typedef struct 7 { 8 char ch; 9 int weight; //权值,这个字符出现的频率 10 int parent; 11 int left; 12 int right; 13 }HuffNode; 14 15 typedef struct 16 { 17 char code[MAXNUM]; 18 int start; 19 }HuffCode; 20 21 HuffNode ht[MAXNUM * 2]; //存放哈夫曼树 22 23 HuffCode hcd[MAXNUM]; //存放ht数组中对应的字符的编码 24 25 int n; //字符的个数 26 27 //初始化哈夫曼树ht 28 void initHt() 29 { 30 FILE * fp; 31 char ch; 32 int i = 0; 33 //从文件1.txt中读出要编码的字符和权值 34 if ((fp = fopen("d:\1.txt", "r")) == NULL){ 35 printf("can not open the file 1.txt"); 36 exit(0); 37 } 38 ht[i].left = ht[i].right = ht[i].parent = -1; 39 while ((ch = fgetc(fp)) != EOF){ 40 if (ch == ' '){ 41 i++; 42 ht[i].left = ht[i].right = ht[i].parent = -1; 43 } 44 else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) 45 ht[i].ch = ch; 46 else if (ch >= '0'&&ch <= '9') 47 ht[i].weight = ht[i].weight * 10 + ch - '0'; 48 } 49 n = i + 1; 50 if (fclose(fp)){ 51 printf("can not close the file 1.txt"); 52 exit(0); 53 } 54 } 55 //构造哈夫曼树,看成有n棵树,选择权值最小的两棵树合并 56 void createHuffTree() 57 { 58 59 int i = 0, k; 60 int minI, minJ; 61 int f = 0; 62 minI = minJ = -1; //minI<minJ 63 for (k = n; k<2 * n - 1; k++){ 64 //寻找ht中权值最小且无父结点的两个结点 65 i = 0; 66 f = 0; 67 while (ht[i].ch != '