Fur*_*med -1 c pointers segmentation-fault binary-search-tree
我试图编写一个使用C中的指针创建二叉树的简单程序,但我无法找到此代码的问题.我在第二次插入时收到Segmentation Fault.
该程序接受五个数字的输入,然后使用数组输入创建一个二叉树.示例运行:
这是程序的输出
输入5个元素:
45 78 89 32 46
在generateBST中
在插入中转到右侧子树
插入
分段故障
请帮我解决这个错误.谢谢.
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
    int value;
    struct node * lst;
    struct node * rst;
}Node;
void printBST(Node *root){
    puts("In printBST");
    if(root == NULL){
        return;
    }
    printBST(root->lst);
    printf(" %d ", root->value);
    printBST(root->rst);
}
void insert(Node **root, int element){
    puts("In insert");
    if((*root)->value > element){
        puts("Going to left sub tree");
        insert(&(*root)->lst ,element);
    } else if ((*root)->value < element) {
        puts("Going to right sub tree");
        insert(&(*root)->rst ,element);
    } else {
        puts("Creating a new node to insert");
        Node * newNode = (Node*)malloc(sizeof(Node));
        newNode->value = element;
        newNode->lst = NULL;
        newNode->rst = NULL;
        (*root) = newNode;
    }
}
Node* generateBST(int *elements, int n){
    puts("In generateBST");
    int i =0;
    Node * root = NULL;
    root = (Node*)malloc(sizeof(Node));
    root->value = *(elements);
    root->lst = NULL;
    root->rst = NULL;
    for(i=1; i < n; i++){
        insert(&root, *(elements+i));
    }
    return root;
}
int main(){
    Node * root = NULL;
    int i = 0, element, *elements ;
    elements = (int*)malloc(sizeof(int)*5);
    puts("Enter 5 elements : ");
    fflush(stdin);
    for(i = 0; i < 5; i++){
        scanf("%d",&element);
        elements[i] = element;
    }
    root = generateBST(elements,5);
    printBST(root);
    //deallocBST(root);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
    在insert中,如果*root为null ,则在取消引用时会出现分段错误(*root)->value.你需要处理这种情况:
void insert(Node **root, int element){
    puts("In insert");
    if (*root == null || (*root)->value == element) {
        puts("Creating a new node to insert");
        Node * newNode = malloc(sizeof(Node));
        newNode->value = element;
        newNode->lst = NULL;
        newNode->rst = NULL;
        (*root) = newNode;
    } else if((*root)->value > element){
        puts("Going to left sub tree");
        insert(&(*root)->lst ,element);
    } else {  /* (*root)->value < element */
        puts("Going to right sub tree");
        insert(&(*root)->rst ,element);
    }
}
Run Code Online (Sandbox Code Playgroud)
        刚刚使用gdb找到了你的问题.您在第22行上有一个错误.问题是您不检查root是否为null,这对于插入第一个元素是个问题.
要通过gdb运行程序,只需使用以下命令编译和运行:
g++ -g YourPorgram.cpp
gdb a.out
run
Run Code Online (Sandbox Code Playgroud)
程序停止时(segfaultor其他问题)输入:
bt
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           380 次  |  
        
|   最近记录:  |