2012-03-11 22 views
0

私はこの問題で疲れているので、私はいくつかの外部の助けを得るだろうと思った。このプログラムは、従業員と学生を含む人事部の「データベース」を保持しています。各生徒には、ユーザーが挿入して検索できる「書籍」のバイナリツリーがあります。私は学生の名前をとり、その特定の学生に対応する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) 

**帳が必要だと思うし、

答えて

2

*root = newBook 

これ以外の場合は、book_traverseではrootのローカルコピーが変更されます。

+0

ありがとう!それは確かに問題です。しかし、私はまだもっと助けが必要だと思います。 * rootの - >キーにアクセスする方法、または* rootの左右のノードを持つ関数を再帰的に呼び出す方法はありますか?私はそれが* root-> keyと*(root-> right)のように感じますが、それは動作しません。同様に、行512のbook_traverse()への呼び出しはこれでどのように変更されますか? – Vance

+0

(* root) - >キーと(* root) - > rightが動作するはずです。そしておそらくbook_traverse(student-> bookTree、&newBook) –

1

宣言し、

  1. 必要な変数

    を初期化リスト項目
  2. ツリーのxを言うに挿入するデータ項目をお読みください。
  3. nullへの左右のポインタを持つ新しいノードを作成します。
  4. 新しいノードの情報フィールドにデータxを割り当てます。
  5. 新しいノードの(ツリー== NULL) 、ツリー=アドレス他 場合(<ツリーのx - >情報)もし 場合(TREE->左== NULL) その後、TREE->新しい=左ノード 他 ツリー= TREE->左5. 他 繰り返しステップの場合(X> TREE->情報) 場合(TREE->右== NULL) その後、TREE->右=新しいノード他 ツリー=木 - >右 ステップ5を繰り返します。 if(x == tree-> info) "Duplicated data"を印刷して終了します。
  6. 次の挿入には、ステップ5に進みます。

REF:応答のためのhttp://www.programmers-point.blogspot.in

関連する問題