You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
3.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <stdio.h>
#define MAXBIT 100
#define MAXVALUE 10000 //
#define MAXLEAF 30 //叶节点数目
#define MAXNODE MAXLEAF * 2 - 1 //节点数目
//首先构造出一颗哈夫曼树的结点,包括
//权重weight父亲parent 左儿子lchild右儿子rchild。
typedef struct
{
int bit[MAXBIT];
int start;
} HCodeType; //编码结构体
typedef struct HNodeType {
int weight;
int parent;
int lchild;
int rchild;
} HNodeType; //结点结构体
//开始创建一颗哈夫曼树
void Huffman(HNodeType HuffNode[MAXNODE], int n) {
int i, j, m1, m2, x1, x2; // i,j循环变量m1,m2:构造哈弗曼树不同过程中两个最小权值结点的权值
// x1,x2 构造哈弗曼树不同过程中两个最小权值结点在数组中的序号
for (i = 0; i < 2 * n - 1; i++) //初始化哈弗曼树数组中的结点
{
HuffNode[i].weight = 0;
HuffNode[i].parent = -1;
HuffNode[i].lchild = -1;
HuffNode[i].rchild = -1;
}
//输入n个叶子结点的权值
for (i = 0; i < n; i++) {
printf("Plese input weight of leaf node %d:\n", i);
scanf("%d", &HuffNode[i].weight);
}
//循环构造哈弗曼树
for (i = 0; i < n - 1; i++) {
m1 = m2 = MAXVALUE; // m1,m2中存放两个无父结点且结点权值最小的两个结点
x1 = x2 = 0;
//找出所有结点中权值最小、无父节点的两个结点,并合并为一颗二叉树
for (j = 0; j < n + i; j++) {
if (HuffNode[j].weight < m1 && HuffNode[j].parent == -1) {
m2 = m1;
x2 = x1;
m1 = HuffNode[j].weight;
x1 = j;
} else if (HuffNode[j].weight < m2 && HuffNode[j].parent == -1) {
m2 = HuffNode[j].weight;
x2 = j;
}
}
HuffNode[x1].parent = n + i;
HuffNode[x2].parent = n + i;
HuffNode[n + i].weight = HuffNode[x2].weight + HuffNode[x1].weight;
HuffNode[n + i].lchild = x1;
HuffNode[n + i].rchild = x2;
}
}
/*
5
10 15 30 16 29
*/
int main() {
HNodeType HuffNode[MAXNODE]; //定义一个结点结构体数组
HCodeType HuffCode[MAXLEAF], cd; //定义一个编码结构体数组,同时定义一个临时变量来存放求解编码时的信息
int i, j, c, n, p;
printf("Please input n:\n");
scanf("%d", &n);
Huffman(HuffNode, n);
for (i = 0; i < n; i++) {
cd.start = n - 1;
c = i;
p = HuffNode[c].parent;
while (p != -1) //父节点存在
{
if (HuffNode[p].lchild == c) {
cd.bit[cd.start] = 0;
} else {
cd.bit[cd.start] = 1;
}
cd.start--; //求编码的低一位
c = p;
p = HuffNode[c].parent; //设置下一循环条件
}
for (j = cd.start + 1; j < n; j++) {
HuffCode[i].bit[j] = cd.bit[j];
}
HuffCode[i].start = cd.start;
}
for (i = 0; i < n; i++) {
printf("%d 's Huffman code is:", i);
for (j = HuffCode[i].start + 1; j < n; j++) {
printf("%d", HuffCode[i].bit[j]);
}
printf("\n");
}
getchar();
return 0;
}