LinkedList ADT指针块

时间:2018-11-24 05:49:03

标签: c++ list pointers tree nodes

我正在为compsci类实现许多LinkedList ADT,并且每一个都遇到相同的问题。下面列出的代码是二进制树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 :(得分:1)

您的root未初始化。当前它有一个未定义的值。应该是:

TreeNode *root = new TreeNode(5);
... // Do whatever you want
// delete root and everything else.

答案 1 :(得分:0)

指针只是在内存中保存对象地址的变量。当您定义类似

的指针时
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 };