В настоящее время я работаю над проектом базы данных фильмов, используя двоичные деревья поиска. Каждый узел в дереве содержит название фильма, год создания фильма и связанный список, содержащий имена всех участников. Эта информация считывается из TXT файла.
Я уже создал несколько функций, но я ударил. Я пытаюсь сделать функцию, которая позволяет пользователю вводить строку, которая будет первым и последним, а затем пересекать узлы дерева. Если имя актера найдено в связанном списке в узле, функция распечатывает заголовок этого фильма.
Я никогда раньше не использовал STL, поэтому я не знаю, является ли доступ к элементу таким же, как если бы вы вручную создавали список, поэтому у меня возникли проблемы.
Любая помощь будет оценена по достоинству. Вот мой код:
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>
#include <fstream>
#include <list>
using namespace std;
typedef struct treeNode{
int year;
string title;
list<string> actors;
treeNode* left;
treeNode* right;
}* treePtr;
treePtr root = NULL;
treePtr fillTree(treePtr p, int y, string t, list<string> a);
void print_titles(treePtr root);
void print_before_year(treePtr root, int key);
void print_actors_movies(???);
int main(){
ifstream inFile ("movies.txt");
string x;
treePtr root = NULL;
int count = 0;
if(inFile.is_open()){
while(getline (inFile, x)){
if(x == ""){
continue;
}
count++;
int index = x.find_last_of(" ");
string title = x.substr(0, index);
string year = x.substr(index + 2, x.length() - index - 3);
list<string> actor;
int counter = 0;
while(getline(inFile, x)){
if(x == ""){
break;
}
else{
actor.push_back(x);
}
}
root = fillTree(root, atoi(year.c_str()), title, actor);
}
}
int choice;
do{
cout <<"\nWelcome to the Movie Store. Would you like to: \n(1)
See what movies are available? \n(2) Search for an actor? \n(3)
Search for a year? \n(4) Search for a movie? \n(0) Exit the Store" << endl;
cin >> choice;
switch(choice){
case 0:
cout << "Thank you come again." << endl;
break;
case 1:
print_titles(root);
break;
case 2:
case 3:
int year;
cout << "Please enter the year you wish to search for: " << endl;
cin >> year;
cout << endl;
cout << "Films made before " << year << ":" << endl;
print_before_year(root, year);
break;
case 4:
default:
cout << "Try again." << endl;
}
} while(choice != 0);
return 0;
}
treePtr fillTree(treePtr p, int y, string t, list<string> a){
treePtr n = new treeNode;
n->year = y;
n->title = t;
n->actors = a;
n->left = NULL;
n->right = NULL;
if(p == NULL){
p = n;
}
else{
treePtr prev = p;
treePtr curr = p;
while(curr != NULL){
if(curr->year > y){
prev = curr;
curr = curr->left;
}
else{
prev = curr;
curr = curr->right;
}
}
if(prev->year > y){
prev->left = n;
}
else{
prev->right = n;
}
}
return p;
}
void print_titles(treePtr root){
if(root == NULL) return;
if(root->left) print_titles(root->left);
cout<<root->title<<endl;
if(root->right) print_titles(root->right);
}
void print_before_year(treePtr root, int key){
if(root == NULL) return;
if(root->left) print_before_year(root->left, key);
if(root->year < key){
cout << root->title << endl;
}
else return;
if(root->right) print_before_year(root->right, key);
}
void print_actors_movies(???){
}
И вот файл.txt на всякий случай вам нужен: http://www2.cs.uidaho.edu/~bruceb/cs121/Assignments/movies.txt
Как насчет простого поиска по ширине и std::find()
?
bool printTitleForActor(Node *root, const std::string &actor)
{
if (!root)
return false;
if (std::find(root->actors.begin(), root->actors.end(), actor) != root->actors.end()) {
std::cout << root->title << std::endl;
return true; // only if you want to terminate upon first find
}
return printTitleForActor(root->left) || printTitleForActor(root->right);
}
return true;
и добавив его как результат или включил результат с дочерними поисками, в случае, если это было намерение. Я бы не стал менять функцию, просто записку для ОП.
Если у вас есть treeNode
и вы хотите найти имя actor
, вы можете просто использовать
bool hasActor(treeNode const* node, std::string const& name) {
return node->actors.end()
!= std::find(node->actors.begin(), node->actors.end(), name);
}
Функция std::find()
сравнивает значение, идентифицированное каждой позицией в диапазоне между begin
и end
до value
переданного как последний аргумент, с использованием значения *it == value
. Если это выражение возвращает true
оно возвращает it
. Если нет позиции, для которой это выражение возвращает true
, оно возвращает end
.