#include "stdafx.h"#include <stdio.h>#include <malloc.h>#include <string.h>#include<iostream.h>
#define UINT_MAX 1000
typedef struct { unsigned int weight; unsigned int parent,lchild,rchild; }HTNode,*HuffmanTree;
typedef char **HuffmanCode;
int min(HuffmanTree t,int i)
{
int j,f;
unsigned int k=UINT_MAX;
for(j=1;j<=i;j++)
if(t[j].weight<k&&t[j].parent==0)
k=t[j].weight,f=j;
t[f].parent=1;
return f;
}
void select(HuffmanTree t,int i,int &s1,int &s2)
{ int min(HuffmanTree t,int i);
int j;
s1=min(t,i);
s2=min(t,i); if(s1>s2)
{
j=s1;
s1=s2;
s2=j;
}
}
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w, int n){
void select(HuffmanTree t,int i,int &s1,int &s2);
int m,i,s1,s2,start; char *cd; unsigned c,f;
HuffmanTree p; if (n<=1) return; m=2*n-1; HT = (HuffmanTree)malloc((m+1)*sizeof(HTNode)); for (p=HT, 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; } 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; } HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); cd = (char *)malloc( n * sizeof(char) ); cd[n-1]='\0'; for(i=1;i<=n;i++) { start=n-1; c=i;f=HT[i].parent; while(f!=0) { --start; if(HT[f].lchild==c) cd[start]='0'; else cd[start]='1'; c=f;f=HT[f].parent; } HC[i]=(char*)malloc((n-start)*sizeof(char)); strcpy(HC[i],&cd[start]); } free(cd);}
int main()
{ HuffmanTree HT; HuffmanCode HC; int n,i; int* w; cout<<"请输入权值的个数"<<endl;; cin>>n; w=(int*)malloc((n+1)*sizeof(int)); cout<<"请依次输入"<<n<<"个权值(整型)"<<endl; for(i=0;i<=n-1;i++) { cin>>*(w+i); } HuffmanCoding(HT,HC,w,n); for(i=1;i<=n;i++) { cout<<HC[i]<<endl; } free(HT); free(HC); return 0; }
这是代码··