霍夫曼编码 C++ 代码引发致命错误
Huffman Encoding C++ code is throwing a fatal error
我正在为著名的霍夫曼编码算法编写代码。我收到一个致命错误,将系统变成蓝屏,然后重新启动。此错误发生在具有递归调用的 display_Codes 中。错误发生在以下几行:
display_Codes(root->l, s + "0");
display_Codes(root->r, s + "1" );
完整代码如下。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
class HeapNode_Min {
public:
char d;
unsigned f;
HeapNode_Min *l, *r;
HeapNode_Min(char d, unsigned f)
{
this->d = d;
this->f = f;
}
~HeapNode_Min()
{
delete l;
delete r;
}
};
class Analyze {
public:
bool operator()(HeapNode_Min* l, HeapNode_Min* r)
{
return (l->f > r->f);
}
};
void display_Codes(HeapNode_Min* root, string s)
{
if(!root)
return;
if (root->d != '$')
cout << root->d << " : " << s << "\n";
display_Codes(root->l, s + "0");
display_Codes(root->r, s + "1" );
}
void HCodes(char data[], int freq[], int s)
{
HeapNode_Min *t,*r, *l ;
priority_queue<HeapNode_Min*, vector<HeapNode_Min*>, Analyze> H_min;
int a=0;
while (a<s){H_min.push(new HeapNode_Min(data[a], freq[a])); ++a;}
while (H_min.size() != 1) {
l = H_min.top(); H_min.pop();
r = H_min.top(); H_min.pop();
t = new HeapNode_Min('$', r->f + l->f);
t->r = r; t->l = l;
H_min.push(t);
}
display_Codes(H_min.top(), "");
}
int main()
{
try
{
int frequency[] = { 3, 6, 11, 14, 18, 25 }; char alphabet[] = { 'A', 'L', 'O', 'R', 'T', 'Y' };
int size_of = sizeof(alphabet) / sizeof(alphabet[0]);
cout<<"Alphabet"<<":"<<"Huffman Code\n";
cout<<"--------------------------------\n";
HCodes(alphabet, frequency, size_of);
}
catch(...)
{
}
return 0;
}
您从未将 l
或 r
设置为 nullptr
,但您的代码依赖于有效指针或 nullptr
:
void display_Codes(HeapNode_Min* root, string s)
{
if(!root)
return;
if (root->d != '$')
cout << root->d << " : " << s << "\n";
display_Codes(root->l, s + "0");
display_Codes(root->r, s + "1" );
}
传递一个没有左节点和右节点的 root
,那么 root->l
和 root->r
都没有可用于任何事情的值。将它们传递给下一个递归可以让您取消引用它们,从而调用未定义的行为。
要解决这个问题,您需要初始化指针,例如在构造函数中:
HeapNode_Min(char d, unsigned f) : d(d),f(f),l(nullptr),r(nullptr) { }
另外你的class不符合rule of 3/5/0。
我正在为著名的霍夫曼编码算法编写代码。我收到一个致命错误,将系统变成蓝屏,然后重新启动。此错误发生在具有递归调用的 display_Codes 中。错误发生在以下几行:
display_Codes(root->l, s + "0");
display_Codes(root->r, s + "1" );
完整代码如下。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
class HeapNode_Min {
public:
char d;
unsigned f;
HeapNode_Min *l, *r;
HeapNode_Min(char d, unsigned f)
{
this->d = d;
this->f = f;
}
~HeapNode_Min()
{
delete l;
delete r;
}
};
class Analyze {
public:
bool operator()(HeapNode_Min* l, HeapNode_Min* r)
{
return (l->f > r->f);
}
};
void display_Codes(HeapNode_Min* root, string s)
{
if(!root)
return;
if (root->d != '$')
cout << root->d << " : " << s << "\n";
display_Codes(root->l, s + "0");
display_Codes(root->r, s + "1" );
}
void HCodes(char data[], int freq[], int s)
{
HeapNode_Min *t,*r, *l ;
priority_queue<HeapNode_Min*, vector<HeapNode_Min*>, Analyze> H_min;
int a=0;
while (a<s){H_min.push(new HeapNode_Min(data[a], freq[a])); ++a;}
while (H_min.size() != 1) {
l = H_min.top(); H_min.pop();
r = H_min.top(); H_min.pop();
t = new HeapNode_Min('$', r->f + l->f);
t->r = r; t->l = l;
H_min.push(t);
}
display_Codes(H_min.top(), "");
}
int main()
{
try
{
int frequency[] = { 3, 6, 11, 14, 18, 25 }; char alphabet[] = { 'A', 'L', 'O', 'R', 'T', 'Y' };
int size_of = sizeof(alphabet) / sizeof(alphabet[0]);
cout<<"Alphabet"<<":"<<"Huffman Code\n";
cout<<"--------------------------------\n";
HCodes(alphabet, frequency, size_of);
}
catch(...)
{
}
return 0;
}
您从未将 l
或 r
设置为 nullptr
,但您的代码依赖于有效指针或 nullptr
:
void display_Codes(HeapNode_Min* root, string s) { if(!root) return; if (root->d != '$') cout << root->d << " : " << s << "\n"; display_Codes(root->l, s + "0"); display_Codes(root->r, s + "1" ); }
传递一个没有左节点和右节点的 root
,那么 root->l
和 root->r
都没有可用于任何事情的值。将它们传递给下一个递归可以让您取消引用它们,从而调用未定义的行为。
要解决这个问题,您需要初始化指针,例如在构造函数中:
HeapNode_Min(char d, unsigned f) : d(d),f(f),l(nullptr),r(nullptr) { }
另外你的class不符合rule of 3/5/0。