首页 > 解决方案 > 使用迭代插入函数在第二次插入后初始化二叉搜索树时出现分段错误

问题描述

在尝试将第二个节点插入树后,我遇到了分段错误,引发了分段错误。分段错误是由于initialize功能还是insert?以及如何通过更改 server.c 来解决它?

客户端.c 文件:

int main()
{
    Tree my_tree;
    initialize(&my_tree);
    while(1)
    {
        scanf("%d", &choice);
        switch (choice)
        {
        case 1:
            scanf("%d", &element);
            insert(&my_tree, element);
            break;
        case 2:
               exit(0);
       }
    }
    return 0;
}

server.c 文件


typedef struct node
{
    int data;
    struct node *left;
    struct node *right;
} Node;

typedef struct tree
{
    Node *root;
} Tree;

void initialize(Tree *tree)
{
    tree = (Tree*)malloc(sizeof(Tree));
    tree->root = NULL;
}

void insert(Tree *tree, int data)
{
    Node *temp = (Node*)malloc(sizeof(Node));
    temp->left = temp->right = NULL;
    temp->data = data;
    if(tree->root == NULL) 
        tree->root = temp;    
    else
    {
        Node *prev,*curr;
        prev = NULL;
        curr = tree->root;
        while(curr != NULL)
        {
            if(temp->data < curr->data){
                prev = curr;
                curr = curr->left;
            }
            if(temp->data >curr->data){
                prev = curr;
                curr = curr->right;
            }
        }
        if(temp->data < prev->data)
            prev->left = temp;
        if(temp->data > prev->data)
            prev->right = temp;
    }
}

标签: clinked-listsegmentation-faultinitializationbinary-search-tree

解决方案


void initialize(Tree *tree)
{
    tree = (Tree*)malloc(sizeof(Tree));
    tree->root = NULL;
}

改成

void initialize(Tree *tree)
{
    if (tree) {
     tree->root = NULL;
    }
}

当您为您分配内存时,tree您将使其指向新的内存位置,因此您原来tree的根节点将不会被初始化,NULL并且您也会引入内存泄漏。


推荐阅读