这个代码都是我抄书上的,应该是没有错的。
这种找不到头文件里的函数的错误我抄书上的代码的时候,出现过好多次了呜呜呜
我也上网找过别人问的问题,要不就是参数错误,要不就是返回值错误,但是我看了自己的好多遍,都觉得我没有那些错误呀……
#include<iostream>
using namespace std;
const int MaxHTNum = 100;
const int HTNum = 2 * MaxHTNum - 1;
typedef struct
{
//权值
float weight;
int lchild, rchild, parent;
}HTNode;
class Huffman
{
public:
//构造函数
Huffman(int sz)
{
size = sz;
HT = new HTNode[2 * size];
for (int i = 1; i < 2 * size - 1; i++)
HT[i].lchild = HT[i].rchild = HT[i].parent = 0;
}
//析构函数
~Huffman()
{
delete[]HT;
}
//求哈夫曼编码
void HuffmanEncoding(CodeNode HC[]);
private:
//哈夫曼树叶子结点数
int size;
//哈夫曼树结点类型指针
HTNode* HT;
};
typedef struct
{
//存放编码的字符
char ch;
//存放编码串
char bits[MaxHTNum + 1];
//编码长度
int len;
}CodeNode;
//以上是.h部分以下是.cpp部分
void Huffman::HuffmanEncoding(CodeNode HC[])
{
//根据哈夫曼树HT求哈夫曼编码表HC
//c和p分别指示HT中孩子和双亲的位置
int c, p, i;
//临时存放编码串
char cd[MaxHTNum + 1];
//指示编码在cd中起始位置
int start;
//最后一位放上串结束符(size为Huffman树的叶子结点数)
cd[size] = '\0';
for (i = 1; i < size; i++)
{
//初始位置
start = size;
//从叶子结点HT[i]开始上溯
c = i;
//直至上溯到HT[c]为树根为止
while ((p = HT[c].parent) > 0)
{
//若HT[c]是HT[p]的左孩子,则生成代码0,否则生成代码1
cd[--start] = (HT[p].lchild == c) ? '0':'1';
//下一次的叶子是这一次找到的根结点
c = p;
}
//找到树根之后,start代表了最后一次填入代码的cd的下标
HC[i].len = size - start;
strcpy_s(HC[i].bits, HC[i].len, &cd[start]);
}
}