在 c 中实现二叉树时出现分段错误

问题描述 投票:0回答:1

我是 c 的新手,但对于一个项目,我正在实现一个二叉树。这是我的函数代码:

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

typedef struct BSTnode{
  int key;
  int subtree_size;
  struct BSTnode* left;
  struct BSTnode* right;
} TreeNode;

TreeNode* newNode(int value){
  TreeNode *node = malloc(sizeof(TreeNode));
  node->key = value;
  node->left = NULL;
  node->right = NULL;
  node->subtree_size = 1;
  return node;
}

TreeNode* insert(TreeNode* root, TreeNode* to_insert){
  if(root == NULL){
    root = newNode(to_insert->key);
  }
  else if(to_insert->key> root->key){
    if(root->right == NULL){
      root->right = to_insert;
      return root;
    }
    else{
      root->right = insert(root->right, to_insert);
    }
  }
  else if(to_insert->key< root->key){
    if(root->left == NULL){
      root->left = to_insert;
      return root;
    }
    root->left = insert(root->left, to_insert);

  }

  root->subtree_size = 1 + (root->left? root->left->subtree_size: 0) + (root->right? root->right->subtree_size: 0);
  return root;
}

int find(TreeNode* root, int value){
  if(root == NULL || root->key == value){
    return root->key;
  }
  else if(value > root->key){
    return find(root->right, value);
  }
  else{
    return find(root->left, value);
  }
}

在我的主函数中,我正在读取一个文件,该文件的每一行都包含一个数字,我必须将其插入到 BST 中。每行以一个字母开头,后跟由空格分隔的数字。

int main (int argc, char* argv[]){
  FILE* input;

  input = fopen(argv[1], "r");

  char oper;
  int num;

  TreeNode* root = NULL;
  
  while(fscanf(input, "%c", &oper) != EOF){
    if(oper == 'i'){
      fscanf(input, " %d\n", &num);
      TreeNode* to_insert = newNode(num);
      insert(root, to_insert);
      //printf("operation: %c, num: %d\n", oper, num);
    }
    if(oper == 'r'){
//do some other thing
    }
  }
  if(root == NULL){
    printf("yes\n");
  }
  printf("size: %d\n", root->subtree_size);
  printf("left size: %d\n", root->left->subtree_size);
  printf("right size: %d\n", root->right->subtree_size);
  fclose(input);
}

运行代码会打印“yes”,然后它给我一个段错误。我看过另一篇关于类似问题的文章,解决方案是更改插入函数以接受根的双指针。这在这里有用吗?如果是的话,它会是什么样子?我不太擅长使用双指针。

编辑1:假设

fscanf()
和输入文件已正确使用和打开。

Edit2:输入文件将如下所示:

i 10
i 20
i 30
i 40
i 50
i 60
i 70
i 80
i 90
i 99
i 15
i 14
i 12
i 25
i 28
i 95
i 35
i 38
i 11
i 23
i 22
c segmentation-fault binary-search-tree
1个回答
0
投票

您的

insert()
函数返回
root
。但你永远不会将返回值分配给任何东西。

您的

main()

TreeNode* root = NULL;

while(fscanf(input, "%c", &oper) != EOF){
  // ...
  insert(root, to_insert);

您的

root
始终保持
NULL

© www.soinside.com 2019 - 2024. All rights reserved.