【问题标题】:segmentation fault 11 in c binary search treec二叉搜索树中的分段错误11
【发布时间】:2017-11-04 06:38:04
【问题描述】:

尝试打印二叉树中的节点时出现分段错误。这似乎是第三个节点的问题。我已经搜索了几个小时的谷歌和堆栈溢出,但我不明白问题是什么。我正在尝试用 C 语言自学数据结构,而且我还是个新手,所以我可能会以一种不受欢迎的方式做某事。

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
  int data;
  struct node *left;
  struct node *right;
} Node;

typedef struct
{
  Node *root;
} BinarySearchTree;

void printInOrder(Node *);
void addNode(Node *, Node *);

int main (void)
{
  BinarySearchTree tree;
  BinarySearchTree *tree_ptr = &tree; 
  Node n1, n2, n3;

  n1.data = 1;
  n2.data = 2;
  n3.data = 3;

  Node *n1_ptr = &n1;
  Node *n2_ptr = &n2;
  Node *n3_ptr = &n3;

  tree_ptr->root = n1_ptr;

  addNode(tree_ptr->root, n2_ptr);
  addNode(tree_ptr->root, n3_ptr);
  printInOrder(tree_ptr->root);
}

void printInOrder(Node *root)
{
  if (root == NULL)
  {
    return;
  } else
  {
    printInOrder(root->left);
    printf("%i\n", root->data);
    printInOrder(root->right);
  }
}

void addNode(Node *root, Node *node)
{
  if (node->data < root->data)
  {
    if (root->left == NULL)
    {
      root->left = node;
    } else
    {
      addNode(root->left, node);
    }
  } 

  else if (node->data > root->data)
  {
    if (root->right == NULL)
    {
      root->right = node;
    } else
    {
      addNode(root->right, node);
    }
  }
}

输出:

1
2
Segmentation fault: 11

除了第三个节点外,似乎没有任何问题。如果我注释掉添加第二个节点的行,我会得到相同的错误(显然只打印了 1 个)。

【问题讨论】:

  • 你在哪里初始化 full Node 结构?我没有看到您将他们的 leftright 指针设置在任何地方。
  • 如果在add_node函数中node-&gt;data == root-&gt;data会发生什么?
  • 我在第一个结构上做错了吗?或者你指的是我在 addNode 函数中设置它们的时候?很抱歉,我对 C 很陌生,并不完全理解这个问题。
  • 这种情况还没有发生任何事情。在弄清楚如何将节点正确添加到树后,我将为此编写功能。

标签: c segmentation-fault binary-search-tree


【解决方案1】:

你的初始化不完整

  n1.data = 1;
  n2.data = 2;
  n3.data = 3;

也应该设置指针

  n1.data = 1;
  n1.left = NULL;
  n1.right = NULL;

  n2.data = 2;
  n2.left = NULL;
  n2.right = NULL;

  n3.data = 3;
  n3.left = NULL;
  n3.right = NULL;

【讨论】:

  • 是否有理由不必为 n1 和 n2 执行此操作?分段错误仅发生在第三个节点(n3)。
  • @pariscraigm - 你应该为所有人做这件事。使用未初始化的变量(指针变量)可能会导致崩溃,但 not 总是会导致崩溃。唯一安全的事情是确保在使用前进行初始化 - 始终如此。
【解决方案2】:

出现问题是因为您没有初始化结构 Node 类型变量的所有成员。

我建议,您应该编写一个函数来初始化Node 类型变量,如下所示:

void init_node(Node * nodeptr, int data)
{
        nodeptr->data = data;
        nodeptr->left = NULL;
        nodeptr->right = NULL;
}

在您的main()(或从您想要初始化的任何地方)中,您可以简单地执行以下操作:

  init_node(&n1, 1);
  init_node(&n2, 2);
  init_node(&n3, 3);

这样,在Node类型变量的初始化过程中,您将永远不会错过将NULL分配给leftright的指针,并且因此而发生错误的机会将大大降低。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多