gpt4 book ai didi

c++ - 霍夫曼代码 - 段错误 11

转载 作者:太空狗 更新时间:2023-10-29 23:07:13 25 4
gpt4 key购买 nike

好的,我已经尝试自己制作 Hauffman 代码,但当我尝试使用递归方法将相应的代码打印到每个字母时遇到问题。

(至此我已经创建了一个 BinaryTree 并且 root 不为 NULL)每个节点都有一个值,如果它是叶子,它也有一个字母,所以我开始逐个节点地沿着树向下走,但似乎在递归方法中节点只是忘记了他是谁或者我不知道,我有尝试了很多东西。 :S

递归方法是createCode(Node* actual, string actualCode);

代码如下:

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string>
#include <queue>
using namespace std;

#define MAX_VALUE 256
int frequencies[MAX_VALUE] = {0};

struct Node {
int value;
char letter;
struct Node *Left, *Right;
}*root=NULL, *temp, *left_temp, *right_temp;

struct CompareNode : public std::binary_function<Node*, Node*, bool> {
bool operator()(const Node* lhs, const Node* rhs) const {
if (lhs->value == rhs->value)
return lhs->letter > rhs->letter;
else
return lhs->value > rhs->value;
}
};

void createCode(Node* actual,string actualCode) {
if (actual->Left == NULL && actual->Right == NULL) {
cout << "For: " << actual->letter << " is " << actualCode << endl;
}
else {
if (actual->Left) {
createCode(actual->Left, actualCode + "0");
}
if (actual->Right) {
createCode(actual->Right, actualCode + "1");
}
}
}

void createTree() {
priority_queue<Node*, vector<Node*>, CompareNode> que;

for (int x = 0; x < MAX_VALUE; x++) {
if (frequencies[x] > 0) {
temp = new Node;
temp->value = frequencies[x];
temp->letter = char(x);
que.push(temp);
}
}

while (que.size() > 1) {
temp = new Node();
temp->Left = que.top();
que.pop();
temp->Right = que.top();
que.pop();
temp->value = temp->Left->value + temp->Right->value;
temp->letter = NULL;
que.push(temp);
}

root = que.top();
que.pop();
}

void fillArray(int argc, char *argv[]) {
string line;
const char* ptr;

ifstream myFile(argv[argc - 1]);
if (myFile.is_open()) {
while (myFile.good()) {
getline(myFile,line);

if (line.length() != 0) {
ptr = &line.at(0);

while (*ptr != '\0')
++frequencies[*ptr++];
}
}
}
else
cout << "The file could not be open.";
}

int main(int argc, char *argv[]) {
fillArray(argc, argv);

createTree();

createCode(root, "");
return 0;
}

这是示例树(我试图发布图片,但因为我是新手所以不能):

Binary Tree Image

这是输出:

For: a is 0
For: is 10
Segmentation fault: 11

请帮忙:(

最佳答案

在创建你插入的Node时,你需要将LeftRight指针初始化为NULL队列:

if (frequencies[x] > 0) {
temp = new Node;
temp->Left = NULL;
temp->Right = NULL;
temp->value = frequencies[x];
temp->letter = char(x);
que.push(temp);
}

如果没有显式初始化,这些指针具有不确定的值,并且通常不是 NULL,因此在 createCode 中,您将取消引用无效指针。

关于c++ - 霍夫曼代码 - 段错误 11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13390374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com