c - 插入二叉搜索树时出现段错误

标签 c algorithm segmentation-fault binary-search-tree

我编写了以下代码来插入二叉搜索树,该搜索树可以有重复的条目,但对于较大的输入(例如大于 30),我会出现段错误......请帮助!重复的条目存储在节点的右分支中

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

typedef struct vertex{

    int num;
    struct vertex* r;
    struct vertex* l;

} node;


void insert(node* T,int x)
{

    if(x < T->num)
    {
        if(T->l == NULL)
    {
        T->l = (node*)malloc(sizeof(node));
        T->l->num = x;
        printf("%4d ",x);
        return;
    }
        else
    {
        insert(T->l,x);
    }
    }

    else if(x >= T->num)
    {
        if(x == T -> num)

        if(T->r == NULL)
    {
        T->r = (node*)malloc(sizeof(node));
        T->r->num = x;
        printf("%4d ",x);
        return;
    }
        else
        insert(T->r,x);
    }

}



main()
{
    srand((unsigned int)time(NULL));

    int i,n,m,x;
    node* T;

    printf("n = ");
    scanf("%d",&n);
    printf("\nm = ",&m);
    scanf("%d",&m);

    printf("\n\n\n+++ Inserting %d random integers between 1 and %d\n",n,m);

    x = 1 + rand() % m;
    T = (node*)malloc(sizeof(node));
    T->num = x;
    printf("%4d (1)",x);

    for(i=1;i<n;i++)
    {
        x = 1+rand() % m;
        insert(T,x);
        if(i%8 == 7)
    printf("\n");

    }

    printf("\n\n");
}

最佳答案

malloc() 不会初始化内存,因此在分配后将其他成员设置为 NULL 或使用 calloc()。如果没有这个,当您执行 T->lT->r 时,您将访问随机内存。

T = malloc(sizeof(node));
T->num = x;
T->l = NULL;
T->r = NULL;

T = calloc(1, sizeof(node));
T->num = x;

在所有使用 malloc() 的地方执行此操作

关于c - 插入二叉搜索树时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18820765/

相关文章:

c - memcpy tcp 套接字上的段错误

c - 当我尝试使用指针访问结构时出错

C中的冷启动代码

c - 每个进程的最大线程数-sysconf(_SC_THREAD_THREADS_MAX)失败

c - 单独使用递归构建最小堆

c - 请解释一下这个比较字符串的方法

java - Nlog(logN)、NlogN、Nlog(N^2) 是否具有等效的运行时间?

java - O(n log n) 时间复杂度算法?

c++ - 将局部 vector 复制到 map 中某个键的值时遇到段错误

ruby - 检查范围内的任何数模数是否为零