}
}
if (ht[k].weight min2=min1;rnode=lnode; min1=ht[k].weight;lnode=k; } else if (ht[k].weight min2=ht[k].weight; rnode=k; } } } ht[lnode].parent=i; ht[rnode].parent=i; //两个最小节点的父节点是i ht[i].weight=ht[lnode].weight+ht[rnode].weight; //两个最小节点的ht[i].lchild=lnode;ht[i].rchild=rnode; //父节点的左节点 父节点权值是两个最小的节点权值之和 和右节点 3.2 哈夫曼编码 voidCreateHCode(HTNodeht[],HCodehcd[],int n) { inti,p,c; HCodehc; for (i=0;i hc.start=n; //初始位置 c=i; //从叶子结点ht[i]开始往哈夫曼树的根节点上溯 p=ht[i].parent; while (p!=0) //循序一直到树根结点结束循环 { hc.cd[hc.start--]=(ht[p].lchild)==c?'0':'1'; //节点 1 的左孩子记为0,右孩子记为1 } } c=p; p=ht[p].parent; //与上面一句 c=i;p=ht[i].parent意思相同,用来促进循环 } hc.start++; //start指向哈夫曼编码hcd[i]=hc; hc.cd[]中最开始的字符 void outputHCode(HTNodeht[],HCodehcd[],int n) //输出哈夫曼编码的列表 { } void editHCode(HTNodeht[],HCodehcd[],intn,charstr[]) //编码函数 { inti,j,k; printf(\输出编码结果:\\n\ for (i=0;i for (j=0;j if(str[i]==ht[j].data) //在数组中循环查找与输入字符相{ inti,k; printf(\ 输出哈夫曼编码:\\n\ for (i=0;i printf(\ %c:\\t\ for (k=hcd[i].start;k<=n;k++) //输出所有data数组{ printf(\ //从最开始的字符起 数据, 中所有数据的编码 输出编码 } printf(\ 同的编号,如果相同的就输出这个字符的编码 } for (k=hcd[j].start;k<=n;k++) { printf(\ } break; //输出完成后跳出当前for循环 } printf(\ 3.4哈夫曼译码 void deHCode(HTNodeht[],HCodehcd[],intn,charstr[]) //译码函数 { 1 printf(\输出译码结果为:\\n\ inti,j,k,x,m=0; char code[MAX]; for (i=0;i for (j=0;j if(str[i]==ht[j].data) //在数组中循环查找与输入字符相{ for (k=hcd[j].start;k<=n;k++) { code[m]=hcd[j].cd[k]; //把输出编码赋值到数组中 m++; 同的编号,相同的就输出这个字符的编码 } break; //输出完成以后跳出当前的for循环 } 4 程序测试