哈夫曼树链式存储及简单哈夫曼编码VB实现

这篇博客介绍了如何使用链式存储构建哈夫曼树,并给出了使用VB实现哈夫曼编码的过程,包括创建哈夫曼树、加密和解密的算法。文章详细阐述了每个步骤,并提供了相应的VB代码示例。
摘要由CSDN通过智能技术生成

 

一.哈夫曼树链式存储

首先做如下定义:

Typedef struct HuffNode{

   Int data;/*权值*/

   Struct HuffNode *LChild;

   Struct HuffNode *RChild;

}HuffNode,*HuffTree;

我们在构造时,先建议叶子结点,用一组HuffNode型的指针数组(HuffNode *    S

­­)表示:

Void createHuffTree(HuffTree *ht,int a[],int n)

S[i]=(HuffTree)malloc(sizeof(HuffNode));

S[i]->data=a[i];

S[i]->LChild=NULL;s[i]->RChild=NULL;

然后,找到s[i]->data 的两个结点,设为s[x1],s[x2];定义临时结点 HuffNode* temp;temp=(HuffTree)malloc(sizeof(HuffTree));

Temp->data=s[x1]->data+s[x2]->data;

temp->LChild=s[x1];Temp->RChild=s[x2];

s[x1]=temp;//将temp结点加入到数组s中。删除s[x1];

S[x2]=NULL;//删除s[x2];

接着再找最小的,后面过程是重复的,对于n个叶子结点的哈夫曼树,该循环体其实只用执行n-1次。

最后一步,直接赋值:*ht=temp;

其实上面过程中的指针 temp,完全可以用*ht代替,那样的话,最后一步就赘余了。

代码如下:

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

#define M 20

#define INF 100

 

typedef struct HuffNode{

   int data;

   struct HuffNode *LChild;

   struct HuffNode *RChild;

}HuffNode,*HuffTree;

 

void CreateHuffTree(HuffTree *ht){

   int min1,min2,mid;

   HuffNode *s

­­,*temp;

   int i,n,m;

   for(i=0;i<M;i++) s

­­=NULL;/*初始化。。*/

 

   printf("请输入叶子结点的个数\n");

   scanf("%d",&n);

   printf("请输入权值\n");

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

     s[i]=(HuffNode *)malloc(sizeof(HuffNode));

     scanf("%d",&(s[i]->data));

     s[i]->LChild=NULL;

     s[i]->RChild=NULL;

   }/*创建叶子结点*/

 

   m=n-1;

   do{

     m--;

     mid=INF;

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

        if((s[i]!=NULL)&&(mid>s[i]->data)) {mid=s[i]->data;min1=i;}

     mid=INF;

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

        if((s[i]!=NULL)&&(i!=min1)&&(mid>s[i]->data)) {mid=s[i]->data;min2=i;}/*找最小的2个结点*/

 

     temp=(HuffTree)malloc(sizeof(HuffNode));

     temp->data=s[min1]->data+s[min2]->data;

     temp->LChild=s[min1];

     temp->RChild=s[min2];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值