#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct { unsigned int weight; unsigned int parent, lchild, rchild; }HTNode, *HuffmanTree; typedef char * * HuffmanCode; void Select(HuffmanTree, int,int &, int &); void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n) { int m = 0; int i = 0; HTNode *p = 0; if( n <= 1) return; m = 2 * n - 1; HT = (HuffmanTree)malloc((m+1) * sizeof(HTNode)); for(p= HT+1, i=1; i<=n; ++i, ++p,++w) { p->weight = *w; p->parent = 0; p->lchild = 0; p->rchild = 0; } for(; i<=m; ++i,++p) { p->weight = 0; p->parent = 0; p->lchild = 0; p->rchild = 0; } int s1 = 0, s2 = 0; for(i=n+1; i<=m; ++i) { Select(HT,i-1,s1,s2); HT[s1].parent = i; HT[s2].parent= i; HT[i].lchild = s1; HT[i].rchild = s2; HT[i].weight = HT[s1].weight +HT[s2].weight; } char* cd = 0; HC = (HuffmanCode)malloc((n+1)*sizeof(char *)); cd = (char *)malloc(n*sizeof(char)); cd[n-1] = '/0'; unsigned int start = 0; unsigned int c = 0, f = 0; for(i=1; i<=n; ++i) { start = n - 1; for(c = i, f=HT[i].parent; f!= 0; c=f, f=HT[f].parent) { if(HT[f].lchild == c) cd[--start] = '0'; else cd[--start] = '1'; printf("%c",cd[start]); } HC[i] = (char *)malloc((n-start) * sizeof(char)); strcpy(HC[i], &cd[start]); printf("/n"); } free(cd); } void Select(HuffmanTree HT, int count,int &s1, int &s2) { int first = 0; int second = 0; for(int i = 1; i <= count; i++) { if(HT[i].parent ==0 ) { if(first == 0) { first = i; } else if(HT[i].weight < HT[first].weight) { first = i; } } } for (i = 1; i <= count; i++) { if(HT[i].parent == 0 && i != first) { if(second ==0) { second = i; } else if(HT[i].weight < HT[second].weight ) { second = i; } } } s1 = first; s2 = second; } void main() { HuffmanTree HT; HuffmanCode HC; int *w;//权值 int n;//n个字符 n = 4; w = (int *)malloc(n * sizeof(int)); w[0] = 3; w[1] = 1; w[2] = 2; w[3] = 1; HuffmanCoding(HT, HC, w, n); }