Вставить узел в двоичное дерево поиска / связанный список? - PullRequest
0 голосов
/ 11 марта 2012

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

Я получаю сообщение об ошибке: "Необработанное исключение в 0x013c53a0 в Homework4.exe: 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);
}

Ответы [ 2 ]

2 голосов
/ 11 марта 2012

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

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

и затем везде используйте * root вместо root, например

*root = newBook

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

1 голос
/ 07 сентября 2013

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...