c语言创建二叉搜索树的问题

problem in creating binary search tree in c language

此代码创建了一个二叉搜索树,但它 有时运行正常有时出错,即使不更改代码中的任何内容也是如此。

我不明白为什么会这样,有什么问题吗?

即使我将用于创建树的函数从递归更改为迭代,但结果相同。


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

typedef struct sommet{
    struct sommet * fg;
    int val;
    struct sommet * fd;
}sommet;
typedef sommet* ptrm;

ptrm creearbre(ptrm arbre,int ele);
void impression(ptrm arbre);
ptrm creearbre_rec(ptrm arbre,int ele);

int main()
{
        ptrm arbre=NULL;
        int tarbre,n;
        printf("entre la taille de l'arbre:");
        scanf("%d",&tarbre);
        for(int i=0;i<tarbre;i++)
        {
            printf("entre l'element %d: ",i+1);
            scanf("%d",&n);
            arbre=creearbre_rec(arbre,n);
        }
        impression(arbre);
    return 0;
}

ptrm creearbre_rec(ptrm arbre,int ele)
{
    if(arbre==NULL)
    {
        arbre=malloc(sizeof arbre);
        arbre->val=ele;
        arbre->fd=NULL;
        arbre->fg=NULL;
    }
    else if(arbre->val > ele)
        arbre->fg=creearbre_rec(arbre->fg,ele);
    else
        arbre->fd=creearbre_rec(arbre->fd,ele);
return arbre;
}

void impression(ptrm arbre){
        if(arbre != NULL){
        printf(" %d -->", arbre->val);
        impression(arbre->fg);
        impression(arbre->fd);
    }
}


ptrm creearbre(ptrm arbre,int ele){
    ptrm p,q=arbre,r=NULL;
    p=malloc(sizeof arbre);
    p->val=ele;
    p->fd=NULL;
    p->fg=NULL;
    if(arbre==NULL){
        arbre=p;
    }
    else{
        while(q!=NULL){
            r=q;
            if(ele > q->val)
                q=q->fd;
            else
                q=q->fg;
        }
        if(ele > r->val)
            r->fd=p;
        else
            r->fg=p;
    }
    return arbre;
}

由于在语句中分配内存时使用了无效大小,程序出现未定义的行为

arbre=malloc(sizeof arbre);

p=malloc(sizeof arbre);

为指针而不是结构类型的对象分配了内存。

你需要写

arbre=malloc(sizeof *arbre);

p=malloc(sizeof *arbre);