标准
八、附录:源程序清单
#include
typedef htnode hfmt[MAXLEN]; int n;
void inithfmt(hfmt t)//对结构体进行初始化 {
int i;
printf(\
printf(\--------------\\n\
printf(\输入区***************************************\\n\ printf(\请输入字符集大小n=\ scanf(\ getchar();
for(i=0;i<2*n-1;i++)//对结构体进行初始化 {
t[i].weight=0; t[i].lchild=-1; t[i].rchild=-1; t[i].parent=-1; }
printf(\}
void inputweight(hfmt t)//输入函数 {
int w;//w表示权值 int i;
char k;//k表示获取的字符
文案
标准
for(i=0;i printf(\请输入第%d个字符:\ scanf(\ getchar(); t[i].key=k; printf(\请输入第%d个字符的权值:\ scanf(\ getchar(); t[i].weight=w; printf(\ } } void selectmin(hfmt t,int i,int *p1,int *p2)//选中两个权值最小的函数 { long min1=999999; long min2=999999; int j; for(j=0;j<=i;j++)//选择最小权值字符的下标返回 if(t[j].parent==-1) if(min1>t[j].weight) { min1=t[j].weight; *p1=j; } for(j=0;j<=i;j++)//选择次小权值字符的下标还回 if(t[j].parent==-1) if(min2>t[j].weight && j!=(*p1))//注意 j!=(*p1)) { min2=t[j].weight; *p2=j; } } void creathfmt(hfmt t)//创建哈夫曼树的函数 { int i,p1,p2; inithfmt(t); inputweight(t); for(i=n;i<2*n-1;i++) { selectmin(t,i-1,&p1,&p2); t[p1].parent=i; 文案 标准 t[p2].parent=i; t[i].lchild=p1; t[i].rchild=p2; t[i].weight=t[p1].weight+t[p2].weight; } } void printhfmt(hfmt t)//打印哈夫曼树 { FILE *f1; char str[10000]; char *s; int i; if((f1=fopen(\哈夫曼树.txt\ { printf(\-----\\n\ s = \\ fprintf(f1,\ printf(\哈夫曼树关系结构****************************\\n\ s = \哈夫曼树关系结构****************************\\n\ fprintf(f1,\ printf(\权重\\t父母\\t左孩子\\t右孩子\\t字符\\t\ s = \权重\\t父母\\t左孩子\\t右孩子\\t字符\\t\ fprintf(f1,\ for(i=0;i<2*n-1;i++) { printf(\ printf(\[i].rchild,t[i].key); fprintf(f1,\hild,t[i].rchild,t[i].key); } printf(\-------\\n\ s = 文案 标准 \\\n\ fprintf(f1,\ fclose(f1); printf(\已将哈夫曼树存入文件,文件名为:哈夫曼树\\n\\n\ } } char ch; FILE *f2; void hfmtpath(hfmt t,int i,int j)//编码的重要哈夫曼树路径递归算法 { int a,b; a=i; b=j=t[i].parent; if(t[j].parent!=-1) { i=j; hfmtpath(t,i,j); } if(t[b].lchild==a) { printf(\ fputc('0',f2); } else { printf(\ fputc('1',f2); } } void phfmnode(hfmt t)//对字符进行初始编码 { int i,j,a; printf(\-------\\n\ printf(\哈夫曼编码******************************\ printf(\字符\\t权值\\t编码结果\ for(i=0;i 文案
相关推荐: