1 //eg: 2 // 4 A B C D 9 5 2 4 3 // A: 0 B: 10 C: 110 D: 111 4 // ABCDCBA 010110111110100 5 #include<stdio.h> 6 #include<stdlib.h> 7 #include<string.h> 8 #include<conio.h> 9 #define OK 1 10 #define ERROR 0 11 typedef struct HTNode{ 12 char ch; 13 int weight; 14 int parent, lchild, rchild; 15 } HTNode; 16 typedef struct HTNode* HuffmanTree; 17 typedef char** HuffmanCode; 18 //定义全局变量 19 HuffmanTree HT; 20 HuffmanCode HC; 21 int n; 22 //选择两个最小结点 23 void select(int k, int *s1, int *s2){ 24 int i, ti, t=1000; 25 for(i = 1; i <= k; i++){ 26 if(!HT[i].parent){ 27 if(t > HT[i].weight){ 28 t = HT[i].weight;//t最后为最小的weight 29 ti = i; 30 } 31 } 32 } 33 *s1 = ti; 34 t = 1000; 35 ti = 0; 36 for(i = 1; i <= k; i++){ 37 if((!HT[i].parent) && i!=*s1){ //parent为0 38 if(t > HT[i].weight){ 39 t = HT[i].weight; 40 ti = i; 41 } 42 } 43 } 44 *s2 = ti; 45 } 46 //打印哈夫曼树 47 void printHT(int m){ 48 int i; 49 printf(" "); 50 printf("char weight parent lchild rchild "); 51 for(i = 1; i <= m; i++){ 52 printf(" %c %5d %5d %5d %5d ", HT[i].ch, HT[i].weight, HT[i].parent, HT[i].lchild, HT[i].rchild); 53 } 54 printf(" "); 55 } 56 //初始化(建树和编码表) 57 int Init(){ 58 int m = 2*n-1; 59 int i, s1, s2; 60 int w[n+1];//weight 0下标不使用 61 char ch[n+1];//字符 62 char title; 63 char* cd; 64 int start, c, f; 65 //建立哈夫曼树 66 while(title = getchar() != ' '); 67 printf("■请输入各字符(用空格分开):"); 68 for(i=1; i<=n; i++){ 69 scanf("%c", &ch[i]); 70 getchar(); 71 } 72 printf("■请输入各权值(用空格分开):"); 73 for(i=1; i<=n; i++) 74 scanf("%d", &w[i]); 75 HT = (HuffmanTree)malloc((m+1)*sizeof(HTNode));//0号节点不使用 76 for(i=1; i<=n; i++){ 77 HT[i].ch = ch[i]; 78 HT[i].weight = w[i]; 79 HT[i].lchild = 0; 80 HT[i].rchild = 0; 81 HT[i].parent = 0; 82 } 83 for(; i<=m; i++){ 84 HT[i].ch='-'; 85 HT[i].weight=0; 86 HT[i].lchild=0; 87 HT[i].rchild=0; 88 HT[i].parent=0; 89 } 90 for(i=n+1; i<=m; i++){ 91 select(i-1, &s1, &s2); 92 HT[s1].parent=i; 93 HT[s2].parent=i; 94 HT[i].lchild=s1; 95 HT[i].rchild=s2; 96 HT[i].weight=HT[s1].weight+HT[s2].weight; 97 } 98 printf(" ■生成的哈夫曼树为:"); 99 printHT(m); 100 //从叶子到根逆向求每个字符的哈夫曼编码 101 HC = (HuffmanCode)malloc((n+1)*sizeof(char*));//分配n个字符编码的头指针向量 102 cd = (char*)malloc(n*sizeof(char));//分配求编码的工作空间 103 cd[n-1]='