构造哈夫曼树

构造哈夫曼树

(1)算法描述

建立哈夫曼树时,将哈夫曼树的结构定义为一个结构型的一维数组,每个元素含有四项:双亲、左孩子、右孩子。给定的权值可以从键盘输入,要输出所建立的哈夫曼树,只

要输出哈夫曼树的一维数组中全部元素即可。

(2)对应代码

#include<stdio.h>

#include<malloc.h>

#define maxval 10000.0

#define maxsize 100   

typedef struct

{

char ch;

float weight;

int lchild,rchild,parent;

}hufmtree;

typedef struct

{

char bits[10];   

int start;      

char ch;        

}codetype;

void huffman(hufmtree tree[],int n,int m);

void huffmancode(codetype code[],hufmtree tree[],int n);

int main()

{

int choice=0;

int n,m;

int i,j;

hufmtree *tree;

codetype *code;

printf("请输入元素个数:");

scanf("%d",&n);

m=2*n-1;

tree=(hufmtree *)malloc(sizeof(hufmtree)*m);

code=(codetype *)malloc(sizeof(codetype)*n);

huffman(tree,n,m);

printf("哈夫曼树已成功建立!\n");

huffmancode(code,tree,n);

printf("输出哈夫曼编码\n");

for(i = 0;i<n;i++)

{

printf("%c: ",code[i].ch);

for(j = code[i].start;j < n;j++)

printf("%c ",code[i].bits[j]);

printf("\n");

}

return 0;

}

void huffman(hufmtree tree[],int n,int m)

{

int i,j,p1,p2;

float small1,small2,f;

char c;

for(i=0;i<m;i++)    

{

tree[i].parent=0;

tree[i].lchild=-1;

tree[i].rchild=-1;

tree[i].weight=0.0;

}

for(i=0;i<n;i++)

{

printf("输入第%d个元素的=>\n",i+1);

printf("\t结点值:");

scanf("%c",&c);

tree[i].ch=getchar();

printf("\t权值:");

scanf("%f",&f);

tree[i].weight=f;

}

for(i=n;i<m;i++)      

{

p1=0;p2=0;

small1=maxval;small2=maxval;   

for(j=0;j<i;j++)    

if(tree[j].parent==0)

if(tree[j].weight<small1)

{

small2=small1;  

small1=tree[j].weight;

p2=p1;

p1=j;

}

else

if(tree[j].weight<small2)

{

small2=tree[j].weight;  

p2=j;

}

tree[p1].parent=i;

tree[p2].parent=i;

tree[i].lchild=p1;  

tree[i].rchild=p2;

tree[i].weight=tree[p1].weight+tree[p2].weight;

}

}

void huffmancode(codetype code[],hufmtree tree[],int n)

{

int i,c,p;

codetype cd;  

for(i=0;i<n;i++)

{

cd.start=n;

cd.ch=tree[i].ch;

c=i;       

p=tree[i].parent;

while(p!=0)

{

cd.start--;

if(tree[p].lchild == c)

cd.bits[cd.start] = '0';   

else

cd.bits[cd.start] = '1';   

c = p;

p = tree[p].parent;

}

code[i]=cd;    

}

}

(3)运行结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我要半糖zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值