我是一名学习数据结构的学生。这是我的BST代码。在执行main
函数期间,输出为
1
2
3
4
...并且“% s”不是输出,而是转储的核心。为什么...
下面是我的代码:
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
class Node {
public:
string data = "";
Node *par;
Node *left;
Node *right;
Node() : data(""), par(nullptr), left(nullptr), right(nullptr) {}
};
class BST {
public:
Node *v;
BST() { v = nullptr; }
Node *parent() const {
if (v == nullptr)
return nullptr;
return v->par;
}
Node *left() const { return v->left; }
Node *right() const { return v->right; }
bool isRoot() const {
if (v == nullptr)
return false;
return v->par == nullptr;
}
bool isExternal() const {
if (v == nullptr)
return false;
return v->left == nullptr && v->right == nullptr;
}
bool isInternal() const {
if (v == nullptr)
return false;
return v->left != nullptr || v->right != nullptr;
}
string &data() const { return v->data; }
void addNode(const string &data) {
Node *newNode = new Node();
newNode->data = data;
newNode->par = nullptr;
newNode->left = nullptr;
newNode->right = nullptr;
if (isRoot()) {
v = newNode;
return;
} else {
Node *current = v;
while (true) {
if (data < current->data) {
if (current->left == nullptr) {
current->left = newNode;
newNode->par = current;
return;
} else {
current = current->left;
}
} else if (data > current->data) {
if (current->right == nullptr) {
current->right = newNode;
newNode->par = current;
return;
} else {
current = current->right;
}
} else {
delete newNode;
return;
}
}
}
}
void printAncestors(Node *node) {
if (node == nullptr)
return;
cout << node->data << endl;
printAncestors(node->par);
}
void clear(Node *node) {
if (node == nullptr)
return;
clear(node->left);
clear(node->right);
if (node->par != nullptr) {
if (node->par->left == node)
node->par->left = nullptr;
else if (node->par->right == node)
node->par->right = nullptr;
}
delete node;
}
Node *getRoot() const { return v; }
};
int main() {
BST *inputTree = new BST();
BST *outputTree = nullptr;
for (int i = 1; i <= 50; i++) {
string input = "inputs/input." + to_string(i) + ".txt";
string output = "outputs/output." + to_string(i) + ".txt";
ifstream inputFile(input);
if (!inputFile) {
cerr << "Failed to open input file: " << input << endl;
continue;
}
////////////////////////// this part! //////////////////////////
string line;
int lineNumber = 0;
while (getline(inputFile, line)) {
lineNumber++;
cout << lineNumber << endl;
if (lineNumber >= 4) {
cout << "s";
inputTree->addNode(line);
}
}
////////////////////////// this part! //////////////////////////
inputFile.close();
inputTree->printAncestors(inputTree->getRoot());
inputTree->clear(inputTree->getRoot());
}
delete inputTree;
delete outputTree;
return 0;
}
这里是输入文件的一部分
charlotte philip joe
jesse mary sandra
8
gabriel theresa diane
marie raymond joshua
jesse mary sandra
charlotte philip joe
alexis jose shirley
diana anna kyle
susan james janice
joe ethan isabella
我想调用addNode
将字符串添加到BST中,从输入的第4行到它的末尾。
1条答案
按热度按时间ggazkfy81#
“% s”不是输出,而是转储的核心。为什么...
s
未输出,因为它仍在输出缓冲区中。如果你想看到输出,那么输出一个换行符,像这样:现在您将在输出中看到它。
关于核心转储。这是因为你在下面的语句中遵从了一个空指针:
第一次执行时,
current
是nullptr
,因为v
是nullptr
,而isRoot()
返回0。函数isRoot
检查是否存在一个节点,并且该节点是根节点。因为你的树是空的,所以没有这样的节点。但是调用代码显然期望在树为空时进入if
块。因此,您需要检查并纠正此错误。当您使用调试器并在代码中设置断点和检查变量时,很容易检测到此类问题。