Нужна помощь в просмотре списка STL

0

В настоящее время я работаю над проектом базы данных фильмов, используя двоичные деревья поиска. Каждый узел в дереве содержит название фильма, год создания фильма и связанный список, содержащий имена всех участников. Эта информация считывается из 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

  • 0
    Ответ на самом деле все еще Boost MultiIndex. :-)
  • 0
    @JerryCoffin, почему не JQuery?
Показать ещё 11 комментариев
Теги:
stl

2 ответа

1

Как насчет простого поиска по ширине и 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);
}
  • 0
    Я думаю, что он хочет все фильмы, в которых актер снимается; не только первый в дереве. Тривиально изменить, просто удалив жесткий return true; и добавив его как результат или включил результат с дочерними поисками, в случае, если это было намерение. Я бы не стал менять функцию, просто записку для ОП.
  • 0
    @WhozCraig Спасибо за предложение! Теперь хорошо? :)
Показать ещё 1 комментарий
1

Если у вас есть 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню