我有一个实验室任务,我在过去几周一直在工作,我很困难,迫切需要帮助,因为这将是最终项目的50%左右。 分配是用C ++创建二进制搜索树。我们必须从“独立宣言”中读到二进制搜索树。我的搜索和插入方法“正常工作”意味着他们没有抛出任何错误。我遇到的问题是显示BST以确定一切是否正常工作。显示方法应由重载运算符>>调用。显示树。 我一直遇到的错误是:
“错误C3867:'BST :: display':缺少函数调用 参数列表;使用'& BST :: display'创建指针 构件“
另一个是
“错误C2679:二进制'<<' :找不到哪个操作员需要右手 “重载函数”类型的操作数(或者没有可接受的 转化率)。“
上次重建程序时,它显示“ItelliSense:指向绑定函数的指针只能用于调用函数。”
#include "stdafx.h"
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
template <typename T>
class BST{
private:
struct node {
T data;
struct node* left;
struct node* right;
};
node* root;
public:
BST()
{
root = NULL;
}
bool isEmpty() const { return root == NULL; }
~BST();
template <typename T>
void insert(T d)
{
node* t = new node;
node* parent;
t->data = d;
t->left = NULL;
t->right = NULL;
parent = NULL;
if (isEmpty()) root = t;
else {
node* current;
current = root;
while (current)
{
parent = current;
if (t->data > current->data) current = current->right;
else current = current->left;
}
if (t->data < parent->data)
parent->left = t;
else
parent->right = t;
}
}
template<typename T>
bool search(T d)
{
if (root == NULL)
return false;
else if (d == root->item) {
return true;
}
else if (d < root->item) {
return search(root->left, d);
}
else {
return search(root->right, d);
}
}
template<typename T>
void display(node *p, std::ostream& os)
{
if (p != NULL)
{
if (p->left) display(p->left);
os << " " << p->data << " ";
if (p->right) display(p->right);
}
}
template<typename T> friend std::ostream& operator<<(std::ostream& os, const BST<T>& obj)
{
obj.display(os, obj.root);
}
};
int main( )
{
BST<string> s;
ifstream inFile;
string word, tmp;
string filename = "Independence.txt";
ifstream fstr(filename.c_str());
while (inFile >> word) {
s.insert(word);
}
inFile.close();
cout << s << std::endl;
cout << "Search for: ";
cin.ignore(1);
cin >> tmp;
s.search(tmp);
return 0;
};
答案 0 :(得分:0)
template<typename T>
void display(node *p)
这将带有一个带有节点指针的参数。
然后你用以下方式调用它:
BST<string> s;
cout << s.display << endl;
但是你实际上并没有在这里传递任何参数。然后编译器抱怨它无法弄清楚如何调用该函数。因为该函数的返回类型为void
,所以无法确定如何打印它,因为您实际上没有为cout
返回任何内容进行打印。在你继续前进之前,你会想要解决这两个问题,因为你说它是一项任务,我将让你知道如何做到这一点:)。
答案 1 :(得分:0)
您的代码似乎存在许多问题。我怀疑display
和search
不应单独模板化 - 这实际上是模板类中的模板成员函数,我不认为这是您的意图。此外,搜索功能引用node::item
,但节点类型的声明具有node::data
。最后,BST::display
被写成一个void函数,它以一种可以被声明为静态的方式获取节点,但是你的用法就好像你希望它像成员函数一样工作。它不会返回任何内容,因此它无法传递给iostream :: operator&lt;&lt;。更好的方法是让显示将iostream
作为输入,然后将其称为root->display(cout)
或display(cout, root)
,具体取决于您是希望它是成员函数还是静态函数。
答案 2 :(得分:0)
你有几个概念错误, display方法返回void,因此您无法将其传递给期望显示内容的cout。 因此,您可以轻松更改一个名为display_tree的新方法,如此
void display_tree()
{
display(root);
}
并且在您的主要部分只调用方法
s.display_tree();
不喜欢这个
cout << s.display << std::endl; //this is wrong cause this is not even calling a method
另一种选择是覆盖&lt;&lt;运算符,但是像这样编辑你的diplay方法
template<typename T> void display(node *p, std::ostream& os)
{
if (p != NULL)
{
if (p->left) display(p->left);
os << " " << p->data << " ";
if (p->right) display(p->right);
}
}
然后在课外
template<typename T> friend std::ostream& operator<<(std::ostream& os, const BST<T>& obj)
{
obj.display(obj.root);
}
并像你这样在你的程序中调用它
cout << s << std::endl;
为了使其工作,T需要具有运算符&lt;&lt;重载(在你的情况下是字符串的情况)
尝试使用此代码 - 新版本编译
void display(node *p, std::ostream& os) const
{
if (p != NULL)
{
if (p->left) display(p->left,os);
os << " " << p->data << " ";
if (p->right) display(p->right,os);
}
}
template<typename T> friend std::ostream& operator<<(std::ostream& os, const BST<T>& obj)
{
obj.display(obj.root,os);
return os;
}
答案 3 :(得分:0)
以下是您的代码编译并修复了搜索
#include "stdafx.h"
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
template <typename T>
class BST{
private:
struct node {
T data;
struct node* left;
struct node* right;
};
node* root;
template<typename T> bool search(node* p, T d)
{
if (!p) {
return false;
}
if (d == p->data) {
return true;
}
else if (d < p->data) {
return search(root->left, d);
}
else {
return search(root->right, d);
}
}
public:
BST()
{
root = NULL;
}
bool isEmpty() const { return root == NULL; }
~BST();
template <typename T>
void insert(T d)
{
node* t = new node;
node* parent;
t->data = d;
t->left = NULL;
t->right = NULL;
parent = NULL;
if (isEmpty()) root = t;
else {
node* current;
current = root;
while (current)
{
parent = current;
if (t->data > current->data) current = current->right;
else current = current->left;
}
if (t->data < parent->data)
parent->left = t;
else
parent->right = t;
}
}
template<typename T> bool search(T d)
{
if (root == NULL)
return false;
else if (d == root->data) {
return true;
}
else if (d < root->data) {
return search(root->left, d);
}
else {
return search(root->right, d);
}
}
void display(node *p, std::ostream& os) const
{
if (p != NULL)
{
if (p->left) display(p->left,os);
os << " " << p->data << " ";
if (p->right) display(p->right,os);
}
}
template<typename T> friend std::ostream& operator<<(std::ostream& os, const BST<T>& obj)
{
obj.display(obj.root,os);
return os;
}
};
int main()
{
BST<string> s;
ifstream inFile;
string word, tmp;
string filename = "Independence.txt";
ifstream fstr(filename.c_str());
while (inFile >> word) {
s.insert(word);
}
inFile.close();
cout << s << std::endl;
cout << "Search for: ";
cin.ignore(1);
cin >> tmp;
s.search(tmp);
return 0;
};