私はこの問題で疲れているので、私はいくつかの外部の助けを得るだろうと思った。このプログラムは、従業員と学生を含む人事部の「データベース」を保持しています。各生徒には、ユーザーが挿入して検索できる「書籍」のバイナリツリーがあります。私は学生の名前をとり、その特定の学生に対応するPersonnelノードを見つけて、その学生のbookTreeに本を追加する必要があります。バイナリ検索ツリー/リンクリストにノードを挿入しますか?
私は取得していますエラーメッセージが 「Homework4.exeで0x013c53a0で未処理の例外:0xc0000005で:アクセス違反読み取り場所0xcccccd1c」でありますこれは、どこかでポインタをつぶしていると思います。コールスタックは問題のメーカーとして512行目(したがってbook_traverse())を示します。 これは私がこれまでに持っていたものです(不要なコードを省略しています):事前に感謝!
class PersonnelNode { // This is a container class
private:
Personnel *pNode; // It contains a Personnel class
PersonnelNode *pNext; // pointer used to form a linked list
public:
void setNode(Personnel *pNode) { this->pNode = pNode; }
void setNext(PersonnelNode *pNext) { this->pNext = pNext; }
Personnel* getNode() { return pNode; }
PersonnelNode* getNext() { return pNext; }
PersonnelNode() { // constructor
pNode = NULL;
pNext = NULL;
}
} *head = NULL; // declare a global pointer variable head
....
struct Book {
char title[75];
char url[75];
char key;
Book *left;
Book *right;
Book(char *title, char *url) { // Constructor
strcpy_s(this->title, title);
strcpy_s(this->url, url);
key = title[0];
left = NULL;
right = NULL;
}
};
....
class Student : public Personnel { //inherit from Personnel
... (omitted the unnecessary code)
Book *bookTree;
//BookTree = NULL in constructor
}
....
int insert_book() {
PersonnelNode *temp, *prev;
Personnel *person;
Student *student;
Book *newBook;
char title[75], url[75], sName[75];
temp = head;
cout << endl << "@Inserting book node.........." << endl;
cout << "Enter the student name: ";
cin.ignore();
cin.getline(sName, 75);
//*****My error is probably below here?
while (temp != NULL) {
person = temp->getNode();
if (sName != person->getName()) {
prev = temp;
temp = temp->getNext();
}
else {
student = (Student *) person;
}
}
cout << "Enter the book title: ";
cin.getline(title, 75);
cout << "Enter the URL: ";
cin.getline(url, 75);
newBook = new Book(title, url);
book_traverse(student->bookTree, newBook); //LINE 512
return 0;
}
....
//***Recursive function to insert book
void book_traverse(Book* root, Book* newBook) { //Is this right?
if (root == NULL) //I tried Book* &root, but then
root = newBook; //the compiler doesn't like root==NULL
else if (newBook->key < root->key)
book_traverse(root->left, newBook);
else
book_traverse(root->right, newBook);
}
私は、例えば、どこにでも代わりにルートの*ルートを使用し、あなたが
void book_traverse(Book** root, Book* newBook)
**帳が必要だと思うし、
ありがとう!それは確かに問題です。しかし、私はまだもっと助けが必要だと思います。 * rootの - >キーにアクセスする方法、または* rootの左右のノードを持つ関数を再帰的に呼び出す方法はありますか?私はそれが* root-> keyと*(root-> right)のように感じますが、それは動作しません。同様に、行512のbook_traverse()への呼び出しはこれでどのように変更されますか? – Vance
(* root) - >キーと(* root) - > rightが動作するはずです。そしておそらくbook_traverse(student-> bookTree、&newBook) –