Программа не работает хорошо (означает вывод (printf)), но в gdb t.exe она работает хорошо - PullRequest
0 голосов
/ 26 января 2019

У меня сейчас странная проблема с дисплеем.Когда я запускаю программу, выполнив следующие действия: t У меня есть такой результат: результат выполнения t.exe

, что, по сути, является началом моей программы:

Однако, когда я использую gdb следующим образом: gdb t.exe, все работает так: результат выполнения в режиме отладки

Ниже приведен мой код (извините, это не чисто: /)

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


typedef int typeElem;

typedef struct  aa {
  typeElem v ;
  struct aa * fg , * fd ;  // les fils gauche et droit
} abr;

#define arbre_vide NULL

typedef abr *arbre;

typedef int boolean;

arbre consa(typeElem x, arbre fils_gauche, arbre fils_droit) {
    arbre N = malloc ( sizeof( arbre ) ) ;
    N->fg = fils_gauche;
    N->fd = fils_droit;
    N->v = x;
    return N;
}

void destruct(arbre ABR) {
    free(ABR);
}

arbre gauche(arbre ABR) {
    return ABR->fg;
}

arbre droit(arbre ABR) {
    return ABR->fd;
}

int estVideArbre(arbre ABR) {
    return (ABR == NULL);
}

typeElem racine(arbre ABR){
    return (ABR->v);
}

/*
void destructAbr(arbre ABR){
    if(!estVideArbre(ABR)){
        destructAbr(gauche(ABR));
        destructAbr(droit(ABR));        
    }
}
*/

void infixe(arbre ABR){
    if(!(ABR == NULL)){
        infixe(ABR->fg);
        printf("%d ", ABR->v);
        infixe(ABR->fd);
    }
    else {
        //printf("est null \n");
    }
}

void prefixe(arbre ABR){
    if(!estVideArbre(ABR)){
        printf("%d ", ABR->v);
        infixe(ABR->fg);
        infixe(ABR->fd);
    }
}

void postfixe(arbre ABR){
    if(!estVideArbre(ABR)){
        infixe(gauche(ABR));
        infixe(droit(ABR));
        printf("%d ", racine(ABR));
    }
}
int nbrTotalNoeuds(arbre ABR) {
    if(estVideArbre(ABR))
        return 0;
    return 1 + nbrTotalNoeuds(gauche(ABR)) + nbrTotalNoeuds(droit(ABR));
}


int nbreNoeudsDe2Fils(arbre ABR) {
    if( !estVideArbre(gauche(ABR)) && !estVideArbre(droit(ABR)) ){
        return 1 + nbreNoeudsDe2Fils(gauche(ABR)) + nbreNoeudsDe2Fils(droit(ABR));
    }
    else if (!estVideArbre(gauche(ABR)) && estVideArbre(droit(ABR)) ) {
        return nbreNoeudsDe2Fils(gauche(ABR));
    }
    else if (estVideArbre(gauche(ABR)) && !estVideArbre(droit(ABR)) ) {
        return nbreNoeudsDe2Fils(droit(ABR));
    }
    else {
        return 0;
    }
}


int nbreNoeudsDe1Fils(arbre ABR) {
    if( gauche(ABR) != NULL && droit(ABR) != NULL ) {
        return 0 + nbreNoeudsDe1Fils(gauche(ABR)) + nbreNoeudsDe1Fils(droit(ABR));
    }
    else if( gauche(ABR) != NULL && droit(ABR) == NULL ) {
        return 1 + nbreNoeudsDe1Fils(gauche(ABR));
    }
    else if( gauche(ABR) == NULL && droit(ABR) != NULL ) {
        return 1 + nbreNoeudsDe1Fils(droit(ABR));
    }
    else {
        return 0;
    }
}


/*
        5
       / \
      3   6
     / \   \
    2   4   7
             \
              9
*/


int main() { //test


    printf("Lancement du programme \n");
    arbre rac_g = consa(2,arbre_vide,arbre_vide);
    arbre rac_d = consa(4,arbre_vide,arbre_vide);

    arbre rac_d_d_d = consa(9,arbre_vide,arbre_vide);
    arbre rac_d_d = consa(7,arbre_vide,rac_d_d_d);

    arbre fg = consa(3,rac_g,rac_d);
    arbre fd = consa(6,arbre_vide,rac_d_d);

    arbre sommet = consa(5,fg,fd);

    printf("\nEn ordre infixe : ");
    infixe(sommet);

    printf("\nEn ordre prefixe : ");
    prefixe(sommet);
    printf("\nEn ordre postfixe : ");
    postfixe(sommet);


    printf("\nNombre de noeuds dans cette arbre : %d\n", nbrTotalNoeuds(sommet));
    printf("Nombre de noeuds a 2 fils : %d\n", nbreNoeudsDe2Fils(sommet));
    printf("Nombre de noeuds a 1 fils : %d\n", nbreNoeudsDe1Fils(sommet));

    // destructAbr(sommet);

    return 0;
}

1 Ответ

0 голосов
/ 26 января 2019

Это

  arbre N = malloc ( sizeof( arbre ) ) ;

не делает то, что вы ожидаете. Он выделяет память только для указателя, а не для того, на что указатель указывает.

До

  arbre N = malloc(sizeof *N);

вместо.


Я не понимаю, почему вы определяете три имени для более или менее одного и того же. Мой совет - бросить abr и arbre, и использовать только struct aa и struct aa *.

Меньше имен, меньше путаницы, меньше ошибок.

...