C语言哈夫曼树压缩算法,基于哈夫曼树的数据压缩算法

7c2a3e0396ef3bf0be8cb4ecc0f0ae83.png

fbc1a58827755dee7db648c19d88651b.png

#include

#include

#include

using namespace std;

#define MAXN 1000

typedef struct {

int weight;

int parent, lchild, rchild;

}HTNode, *HuffmanTree;

typedef char **HuffmanCode;

void Count(char str[], int count[])

{

for (int i = 1; i <= 26; i++)

{

count[i] = 0;

}

for (int i = 0; i

{

count[str[i] - 'a' + 1]++;

}

}

void Select(HuffmanTree &HT, int n, int &a, int &b)

{

unsigned int m1, m2;

m1 = m2 = 32767;

for (int i = 1; i <= n; i++)

{

if (HT[i].parent == 0 && HT[i].weight < m1)

{

m2 = m1;

b = a;

m1 = HT[i].weight;

a = i;

}

else

if (HT[i].parent == 0 && HT[i].weight < m2)

{

m2 = HT[i].weight;

b = i;

}

}

}

void CreatHuffmanTree(HuffmanTree &HT, int n, int count[])

{

if (n <= 1) return;

int m;

m = 2 * n - 1;

HT = new HTNode[m + 1];

for (int i = 1; i <= m; i++)

{

HT[i].parent = 0;

HT[i].lchild = 0;

HT[i].rchild = 0;

}

int j;

for (int i = 1,j=1; i <= n,j<=26; j++) {

if (count[j] > 0)

{

HT[i].weight = count[j];

i++;

}

}

int s1, s2;

for (int i = n + 1; i <= m; i++)

{

Select(HT, i - 1, s1, s2);

HT[s1].parent = i;

HT[s2].parent = i;

HT[i].lchild = s1;

HT[i].rchild = s2;

HT[i].weight = HT[s1].weight + HT[s2].weight;

}

}

void CreatHuffmanCode(HuffmanTree HT, HuffmanCode &HC, int n)

{

char *cd;

HC = new char*[n + 1];

cd = new char[n];

cd[n - 1] = '\0';

int start = 0;

int c, f;

for (int i = 1; i <= n; i++)

{

start = n - 1;

c = i;

f = HT[i].parent;

while (f != 0)

{

start--;

if (HT[f].lchild == c)

{

cd[start] = '0';

}

else

{

cd[start] = '1';

}

c = f;

f = HT[f].parent;

}

HC[i] = new char[n - start];

strcpy(HC[i], &cd[start]);

}

delete cd;

}

int main() {

char str[MAXN];

int count[50];

int n;

while (cin >> str&&*str != '0')

{

n = 0;

Count(str, count);

for (int i = 97; i<123; i++)

{

if (count[i - 96] > 0)

{

n++;

printf("%c:%d ", i, count[i - 96]);

}

}

cout << endl;

HuffmanTree HT;

CreatHuffmanTree(HT, n, count);

for (int i = 1; i <= 2 * n - 1; i++)

{

cout << i << " " << HT[i].weight << " " << HT[i].parent << " " << HT[i].lchild << " " << HT[i].rchild << endl;

}

HuffmanCode HC;

CreatHuffmanCode(HT, HC, n);

int j;

for (int i = 1; i

{

printf("%c:%s ", i, HC[i]);  //输出编码结果

}

cout << endl;

for (int i = 0; i

{

cout << HC[str[i] - 'a' + 1];

}

cout << endl;

for (int i = 0; i

cout << str[i];

cout << endl;

}

return 0;

}

用aabb这样开头的就可以过 eeeeffg就不行

哪个大神帮我看看哪里需要改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值