目 录
一、前言
本代码是在数据结构——哈夫曼树编程上建立的,使用时需将代码剪切到C++等软件中。需要输入权值方可实现流程图,但是还需要按照编程换算出的结果自己用笔画出流程图。
本算法编码是在上学时跟老师所写,部分信息不为准确,请谅解!首先输入有多少权值,其次依次输入权值;在输入完全部权值之后,即可看见运行结果
二、代码段
该编码需要运行在C语言程序上,程序运行结果是:
代码如下:
#include "stdio.h"
#define MAXLEN 100
typedef struct
{
int weight;
int lchild,rchild,parent;
}HTNode;
typedef HTNode HT[MAXLEN];
int n;
void InitHFMT (HT T)
{//初始化函数
int i;
printf("\n请输入共有多少个权值(小于100):");
scanf("%d",&n);
for(i=0;i<2*n-1;i++)
{
T[i].weight=0;
T[i].lchild=-1;
T[i].rchild=-1;
T[i].parent=-1;
}
}
void InputWeight (HT T)
{//输入权值子函数
int w,i;
for(i=0;i<n;i++){
printf("请输入第%d个权值:",i+1);
scanf("%d",&w);getchar();
T[i].weight=w;
}
}
void SelectMin (HT T,int i,int *pl,int *p2)
{//输入权值子函数
long minl=888888,min2=888888;
int j;
for(j=0;j<=i;j++){
if(T[j].parent==-1)
{if(minl>T[j].weight)
{ minl=T[j].weight;
*pl=j;
}
}
}
for (j=0;j<=i;j++)
{ if(T[j].parent==-1)
{ if (min2>T[j].weight&&j!=(*pl))
{ min2=T[j].weight;
*p2=j;
}
}
}
}
void CreatHFMT (HT T)
{
int i,pl,p2;
InitHFMT (T);
InputWeight(T);
for(i=n;i<2*n-1;i++)
{ SelectMin(T,i-1,&pl,&p2);
T[pl].parent=T[p2].parent=i;
T[i].lchild=T[pl].weight;
T[i].rchild=T[p2].weight;
T[i].weight=T[pl].weight+T[p2].weight;
}
}
void printHFMT (HT T)
{ /*输出向量状态表*/
int i;
printf("\n哈夫曼树的各边显示:\n");
for(i=0;i<2*n-1;i++)
while(T[i].lchild!=-1)
{printf("(%d,%d),(%d,%d)\n",T[i].weight,T[i].lchild,
T[i].weight,T[i].rchild);
break;
}
}
void hfnode(HT T,int i,int j)
{/*哈夫曼编码函数*/
j=T[i].parent;
if (T[j].rchild==T[i].weight)
printf("1");
else
printf("0");
if(T[j].parent!=-1)
i=j,hfnode (T,i,j);
}
void huffmannode(HT T)
{//求哈夫曼树编码
int i,j,a;
printf("\n输入的权值的对应哈夫曼树编码:");
for (i=0;i<n;i++)
{
j=0;
a=i;
printf("\n%i的编码为:",T[i].weight);
hfnode(T,i,j);
i=a;
}
}
void main()
{ HT HT;
CreatHFMT(HT);
printHFMT(HT);
huffmannode(HT);
printf("\n ");
}
三、程序运行结果示例:
1.首先输入:权值总数以及各个权值,编程便可实现;
2.按照代码画流程图,以上面图片的权值举例,在编程结果出来后:首先看两面的数值,
先看最后一行的和为158,那么流程图的总数(最高点)便变为158
其次158的左边值为66,右边值为92
在看上一行,和为92,那么对照代码下一行两边的值可知,右边值为92
所以在右边值下的左边值和右边值分别为43,49
依次往上,就不都举例了······
本编程的哈夫曼树编码有问题,其所给的数值与实际答案是相反的,举例列如9的编码为10,那么它真正的编码便为01。就是1为0,0为1。
四、流程图
画法如下(这是我个人理解的画法):