簡體   English   中英

C-使用遞歸創建二叉樹時出現分段錯誤

[英]C - Segmentation Fault while Creating Binary Tree Using recursion

我試圖編寫一個使用C中的指針創建二叉樹的簡單程序,但是我找不到此代碼的問題。 我在第二次插入時收到分段錯誤。

該程序輸入五個數字,然后使用數組輸入創建一個二叉樹。

這是程序的輸出

輸入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;
}

在插入中,如果*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);
    }
}

剛剛使用gdb找到了您的問題。 第22行出現錯誤。問題是您不檢查root是否為null,這對於插入第一個元素是有問題的。

要通過gdb運行程序,只需使用以下命令進行編譯和運行:

g++ -g YourPorgram.cpp
gdb a.out
run

當程序停止(segfaultor或其他問題)時,鍵入:

bt

暫無
暫無

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

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