簡體   English   中英

c二叉搜索樹中的分段錯誤11

[英]segmentation fault 11 in c binary search tree

嘗試打印我的二叉樹中的節點時出現分段錯誤。 第三個節點似乎有問題。 我已經搜索了谷歌和堆棧溢出了幾個小時,但我不明白是什么問題。 我正在嘗試自學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個被打印)。

您的初始化不完整

  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;

因為您沒有初始化結構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類型變量的初始化過程中錯過為left指針和right指針分配NULL的機會,並且由於發生錯誤的可能性會大大降低。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM