【问题标题】:Segmentation fault in binary search tree while searching for minimum搜索最小值时二叉搜索树中的分段错误
【发布时间】:2017-09-06 02:01:29
【问题描述】:

所以我正在学习 C 中的数据结构,而二叉搜索树让我很难过,我运行 gdb 来查看 seg 错误在哪一行以及它在第 77 行(在代码中标记)。我似乎不明白为什么会这样,这是我的代码,提前致谢:

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


typedef struct node{
    int data;
    struct node* left;
    struct node* right; 
} node;
node* getNewNode();
node* insert();
bool searchTree();  
int getMin();


int main(int argc, char const *argv[]){
    srand(time(NULL));
    int random;
    node* root;
    int var;
    printf("Genereting tree with random values...\n");//Adding random numbers
    for(int i=1;i<15;i++){
        random = rand();
        insert(root, random);
        printf("%d\n", random);
    }
    printf("Last value added: %d\n", random);

    /*
    printf("Enter number to search: \n");
    scanf(" %d", &var);
    printf("%s\n", searchTree(root, var) ? "true": "false");
    */
    printf("min: %d\n", getMin(root)); //Printing min value

    return 0;
}
node* getNewNode(int data){
    node* newNode = (node*) malloc(sizeof(node));

    newNode->data = data;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}
node* insert(node* root, int data){

    if(root == NULL){
        root = getNewNode(data);
        return root;
    }
    else if(data <= root->data){
        root->left = insert(root->left, data);
    }
    else{
        root->right = insert(root->right, data);
    }
    return root;
    }
bool searchTree(node* root, int data){

    if(root == NULL)
        return false;

    else if(root-> data == data)
        return true;

    else if(data <= root->data)
        return searchTree(root->left, data);
    else
        return searchTree(root->right, data);
}

int getMin(node* root){
    if(root->left == NULL){     //Here is where the error is
        return root->data;
    }

    return getMin(root->left);


}

【问题讨论】:

  • root 本身是否为空? (只是猜测)
  • 请阅读并遵循“How to Debug Small Programs”中的建议。您可能还会发现valgrind 很有帮助; bug 很可能不在 crash 发生的那一行。
  • 还请注意,对于这样一个需要输入的程序,您需要在崩溃之前告诉我们确切您输入的内容,否则我们可能无法重现问题。
  • 请说明root的值在您的代码中的初始化位置
  • 1) node* root; --> node* root = NULL; 2) insert(root, random); --> root = insert(root, random);

标签: c recursion segmentation-fault


【解决方案1】:

您遇到分段错误,因为您没有分配 root main中树根的地址

node* root=0;
    for(int i=1;i<15;i++){
        random = rand();
        root=insert(root, random);//assigning root the starting address of root of tree
        printf("%d\n", random);
    }

【讨论】:

  • 如果您只是将正确的代码转储给如​​此困惑的人,他们就不会学到任何东西。不要那样做。此外,您似乎没有修复 all 的错误。仅当您修复了所有个错误并且您通过测试验证了验证时才转储正确的代码。
  • 但是先生,我把评论放在我修改代码的地方
  • 是write@zwol
  • 是的,但他们不会注意到。另外,同样,您没有修复所有的错误。 (您修改后的答案更好,但实际上仍然没有那么有用。)
  • 但我只修改了这个东西,它工作正常
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多