hfmtpath(t,i,j);
printf("\n");
}
(4)对用户输入的字符进行编码
void decoding(hfmt t)//对用户输入的密文进行译码
{
char r[100];
int i,j,len;
j=2*n-2;//j 初始从树的根节点开始
printf("\n\n 请输入需要译码的字符串:");
gets(r);
len=strlen(r);
printf("译码的结果是:");
for(i=0;i
#include
#include
#define MAXLEN 100
typedef struct
{
int weight;
3
int lchild;
int rchild;
int parent;
char key;
}htnode;
typedef htnode hfmt[MAXLEN];
int n;
void inithfmt(hfmt t)//对结构体进行初始化
{
int i;
printf("\n");
printf("------------------------------------------------------------------\n");
printf("******************************
输
入
区
******************************\n");
printf("\n 请输入 n=");
scanf("%d",&n);
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("\n");
}
void inputweight(hfmt t)//输入函数
{
int w;//w 表示权值
int i;
char k;//k 表示获取的字符
for(i=0;i
printf("\n");
}
}
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)//打印哈夫曼树
{
int i;
5
printf("------------------------------------------------------------------\n");
printf("**********************
哈
夫
曼
编
数
结
构:*****************************\n");
printf("\t\t 权重\t 父母\t 左孩子\t 右孩子\t 字符\t");
for(i=0;i<2*n-1;i++)
{
printf("\n");
printf("\t\t%d\t%d\t%d\t%d\t%c",t[i].weight,t[i].parent,t[i].lchild,t[i].rchild,
t[i].key);
}
printf("\n------------------------------------------------------------------\n")
;
printf("\n\n");
}
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("0");
else
printf("1");
}
void phfmnode(hfmt t)//对字符进行初始编码
{
int i,j,a;
printf("\n------------------------------------------------------------------\n")
;
printf("**************************
哈
夫
曼
编
码
6
******************************");
for(i=0;i
}
else if(r[i]=='1')
{
j=t[j].rchild;
if(t[j].rchild==-1)
{
printf("%c",t[j].key);
j=2*n-2;
}
}
}
printf("\n\n");
}
int main()
{
int i,j;
hfmt ht;
char flag;
printf("
printf("
printf("
printf("
printf("
printf("
printf("
creathfmt(ht);
printhfmt(ht);
phfmnode(ht);
|----------------------|\n");
|信管 1002--林左权--15 号|\n");
|**********************|\n");
| 哈夫曼编码课程设计 |\n");
|**********************|\n");
|设计完成时间:2011/6/27|\n");
|----------------------|\n");
printf("\n------------------------------------------------------------------\n")
;
printf("*************************** 编 码 && 译 码 && 退 出
***********************");
printf("\n【1】编码\t【2】\t 译码\t【0】退出");
printf("\n 您的选择:");
flag=getchar();
getchar();
while(flag!='0')
{
if(flag=='1')
encoding(ht);
else if(flag=='2')
decoding(ht);
else
printf("您的输入有误,请重新输入。\n");
8