簡體   English   中英

在 c 語言中創建二叉搜索樹的問題

[英]problem in creating binary search tree in c language

這段代碼創建了一個二叉搜索樹,但它有時運行正常,有時會出錯,即使沒有更改代碼中的任何內容。

我不明白為什么會發生這種情況,這是什么錯誤?

即使我將用於創建樹的 function 從遞歸更改為迭代,但結果相同。


#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;
}

由於在語句中分配 memory 時使用了無效的大小,程序具有未定義的行為

arbre=malloc(sizeof arbre);

p=malloc(sizeof arbre);

為指針而不是結構類型的對象分配了 memory。

你需要寫

arbre=malloc(sizeof *arbre);

p=malloc(sizeof *arbre);

暫無
暫無

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

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