2016-10-12 7 views
0
void MovieTree::addMovieNode(int ranking, std::string title, int releaseYear, int quantity) 
    { 

     std::cout<<"Adding root"<<std::endl; 
     if(root == NULL) 
     { 
      std::cout<<"enter root"<<std::endl; 
      MovieNode* root = new MovieNode;  
      root->ranking = ranking; 
      root->title = title; 
      root->year = releaseYear; 
      root->quantity = quantity; 
      root->leftChild = root->rightChild = NULL; 
      std::cout<<"Item added"<<std::endl; 
      std::cout<<title<<std::endl; 

     } 

     else if(root) 
     { 
      std::cout<<"skipped root"<<std::endl; 
      MovieNode* newNode = new MovieNode; 
      newNode->ranking = ranking; 
      newNode->title = title; 
      newNode->year = releaseYear; 
      newNode->quantity = quantity; 


      MovieNode* currentNode = root; 
      MovieNode* previousNode = currentNode; 

      while(currentNode) 
      { 
       previousNode = currentNode; 

       if(currentNode->title.compare(title) > 0) 
       { 
        currentNode = currentNode->rightChild; 
       } 
       else if(currentNode->title.compare(title) < 0) 
       { 
        currentNode = currentNode->leftChild; 
       } 

      } 

      if(previousNode->title.compare(title) > 0) 
      { 
       previousNode->rightChild = newNode; 
      } 
      else if(previousNode->title.compare(title) <0) 
      { 
       previousNode->leftChild = newNode; 
      } 
     } 

    } 

Это код для двоичного дерева поиска. У меня возникли проблемы с моей функцией «addMovieNode». Он никогда не входит в начальный случай, когда я инициализирую первый узел BST. Я подозреваю, что это связано с моим непониманием о том, как передать первый конструктор в моем драйвере «main.cpp».Передача базового конструктора из класса?

#include "MovieTree.hpp" 
#include <iostream> 

MovieTree::MovieTree() 
{ 
    MovieNode* root = NULL; 

} 

void MovieTree::printMovieInventory() 
{ 
    printMovieInventory(root); 
} 
void MovieTree::printMovieInventory(MovieNode* node) 
{ 
    if(node) 
    { 
     while(node->rightChild && node->leftChild) 
     { 
      std::cout<<"Movie:"<<node->title<<" "<<node->quantity<<std::endl; 
      if(node->rightChild) 
      { 
       printMovieInventory(node->rightChild); 
      } 
      if(node->leftChild) 
      { 
       printMovieInventory(node->leftChild); 
      } 
     } 
    } 
    else 
    { 
     std::cout<<"No movies in list!"<<std::endl; 
    } 
} 

void MovieTree::addMovieNode(int ranking, std::string title, int releaseYear, int quantity) 
{ 

    std::cout<<"Adding root"<<std::endl; 
    if(root == NULL) 
    { 
     std::cout<<"enter root"<<std::endl; 
     MovieNode* root = new MovieNode;  
     root->ranking = ranking; 
     root->title = title; 
     root->year = releaseYear; 
     root->quantity = quantity; 
     root->leftChild = root->rightChild = NULL; 
     std::cout<<"Item added"<<std::endl; 
     std::cout<<title<<std::endl; 

    } 

    else if(root) 
    { 
     std::cout<<"skipped root"<<std::endl; 
     MovieNode* newNode = new MovieNode; 
     newNode->ranking = ranking; 
     newNode->title = title; 
     newNode->year = releaseYear; 
     newNode->quantity = quantity; 


     MovieNode* currentNode = root; 
     MovieNode* previousNode = currentNode; 

     while(currentNode) 
     { 
      previousNode = currentNode; 

      if(currentNode->title.compare(title) > 0) 
      { 
       currentNode = currentNode->rightChild; 
      } 
      else if(currentNode->title.compare(title) < 0) 
      { 
       currentNode = currentNode->leftChild; 
      } 

     } 

     if(previousNode->title.compare(title) > 0) 
     { 
      previousNode->rightChild = newNode; 
     } 
     else if(previousNode->title.compare(title) <0) 
     { 
      previousNode->leftChild = newNode; 
     } 
    } 

} 


void MovieTree::findMovie(std::string title) 
{ 
    if(search(title)) 
    { 
     MovieNode* foundMovie = search(title); 
     std::cout<< "Movie Info:"<<std::endl; 
     std::cout<< "==========="<<std::endl; 
     std::cout<< "Ranking:" <<foundMovie->ranking<<std::endl; 
     std::cout<< "Title:"  <<foundMovie->title<<std::endl; 
     std::cout<< "Year:"  <<foundMovie->year<<std::endl; 
     std::cout<< "Quantity:" <<foundMovie->quantity<<std::endl; 
    } 
    else 
    {std::cout<<"Movie not found."<<std::endl;} 
} 

MovieNode* MovieTree::search(std::string title) 
{ 
    if(root) 
    { 
     MovieNode* temp = root; 
     while(temp && temp->rightChild && temp->leftChild) 
     { 
      if(!temp) 
      { 
       if(temp->title == title) 
       { 
        return temp; 
       } 
       else if(temp->title.compare(title) > 0) 
       { 
        temp = temp->rightChild; 
       } 
       else if(temp->title.compare(title) < 0) 
       { 
        temp = temp->leftChild; 
       } 
      } 

     } 
    } 
    else 
    { 
     std::cout<<"Root does not exist! Movie not found!\n"; 
    } 
} 

void MovieTree::rentMovie(std::string title) 
{ 
    if(search(title)) 
    { 
     MovieNode* foundMovie = search(title); 

     if(foundMovie->quantity > 0) 
     { 
      foundMovie->quantity--; 
      std::cout<<"Movie has been rented."<<std::endl; 
      std::cout<<"Movie Info:"<<std::endl; 
      std::cout<<"==========="<<std::endl; 
      std::cout<<"Ranking:"<<foundMovie->ranking<<std::endl; 
      std::cout<<"Title:"<<foundMovie->title<<std::endl; 
      std::cout<<"Year:"<<foundMovie->year<<std::endl; 
      std::cout<<"Quantity:"<<foundMovie->quantity<<std::endl; 
     } 
     else if(foundMovie->quantity == 0) 
     { 
      std::cout<<"Movie out of stock"<<std::endl; 
     } 
    } 
    else if(!search(title)) 
    { 
     std::cout<<"Movie not found."<<std::endl; 
    } 
} 

Ссылка в main.cpp выглядит следующим образом:

MovieTree movieTree; 

MovieTree(); 


movieTree.addMovieNode(12, "The good and bad", 1870, 12); 
cout<<"Added"<<endl; 

Я получаю ошибку сегментации после значения передаются через функцию и она никогда не входит заявление первоначальный если (корень)

ответ

1

В функции addMovieNode вы объявить локальную переменную root:

MovieNode* root = new MovieNode; 

Это , скрывающий переменную root, которая является членом класса.

Исправление удалить объявление, так что член класса модифицирована вместо:

root = new MovieNode; 

То же самое происходит в конструкторе:

MovieTree::MovieTree() 
{ 
    MovieNode* root = NULL; 
} 

Это должно быть изменено на просто root = NULL; также.

+0

@Jonathan_Potter Спасибо! – Whatamia

Смежные вопросы