日常说明:首先博主也是菜鸟一枚,有错误欢迎大家指正。另外本博客所有的代码博主编写后均调试
通过。重要提醒!!!!博主使用的是VS2017,如果有低版本的小伙伴
最好新建空项目将此代码复制上去。
更多算法请关注我的算法专栏https://blog.csdn.net/column/details/20417.html
运行截图:
HuffmanCoding.h
#pragma once
//=============================================================
// CopyrigHtree (C) 2018-2118
// 机器名称: ASUS-EK
// 项目名: HuffmanCode
// 创建人: shilei
// 创建时间: 2018.4.9
//=============================================================
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
#include<cstdlib>
#include"malloc.h"
using namespace std;
typedef int DataType;
typedef struct
{
char character;
int weight;
DataType parent, lchild, rchild;
}HTNode, *HuffmanTree;
typedef char **HuffmanCode;
void Select(HuffmanTree&Htree, int n, int &s1, int &s2)
{
s1 = s2 = 0;
int i;
for (i = 1; i <= n; ++i) {
if (0 == Htree[i].parent) {
if (0 == s1) {
s1 = i;
}
else {
s2 = i;
break;
}
}
}
if (Htree[s1].weight > Htree[s2].weight) {
int t = s1;
s1 = s2;
s2 = t;
}
for (i += 1; i <= n; ++i) {
if (0 == Htree[i].parent) {
if (Htree[i].weight < Htree[s1].weight) {
s2 = s1;
s1 = i;
}
else if (Htree[i].weight < Htree[s2].weight) {
s2 = i;
}
}
}
}
void CreatHT(HuffmanTree&Htree, HuffmanCode&HC)//n个字符
{
int m;
int n;
cout << "请输入字符的个数: ";
cin >> n;
cout << "请分别输入" << n << "个字符及其权值,以空格相隔:" << endl;
int s1, s2;
if (n <= 1) return;
char *p = new char[4];
m = 2 * n - 1;
//Htree = (HuffmanTree)malloc((m + 1) * sizeof(HTNode));//0号单元未用
Htree = new HTNode[m + 1];
Htree[0].weight = m;
for (int i = 1; i <= n; ++i)
{
cin >> Htree[i].character;
cin >> Htree[i].weight;
}
for (int i = 1; i <= m; ++i)
{
Htree[i].parent = 0;
Htree[i].lchild = 0;
Htree[i].rchild = 0;
}
for (int i = n + 1; i <= m; ++i)
{
Htree[i].weight = 0;
}//三个for循环为哈夫曼树初始化
for (int i = n + 1; i <= m; ++i)
{
Select(Htree, i-1, s1, s2);
Htree[s1].parent = i;
Htree[s2].parent = i;
Htree[i].lchild = s1;
Htree[i].rchild = s2;
Htree[i].weight = Htree[s1].weight + Htree[s2].weight;
}//建造哈夫曼树
HC = (char**)malloc((n + 1) * sizeof(char *));
/*HC = new char*[n + 1];*/
char *cd = new char[n];
/*cd = (char*)malloc(n * sizeof(char));*/
cd[n - 1] = '\0';
int f, c;
for (int i = 1; i <= n; ++i)
{
int start;
start = n - 1;
for (c = i, f = Htree[i].parent; f != 0; c = f, f = Htree[f].parent)
{
if (Htree[f].lchild == c) cd[--start] = '0';
else
{
cd[--start] = '1';
}
HC[i] = new char[n - start];
strcpy(HC[i], &cd[start]);
}
}
delete[]cd;
}
main.cpp
#include"HuffmanCoding.h"
int main()
{
HuffmanTree HT;
HuffmanCode HC;
CreatHT(HT,HC);
cout << "index" << " " << "weight" << " " << "parent" << " " << "lchild" << " " << "rchild"<<endl;
for (int i = 1, p = HT[0].weight; i <= p; ++i)
{
cout << "-----------------------------------------" << endl;
cout << i << " ";
cout << HT[i].weight << " ";
cout << HT[i].parent << " ";
cout << HT[i].lchild << " ";
cout << HT[i].rchild << endl;
}
cout << endl;
cout << "***************************************************"<<endl;
for (int i = 1, p = HT[0].weight; i <= p; ++i)
{
cout << HT[i].character << " ";
cout << HC[i] << endl;
}
cout << endl;
return 0;
}