67,946
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
using namespace std;
typedef struct{
char data;
double weight;
int parent, lchild, rchild;
}HTNode,*HaffmanTree;
typedef char** Code;
void Compare(HaffmanTree HT, int& s1, int& s2, int n) {
int i, t;
double min=100000;
for (i = 1; i <= n; i++)
if (HT[i].parent == 0 && min > HT[i].weight) {
min = HT[i].weight;
s1 = i;
}
t = HT[s1].parent;
HT[s1].parent = -1;
min = 100000;
for (i = 1; i <= n; i++)
if (HT[i].parent == 0 && min > HT[i].weight) {
min = HT[i].weight;
s2 = i;
}
HT[s1].parent = t;
}
void CreateTree(HaffmanTree &HT,int n) {//构造哈夫曼树
HT = new HTNode[2*n];
int i,j,s1,s2;
cout << "输入节点信息:";
for (i = 1; i <= n; i++)
cin >> HT[i].data;
cout << "依次输入权值:";
for (i = 1; i <= n; i++) {
cin >> HT[i].weight;
HT[i].parent = 0;
HT[i].lchild = 0;
HT[i].rchild = 0;
}
for (i = n+1; i <= 2 * n + 1; i++) {
Compare(HT, s1, s2, i-1);
HT[i].lchild = s1;
HT[i].rchild = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;
HT[s1].parent = i;
HT[s2].parent = i;
}
}
void CreateCode(HaffmanTree HT, int n,Code &code) {//编码
int i, j;
code = new char* [n + 1];
for (i = 1; i <= n; i++) {
j = 0;
int p = HT[i].parent;
int c = i;
while (p != 0) {
if (HT[p].lchild == c)
code[i][j] = '0';
else
code[i][j] = '1';
j++;
c = p;
p = HT[p].parent;
}
code[i][j] = '\0';
for (int k = 0; k < j; k++) {
int t = code[i][k];
code[i][k] = code[i][j - k - 1];
code[i][j - k - 1] = t;
}
}
}
int WPL(HaffmanTree HT,int n,char **code) {
int i,j=0;
int wpl = 0;
for (i = 1; i <= n; i++) {
while (code[i][j] != '\0')
j++;
wpl = wpl + HT[i].weight * (j + 1);
}
return wpl;
}
int main() {
HaffmanTree HT;
Code code;
int n;
cout << "输入结点个数:";
cin >> n;
CreateTree(HT, n);
CreateCode(HT, n,code);
for (int i = 1; i <= n; i++)
cout << HT[i].data<<code[i]<<endl;
int wpl = WPL(HT, n, code);
cout << "wpl=" << wpl;
return 0;
}

为什么哈夫曼编码时总是会引发异常,这个要怎么解决呀,求解!!!