赫夫曼编码

lingdu787 2011-04-11 09:35:03
#include <iostream>
using namespace std;

const int BUFFER_SIZE = 20;

class HuffmanTree
{
public:
HuffmanTree()
{
parent = lchild = rchild = weight = 0;
}
int weight;
int parent, lchild, rchild;
};

void Select(HuffmanTree *pTree, int end, int &s1, int &s2)
{
int min = 65535;
for (int i = 1; i <= end; i++)
{
if ((pTree[i].parent == 0) && (pTree[i].weight < min))
{
s1 = i;
min = pTree[i].weight;
}
}
min = 65535;
for (int i = 1; i <= end; i++)
{
if ((pTree[i].parent == 0) &&
(pTree[i].weight < min) &&
(i != s1))
{
s2 = i;
min = pTree[i].weight;
}
}

}

HuffmanTree* Create(char **HC, int *w, int n)
{
if (n <= 1)
return NULL;
int m = 2 * n - 1;
//0号单元未用
HuffmanTree *pTree = new HuffmanTree[m + 1];
for (int i = 1; i <= n; i++)
{
pTree[i].weight = w[i - 1];
}
for (int i = n + 1; i <= m; ++i)
{
int s1 = 0;
int s2 = 0;
Select(pTree, i - 1, s1, s2);
if (s1 > s2)
swap(s1, s2);
pTree[s1].parent = i;
pTree[s2].parent = i;
pTree[i].lchild = s1;
pTree[i].rchild = s2;
pTree[i].weight = pTree[s1].weight + pTree[s2].weight;
}
cout << "parent lchild rchild weight : \n";
for (int i = 1; i < m + 1; i++ )
{
cout << pTree[i].weight << " ";
cout << pTree[i].parent << " ";
cout << pTree[i].lchild << " ";
cout << pTree[i].rchild << " ";
cout << endl;
}

char HC[20][20];
memset(HC, 0, sizeof(HC));
//*HC = new char[n + 1];
char *pcd = new char[n];
pcd[n - 1] = '\0';
for (int i = 1; i <= n; i++)
{
int start = n - 1;
int c,f;
for (c = i, f = pTree[i].parent; f != 0; c = f, f = pTree[f].parent)
{
if (pTree[f].lchild == c)
pcd[--start] = '0';
else
pcd[--start] = '1';
}
strcpy(HC[i], &pcd[start]);
cout << HC[i] << endl;
}
delete [] pcd;

return pTree;
}
...全文
173 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ulfsaar 2011-04-11
  • 打赏
  • 举报
回复
HuffmanTree* Create(char **HC, int *w, int n)
{
...
char HC[20][20];
...
}
这是什么意思?传进来的参数不用,又定义一个,Compile能过?
ouyh12345 2011-04-11
  • 打赏
  • 举报
回复
问题?
ghbst 2011-04-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ulfsaar 的回复:]
HuffmanTree* Create(char **HC, int *w, int n)
{
...
char HC[20][20];
...
}
这是什么意思?传进来的参数不用,又定义一个,Compile能过?
[/Quote]
LZ没有用那个指针……


PS.替LZ回复——
感谢各位参与,这个帖子只是为了分享。暂时没有问题

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧