#include <stdio.h>
#include <malloc.h>
#include <cstring>
#include <stdlib.h>
#include <limits.h>
typedef struct hnode{
int weight;
int lchild,rchild,parent;
}HTNode,*HuffmanTree;//动态分配数组存储哈夫曼树
typedef char** HuffmanCode;//动态分配数组存储哈夫曼编码表
//这是一个定义了一个指向字符指针数组的类型别名。具体来说,
//HuffmanCode是一个指向char*类型的指针的指针,也就是一个二维字符数组。
//在Huffman编码中,通常会使用这种数据结构来存储每个字符对应的编码。
void Select(HuffmanTree &HT,int len,int &s1,int &s2);
void CreatHuffman_tree(HuffmanTree &HT,int n)
{
int s1,s2;
if(n<=1)
return ;
int m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
// HT=new HTNode[m+1]; //new关键字用于动态分配内存空间。
//它用于在运行时创建一个对象数组。HT=new HTNode[m+1]的意思是,
//使用new操作符为HT分配了一个大小为m+1的HTNode对象数组,并将其地址赋值给HT。
for(int i=1;i<=m;i++)
{
HT[i].parent=0;
HT[i].lchild=HT[i].rchild=0;
}
printf("哈夫曼各结点的值为:");
for(int i=1;i<=n;i++)
{
scanf("%d",&HT[i].weight);
}
for(int i=n+1;i<=m;i++)
{
Select(HT,i-1,s1,s2);
HT[s1].parent=HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
}
void Select(HuffmanTree &HT,int len,int &s1,int &s2)//在len中找最小的两个元素
{//选出权值最小的两个结点,下标通过s1和s2传出去
int min1=INT_MAX,min2=INT_MAX;
for(int i=1;i<=len;i++)
{
if(HT[i].weight<min1&&HT[i].parent==0)
{
s2=s1;//这两步操作是为了s2能够找到第二小的数
min2=min1;
s1=i;
min1=HT[i].weight;
}
else if(HT[i].weight<min2&&HT[i].parent==0)//这个情况是为了第一个结点就是最小的
{ min2=HT[i].weight;
s2=i;
}
}
}
void Huffman_code(HuffmanTree &HT,HuffmanCode &HC,int n)
{
char *cd;
int start=0;
int c=0,f=0;
HC=(HuffmanCode)malloc((n+1)*sizeof(char *));
// HC=new char*[n+1];
cd=(char*)malloc(n*sizeof(char));
// cd=new char[n];
cd[n-1]='\0';
for(int i=1;i<=n;i++)
{
start=n-1;
c=i;//表示查找第c个结点
f=HT[i].parent;//记录第图i个结点的双亲
while(f!=0)
{
if(HT[f].lchild==c)
{
cd[--start]='0';
}
else
{
cd[--start]='1';
}
c=f;
f=HT[f].parent;
}
//HC[i]=new char[n-start+1];
HC[i]=(char*)malloc((n-start+1)*sizeof(char));
strcpy(HC[i],&cd[start]);
}
// delete cd;
free(cd);
}
int main(void)
{
HuffmanTree HT;//哈夫曼树HT
HuffmanCode HC;//n个字符的哈夫曼编码HC
printf("请输出哈夫曼的结点的个数:");
int n;
scanf("%d",&n);
CreatHuffman_tree(HT,n);//建立哈夫曼树
Huffman_code(HT,HC,n);
for(int i=1;i<=n;i++)
{
printf("第%d个编码为%s\n",i,HC[i]);
}
return 0;
}
代码里有注释,有前面线性表的基础,哈夫曼还是可以完成的