【问题标题】:Binary tree produce Segmentation Fault二叉树产生分段错误
【发布时间】:2019-09-28 02:16:07
【问题描述】:

我是 C 新手,想从编写一个简单的二叉树开始。 push 和 traverse 函数都存在问题,但我花了两天时间弄清楚程序。当我编译并执行程序时,它显示分段错误。代码如下,任何帮助将不胜感激。谢谢

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

typedef struct Node
{
  struct Node* right;
  struct Node* left;
  int* value;
} Node;

Node* init()
{
  Node* t = (Node*) malloc(sizeof(Node));
  t->left = NULL;
  t->right = NULL;
  t->value = NULL;
  return t;
}

int traverse(Node* tree)
{
  printf("value : %d\n", *(tree->value));
  if (tree->left != NULL) {
    traverse(tree->left);
  } else if (tree->right != NULL){
    traverse(tree->right);
  }
}

void push(Node* n, int val)
{
  if (n->value == NULL)
  {
    *(n->value) = val;
  } else if (n->left == NULL && val < *(n->value)) {
    n->left = init();
    push(n->left, val);
  } else if (n->right == NULL && val > *(n->value)) {
    n->right = init();
    push(n->right, val);
  }
} 

int main(int argc, char const *argv[])
{
  srand(time(NULL));
  Node* tree = init();

  for (unsigned int i = 0; i < 20; ++i)
  {
    int val = rand() % 10;
    push(tree, val);
    printf("%d\n", val);
  }

  traverse(tree);
  printf("%s\n", "End Of Program!");
  return 0;
}

【问题讨论】:

  • int* value; 是一个值得商榷的选择,除非这个链表打算保存ints 的动态数组。 int value; 更可能是您需要的。
  • traverse 函数是否应该返回int?或者只是void 可能会更好
  • 应该可以,但出于调试目的,我没有打扰
  • btw 是 NULL C 中的指针
  • NULL 是一个空指针常量。从技术上讲,它可能是0((void *) 0) 或相当于其中之一的东西。你不应该依赖它具有特定的形式。

标签: c segmentation-fault binary-tree


【解决方案1】:

您永远不会为价值分配空间。将定义更改为整数。

typedef struct Node
{
  struct Node* right;
  struct Node* left;
  int value;
} Node;

然后

n->value = val;

printf("value : %d\n", tree->value);

【讨论】:

  • 但是我如何进行比较以查看它是否为空值
  • @Syed.bcc 在这种情况下,您不会将其与空值进行比较。它应该默认为超出您希望成为树的有效值范围的值;即你想要正数,默认为 -1
【解决方案2】:

Node 类型的value 成员永远不会设置为NULL 以外的任何值。由于它的值是一个空指针,所以使用*(n-&gt;value) = val;这个语句是不合适的;它试图取消引用空指针。

如果您希望value 指向int,则必须为int 分配内存并将value 设置为该内存的地址。如果您希望 value 成为 int,则必须更改其声明以及使用它的代码。

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多