哈夫曼算法比较简单不解释了 直接上代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
int weight; //结点权值
int parent, lchild, rchild; //结点的双亲、左孩子、右孩子
}HTNode, * HuffmanTree; //动态分配数组存储哈夫曼树
//判断最小权值函数
void Select(HTNode *HT, int m, int* s1, int* s2)
{
int i;
int minweight = 10000;
for (i = 1; i <= m; i++)
{
if (HT[i].weight < minweight && HT[i].parent == 0) //寻找最小权值
{
minweight = HT[i].weight;
*s1 = i;
}
}
minweight = 10000;
for (i = 1; i <= m; i++)
{
if ((HT[i].weight < minweight) && (HT[i].parent == 0) && (i != *s1)) //寻找第二小的权值
{
minweight = HT[i].weight;
*s2 = i;
}
}
}
//编码生成
void haffumancode(HTNode *HT,char *a,int n)
{
int m = 2*n-1;
int i = 0;
int j = 0;
for(i = 1;i<m;i++,j++)
{
int p = HT[i].parent;
int c = i;
while(p)
{
if(HT[i].lchild)
a[j] = '0';
else
a[j] = '1';
c = p;
p = HT[c].parent;
}
}
}
void createhuffmantree(HTNode* HT, int n, int *cun) //构建哈夫曼树
{
int j = 0;
int m = 2 * n;
HT = (HTNode*)malloc(sizeof(HTNode)*m);
for (int i = 1; i < m; i++) //初始化哈夫曼树
{
HT[i].weight = 0;
HT[i].parent = 0;
HT[i].lchild = 0;
HT[i].rchild = 0;
}
while (cun[j] != 0)
{
HT[j + 1].weight = cun[j];
j++;
}
for (int i = n+1 ; i <m; i++)
{
int s1 = 0, s2 = 0;
Select(HT, i-1 , &s1, &s2);
HT[i].weight = HT[s1].weight + HT[s2].weight;
HT[s1].parent = i;
HT[s2].parent = i;
HT[i].lchild = s1;
HT[i].rchild = s2;
}
printf("哈夫曼树为:\n结点 权值 父结点 左孩子 右孩子\n");
for (int i = 1; i < 2 * n; i++)
{
printf("%3d%6d%6d%7d%8d\n", i, HT[i].weight, HT[i].parent, HT[i].lchild, HT[i].rchild);
}
char q[100];
haffumancode(HT,&q,n);
printf("%s\n",q);
}
void main()
{
char a[100];
printf("请输入字符串:\n");
scanf("%s", &a);
int i = 0;
int j = 0;
int cun[26] = { 0 };
int count[26] = { 0 };
for (i = 0; i < strlen(a); i++) //判断字符权重的函数 主要是利用ascll码值
{
count[a[i] - 'a']++;
}
for (i = 0; i < 26; i++)
{
if (count[i] != 0)
{
cun[j] = count[i];
j++;
printf("%c:%d ", i + 'a', count[i]);
}
}
printf("\n");
HTNode HT[100];
createhuffmantree(&HT, j, &cun);
system("pause");
}