Status CreatHuffManTree(HuffManTree& HT,int*w,int n){//构造赫夫曼树//将a划分为n个子集;int m =2* n -1;
HT =(HuffManTree)malloc((m+1)*sizeof(HTNode));
HuffManTree p;int i;for( i =1;i < n +1;++i){
w++;
HT[i]={*w,0,0,0};}for(;i < m +1;++i){
HT[i]={0,0,0,0};}//构建赫夫曼树int s1, s2;//用于记录最小两元素的序号for(int i = n +1;i < m +1;i++){min_2(HT, i -1, s1, s2);
HT[s1].parent = HT[s2].parent = i;
HT[i].lchild = s1;HT[i].rchild = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;}return OK;}
赫夫曼编码
Status HuffManCoding(HuffManTree HT, HuffManCude& HC,int n){//从叶子到根逆向求每个字符的赫夫曼编码
HC =(HuffManCude)malloc((n+1)*sizeof(char*));char* cd =(char*)malloc(n *sizeof(char));
cd[n -1]='\0';int start =0;//逐个字符求赫夫曼编码for(int i =1;i < n +1;++i){
start = n -1;for(int 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';}
HC[i]=(char*)malloc((n - start)*sizeof(char));strcpy(HC[i],&cd[start]);}free(cd);return OK;}