c BST中的分段故障(核心转储)

Shu*_*pta -1 c segmentation-fault binary-search-tree

在这里我已经制作了一个删除二进制搜索树(BST)的程序,但是在执行时得到了分段错误(核心转储),我认为它在删除函数中但不知道我是否删除了删除函数的函数调用然后它的工作原理很好,就像找到最大元素,inorder遍历,但删除将无法正常工作.

#include<stdio.h>
#include<stdlib.h>
struct BST{
    int data;
    struct BST *left;
    struct BST *right;
};
struct BST *newNode(int data){
    struct BST *temp = (struct BST *)malloc(sizeof(struct BST));
    temp->data=data;
    temp->left=0;
    temp->right=0;
    return temp;
}
void inOrder(struct BST *root){
    if(root==0)
        return;
    inOrder(root->left);
    printf("%d",root->data);
    inOrder(root->right);
}
struct BST *findMax(struct BST *root){
    if(root==0)
        return 0;
    if(root->right!=0)
        return findMax(root->right);
    return root;
}
struct BST *dele(struct BST *root,int data){
    if(root==0)
        return 0;
    if(data<root->data)
        root->left=dele(root->left,data);
    if(data>root->data)
        root->right=dele(root->right,data);
    else{
        if(root->left && root->right)
        {
            struct BST *temp=findMax(root->left);
            root->data=temp->data;
            root->left=dele(root->left,root->data);
        }
        else{
            struct BST *temp=root;
            if(root->left==0)
                root=root->right;
            if(root->right==0)
                root=root->left;
            free(temp);
            return root;
        }
    }
    return root;
}
void main(){
    struct BST *root = (struct BST*)malloc(sizeof(struct BST));
    root=newNode(1);
    root->left=newNode(2);
    root->right=newNode(3);
    root->left->left= newNode(4);
    root->left->right=newNode(5);
    root->right->left=newNode(6);
    root->right->right=newNode(7);
    inOrder(root);
    root=dele(root,1);
    printf("\n\n");
    inOrder(root);
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*eri 5

void main(){
Run Code Online (Sandbox Code Playgroud)

请转到:

int main(void) {
Run Code Online (Sandbox Code Playgroud)

并使用NULL而不是0比较指针

我的调试器告诉我:

程序接收信号SIGSEGV,分段故障.删除时0x00000000004007f0(root = 0x0,data = 5)at demo.c:47 47
if(root-> right == 0)

调试步骤(使用gdb):

  • 使用-g标志编译:

    gcc -std = c99 -pedantic -Wall -Wextra -W -g -o demo demo.c

  • 启动gdb:

    gdb演示

  • 类型: