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;
값이 함수를 통해 전달 된 후 분할 오류가 발생하고 초기 if (root) 문을 입력하지 않습니다.
에서 addMovieNode
기능을 로컬 변수를 선언하고 있습니다 root
:
MovieNode* root = new MovieNode;
이것은 클래스의 멤버 인 변수 를 숨기는 것 root
입니다.
수정 사항은 선언을 제거하여 클래스 멤버가 대신 수정되도록하는 것입니다.
root = new MovieNode;
생성자에서도 똑같은 일이 발생합니다.
MovieTree::MovieTree()
{
MovieNode* root = NULL;
}
그것도 간단하게 변경해야합니다 root = NULL;
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다