Блок указателя ADT LinkedList - PullRequest
0 голосов
/ 24 ноября 2018

Я реализую несколько LinkedList ADT для моего класса compsci, и я сталкиваюсь с одной и той же проблемой на каждом из них.Код, приведенный ниже, представляет собой двоичное дерево ADT.Компилятор теряется при попытке ввода данных в новые узлы.Код компилируется без ошибок, но компилятор ничего не возвращает, я думаю, что он застрял, пытаясь найти указатель.Я пришел с Java, поэтому я все еще работаю над указателями.

#include <iostream>
struct TreeNode {
  //represents a single node in a binary tree of int data
  int data; //immediate data
  TreeNode *left; //left subtree
  TreeNode *right; //right subtree
  TreeNode(int in);
};

TreeNode::TreeNode(int in) {
  data = in;
  left = NULL;
  right = NULL;
}

Компилятор не может найти указатель, на который ссылаются эти две функции добавления.

void addLeft(TreeNode *root, int newData) {
  TreeNode *new_node;
  new_node->data = newData;
  root->left = new_node;
}
void addRight(TreeNode *root, int newData) {
  TreeNode *new_node;
  new_node->data = newData;
  root->right = new_node;
}
//counts nodes in binary tree from designated root point
int countNodes(TreeNode *root) {
  if (!root) {
    return 0; //empty tree
  }
  int count = 1;
  count += countNodes(root->left); //adds left subtree nodes
  count += countNodes(root->right); //adds right subtree countNodes
  return count;
}
void preorderPrint(TreeNode *root) { //root first, then left, then right
  if (root) {
    std::cout << root->data << " ";
    preorderPrint(root->left);
    preorderPrint(root->right);
  }
}

void postorderPrint(TreeNode *root) { //left first, then right, then root
  if (root) {
    postorderPrint(root->left);
    postorderPrint(root->right);
    std::cout << root->data << " ";
  }
}
void inorderPrint(TreeNode *root) { //left first, then root, then right
  if (root) {
    inorderPrint(root->left);
    std::cout << root->data << " ";
    inorderPrint(root->right);
  }
}
bool tree_contains(TreeNode *root, int item) {
  if (!root) {
    return false; //if the root doesn't exist, the tree doesn't exist
  }
  else if (root->data = item) {
    return true; //item is found in the root node
  }
  else if (root->data > item) {

  }
}

int main() {
  TreeNode *root;
  root->data = 5;
  addLeft(root, 4);
  addRight(root,9);
  inorderPrint(root);
  return 0;
}

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Указатель - это просто переменная, которая содержит адрес объекта в памяти.Когда вы определяете указатель, например

int *foo;

, вы не инициализируете его, поэтому его значение является неопределенным.Это означает, что он не содержит действительного значения указателя, которое можно использовать для доступа к объекту в памяти.Чтобы на самом деле сделать указатель указать на что-то, вам нужно присвоить ему адрес:

int bar;
inf *foo = &bar;

Теперь foo содержит адрес bar, и вы можете разыменовать fooнаписать в bar:

*foo = 42;
// bar is now 42

В вашем коде

TreeNode *root;
root->data = 5;

Вы пытаетесь разыменовать (root->data - просто синтаксический сахар для (*root).data) указатель root, который не был инициализирован или ему не присвоено правильное значение указателя.

Поскольку вы хотите создать динамическую структуру данных, которая увеличивается по требованию, вы хотите выделить память во время выполнения.Вы можете сделать это, используя оператор new:

TreeNode *root = new TreeNode;           // allocates an object of the type                                             
                                         // TreeNode
root->data = 5;  // is now safe.

Но так как вы предоставляете конструктор для TreeNode, который принимает int, вы можете написать:

TreeNode *root = new TreeNode{ 5 };

То же самое относится и ко многим другим местам в вашем коде.

Пожалуйста, помните, что динамически выделенная память должна быть освобождена, когда она больше не нужна:

`delete root;`
0 голосов
/ 24 ноября 2018

Ваш root не инициализирован.В настоящее время он имеет неопределенное значение.Должно быть:

TreeNode *root = new TreeNode(5);
... // Do whatever you want
// delete root and everything else.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...