2012-03-11 7 views
0

Хорошо, я до этого исчерпал эту проблему, поэтому решил, что я получу внешнюю помощь. Программа содержит «базу данных» персонала, которая включает сотрудников и студентов. Каждый ученик имеет двоичное дерево «книг», которое пользователь может вставить и выполнить поиск. Мне нужно взять имя ученика, найти узел Personnel, который соответствует этому конкретному ученику, и добавить книгу в bookTree этого ученика.Вставка узла в двоичное дерево поиска/связанный список?

Сообщение об ошибке я получаю «Необработанное исключение в 0x013c53a0 в Homework4.exe: 0xC0000005: нарушение прав доступа чтения расположение 0xcccccd1c.», который, как я полагаю, означает, что я где-то испортил указатель. В callstack отображается строка 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); 
} 

ответ

2

Я думаю, что вам нужна книга **

void book_traverse(Book** root, Book* newBook) 

, а затем использовать * корень вместо корня везде, например,

*root = newBook 

В противном случае в book_traverse вы изменяете локальную копию root.

+0

Спасибо за ответ! Это действительно проблема. Однако, я думаю, мне все еще нужна дополнительная помощь. Как получить доступ к ключу -> от корня или рекурсивно вызвать функцию с левым и правым узлами корня? Я чувствую, что это должен быть ключ root-> и * (root-> right), но это не работает. Точно так же, как сменить это обращение к book_traverse() на строке 512? – Vance

+0

(* корень) -> ключ и (* корень) -> правый должен работать. И это, вероятно, будет book_traverse (student-> bookTree, & newBook) –

1

декларировать и инициализировать необходимые переменные

  1. товар
  2. Список Читайте элемент данных должен быть вставлен в дерево сказать х.
  3. Создайте новый узел, указав его левый и правый указатели на нуль.
  4. Назначьте данные x информационному полю нового узла.
  5. Если (дерево == NULL) то дерево = адрес нового узла еще если (х < дерево -> Информация) если (tree-> слева == NULL) затем tree-> левый = новый узел еще дерево = tree-> левый повторите шаг 5. еще если (х> tree-> Информация) если (tree-> правый == NULL) затем tree-> вправо = новый узел еще дерево = дерево -> right повторить шаг 5 else if (x == tree-> info) печать "Дублированные данные" и выход
  6. Для следующей вставки, перейдите к шагу 5.

исх: http://www.programmers-point.blogspot.in

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