IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Arbre binaire en C


Sujet :

C

  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Par défaut Arbre binaire en C
    Bonjour !
    je veux créer un programme pour insérer dans un arbre binaire puis afficher l'arbre
    voila ce que j'ai fais jusqu'à maintenant, le problème c'est que l'arbre ne change pas quand j'insère un élément ça reste toujours à NULL
    aidez moi à réglr le problème s'il vous plait ! MERCI
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    #include<stdio.h>
     
    #include <stdlib.h>
     
    #include <conio.h>
     
     
    /*type liste*/
    typedef struct noeud * ab;
    struct noeud
    {
       	int val;
    	ab g;
    	ab d;
    };
    /*creation dun neoud*/
    ab creat(int val,ab ls, ab rs)
    {
    ab e = new(noeud);	
     
    	e->val = val;
    	e->g = ls;
    	e->d = rs;
     
    	return e;
    }
    /*ajout dun element dans un ab*/
    void insert(int val,ab r)
    {
        if( r == NULL )
        {
            r=creat(val,NULL,NULL);
     
        }
        else if(r->g==NULL)
        {
            insert(val,r->g);
        }
         else if(r->d==NULL)
        {
            insert(val,r->d);
        }
    }
     
    /*affichage dun ab*/         
    void affichage(ab r)
    {if (r!=NULL){
        printf("%d",r->val);
        affichage(r->g);
        affichage(r->d);}
     
         }
    /*programme principal*/
     
    main ()
    {int choix,cho,x;
    noeud* a=NULL;
      do {
              /*faire le choix*/
        printf("\n");
          printf("1)- creation d'un arbre binaire.");
          printf("\n");
          printf("2)- affichage d'un arbre binaire.");
          printf("\n");
          printf("\n");
          printf("ENTRER VOTRE CHOIX !!:  ");
          scanf("%d",&choix);
          printf("\n");
          switch(choix)
          {
           case 1: {
                cho=1;
    while(cho!=0){
    printf("Entrer la valeur pour l'inserer dans l'arbre:\n");
    scanf("%d",&x);
    insert(x,a);
    printf("Voulez vous ajoutez un element?  (1 / 0)\n");
    scanf("%d",&cho);
    }
    printf("\n");
     
                  break;
                      }
     
     case 2: {
          printf("**AFFICHAGE DE LA LISTE**\n");
    affichage(a);
     break;
     
              }
     
    		  }
    		  }
          while (choix!=0);
     
          getch();
     
         }

  2. #2
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Salam,

    Alors il y a plusieurs choses :

    1. pourquoi "ça reste NULL" ?

    A cause de void insert(int val, ab r)
    Les paramètres sont passés par copie, donc dans ta fonction tu manipules une copie de r. Pour que ça fonctionne mieux passe un pointer sur ab :
    void insert(int val, ab* r)
    ou renvoie l'arbre modifié
    ab insert(int val, ab r).

    Tu vois comment faire ou désires-tu plus d'explications ?

    2. ta fonction insert est étrange, tu ne fais rien si ni la racine, ni le fils gauche ni le fils droit sont NULL ?

  3. #3
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Par défaut
    voila j'ai modifié la fonction insert mais ça marche toujours pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    ab insert(int val,ab r)
    {
        if( r == NULL )
        {
            r= creat(val,NULL,NULL);
     
        }
        else if(r->g==NULL)
        {
            r->g=creat(val,NULL,NULL);
        }
         else if(r->d==NULL)
        {
            r->d=creat(val,NULL,NULL);
        }
        else return insert(val,r->g);
        return r;
    }

  4. #4
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par mohsenuss91 Voir le message
    voila j'ai modifié la fonction insert mais ça marche toujours pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    ab insert(int val,ab r)
    {
        if( r == NULL )
        {
            r= creat(val,NULL,NULL);
        
        }
        else if(r->g==NULL)
        {
            r->g=creat(val,NULL,NULL);
        }
         else if(r->d==NULL)
        {
            r->d=creat(val,NULL,NULL);
        }
        else return insert(val,r->g);
        return r;
    }
    En gras la partie suspecte : si racine, fils gauche et fils droit ne sont pas null tu renvoies le résultat de l'insertion dans le fils gauche ?
    Ce que tu veux faire est :
    si fils gauche est vide on insère à gauche
    sinon si fils droit est vide on insère à droite
    sinon on insère la valeur dans le fils gauche

    Tu vas construire un peigne avec ce genre d'insertion (arbre après insertion de 1,2,3,4,5,6,7,8,9).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            1
           / \
          2   3
         / \
        4   5
       / \
      6   7
     / \
    8   9
    Bon c'est toujours un peu étrange ... tu veux implémenter quoi comme arbre binaire ?

  5. #5
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Par défaut
    je veux juste insérer une valeur dans un arbre binaire

  6. #6
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par mohsenuss91 Voir le message
    je veux juste insérer une valeur dans un arbre binaire
    Si tu prends le cas hypergénéral : j'ai un arbre binaire je veux y insérer une valeur alors il faut lui donner l'endroit où tu veux insérer cette valeur.
    Si tu utilises un arbre binaire spécialisé comme un arbre binaire de recherche, ou un arbre à hauteur contrainte (AVL par exemple) ou encore une structure spécialisée comme un tas, alors tu as des algorithmes précis pour la primitive d'insertion (car en général c'est la valeur qui décide du lieu d'insertion).
    Est-ce une application de ton cours ? Veux-tu implémenter un abr ?

  7. #7
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Par défaut
    je veux insérer ma valeur comme suit:
    -si l'arbre est null alors on cree un noeud qui contient cette valeur et qui sera notre arbre
    -si la racine est non null alors on va voir le fils gauche s'il est null on va insérer notre valeur la bas
    -si la racine est non null alors on va voir le fils gauche s'il est aussi non null on va voir le fils droit s'il est null on va insérer notre valeur la bas sinon on vas passé on récursivité sur le fils gauche
    en général, l'ordre n'es pas important dans cet arbre je veux juste insérer la valeur la ou il y a de place.

  8. #8
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par mohsenuss91 Voir le message
    je veux insérer ma valeur comme suit:
    -si l'arbre est null alors on cree un noeud qui contient cette valeur et qui sera notre arbre
    -si la racine est non null alors on va voir le fils gauche s'il est null on va insérer notre valeur la bas
    -si la racine est non null alors on va voir le fils gauche s'il est aussi non null on va voir le fils droit s'il est null on va insérer notre valeur la bas sinon on vas passé on récursivité sur le fils gauche
    en général, l'ordre n'es pas important dans cet arbre je veux juste insérer la valeur la ou il y a de place.
    Je reprends ton code alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    ab insert(int val,ab r)
    {
        // si l'arbre est null alors on cree un noeud qui contient cette valeur
        if( r == NULL )
        {
            r= creat(val,NULL,NULL);
        
        }
        //sinon on va voir le fils gauche
        //s'il est null on va insérer notre valeur la bas
        else if(r->g==NULL)
        {
            r->g=creat(val,NULL,NULL);
        }
        //sinon on va voir le fils droit s'il est null on va insérer notre valeur la bas 
         else if(r->d==NULL)
        {
            r->d=creat(val,NULL,NULL);
        }
        // sinon on vas passé on récursivité sur le fils gauche
        else r->g=insert(val,r->g);
        return r;
    }
    Dans le dernier cas tu insères récursivement la valeur à gauche, donc le fils gauche est modifié et il faut répercuter ce changement et non en renvoyer le résultat. Dans tous les cas tu renvois le r modifié.

  9. #9
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Par défaut
    Citation Envoyé par kwariz Voir le message
    Je reprends ton code alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    ab insert(int val,ab r)
    {
        // si l'arbre est null alors on cree un noeud qui contient cette valeur
        if( r == NULL )
        {
            r= creat(val,NULL,NULL);
        
        }
        //sinon on va voir le fils gauche
        //s'il est null on va insérer notre valeur la bas
        else if(r->g==NULL)
        {
            r->g=creat(val,NULL,NULL);
        }
        //sinon on va voir le fils droit s'il est null on va insérer notre valeur la bas 
         else if(r->d==NULL)
        {
            r->d=creat(val,NULL,NULL);
        }
        // sinon on vas passé on récursivité sur le fils gauche
        else r->g=insert(val,r->g);
        return r;
    }
    Dans le dernier cas tu insères récursivement la valeur à gauche, donc le fils gauche est modifié et il faut répercuter ce changement et non en renvoyer le résultat. Dans tous les cas tu renvois le r modifié.
    ça marche toujours pas !

  10. #10
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par mohsenuss91 Voir le message
    ça marche toujours pas !
    Tu as évidemment modifié ta ligne 76 en
    a=insert(x,a)
    ?

    Si j'étais toi, je n'utiliserai pas new mais plutôt malloc.

  11. #11
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Par défaut
    voila ce que j'ai fais ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    /*creation dun neoud*/
    ab creat(int v,ab ls,ab rs)
    {
    	ab res;
     
    	res = (noeud*) malloc(sizeof(noeud*));
     
    	if( res == NULL )
    	{
    		fprintf(stderr,"Impossible d'allouer le noeud");
    		return NULL;
    	}
     
    	res->val= v;
    	res->g= ls;
    	res->d = rs;
     
    	return res;
    }
     
    /*ajout dun element dans un ab*/
    void ajout(noeud *r, int elt)
    {
    	if ( r == NULL )
    	{
    		r = creat(elt,NULL,NULL);
    	}
    	else if (r->g==NULL)
    	{
    		r->g = creat(elt,NULL,NULL);
    	}
    	else if ( r->d==NULL )
    	{
    		r->d = creat(elt,NULL,NULL);
    	}
    	else
    	{
    		ajout(r->g,elt);
    	}
    }

  12. #12
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Histoire de parler de la même chose poste tout ton code.
    La dernière version ne peut pas fonctionner pour les mêmes raisons que j'ai expliquées dans mes premiers posts :

    tu essayes de modifier un paramètre passé en copie.

    Si j'étais toi j'essaierai d'écrire la primitive d'ajout comme :
    ab ajout(ab r, int elt)

    si tu tiens absolument à pouvoie modifier le paramètre passé il faut un
    void ajout(ab* pr, int elt)
    dans le corps de la fonction tu peux modifier ton arbre en utilisant (*pr)

    Quelques règles simples :

    1. Tu définis le type ab comme étant un struct noeud*
    Utilises ab partout et jamais struct noeud*

    2. essaye de garder les mêmes noms entre les différents post (insert/ajout ...)

    3. les autres seront pour plus tard

  13. #13
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Par défaut
    voila mon code complet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    #include<stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    /*type liste*/
     
    struct noeud
    {
       	int val;
    	struct noeud *g;
    	struct noeud *d;
    };
    typedef struct noeud * ab;
    /*creation dun neoud*/
    ab creat(int v,ab ls,ab rs)
    {
    	ab res;
     
    	res = (ab) malloc(sizeof(ab));
     
    	if( res == NULL )
    	{
    		fprintf(stderr,"Impossible d'allouer le noeud");
    		return NULL;
    	}
     
    	res->val= v;
    	res->g= ls;
    	res->d = rs;
     
    	return res;
    }
     
    /*ajout dun element dans un ab*/
    void ajout(ab r, int elt)
    {
    	if ( r == NULL )
    	{
    		r = creat(elt,NULL,NULL);
    	}
    	else if (r->g==NULL)
    	{
    		r->g = creat(elt,NULL,NULL);
    	}
    	else if ( r->d==NULL )
    	{
    		r->d = creat(elt,NULL,NULL);
    	}
    	else
    	{
    		ajout(r->g,elt);
    	}
    }
     
    /*affichage dun ab*/         
    void parcourirArbre (ab n)
    {
        if(n!=NULL){
            parcourirArbre(n->g);
            printf("%d ",n->val);
            parcourirArbre(n->d);
        }
    }
     
    /*programme principal*/
     
    main ()
    {int choix,cho,x;
    ab a=NULL;
      do {
              /*faire le choix*/
        printf("\n");
     
          printf("1)- Creation d'un arbre binaire.");
          printf("\n");
          printf("2)- Affichage d'un arbre binaire.");
          printf("\n");
          printf("\n");
          printf("ENTRER VOTRE CHOIX : ");
          scanf("%d",&choix);
          printf("\n");
          /*travailler le choix*/
          switch(choix)
          {
           case 1: {
                cho=1;
    while(cho!=0){
    printf("Entrer la valeur pour l'inserer dans l'arbre:\n");
    scanf("%d",&x);
    ajout(a,x);
    printf("Voulez vous ajoutez un element?  (1 / 0)\n");
    scanf("%d",&cho);
    }
    printf("\n");
     
                  break;
                      }
     
     case 2: {
          printf("**AFFICHAGE DE LA LISTE**\n");
    parcourirArbre(a);
     break;
     
              }
     
    		  }
     
           }while (choix!=0);
     
          getch();
     
         }

  14. #14
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    J'ai modifié ton code, lis bien les commentaires.

    Important : Tu alloues de la mémoire il faut penser à la libérer (malloc => free) avant de finir ton programme.

    Important II : si tu veux modifier un paramètre de fonction il faut que tu passes un pointeur et que tu modifies la valeur pointée.


    Comme je suis sous linux j'ai mis les conio et compagnie en commentaires.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
     
    #include<stdio.h>
    #include <stdlib.h>
    //#include <conio.h>
    /*type liste*/
     
    struct noeud {
      int val;
      struct noeud *g;
      struct noeud *d;
    };
    typedef struct noeud *ab;
    /*creation dun neoud*/
    ab creat(int v, ab ls, ab rs)
    {
      ab res;
     
      // malloc renvoie un pointeur sur un espace mémoire
      // dont la taille est fournie en paramètre.
      // Tu veux créer de la place pour un noeud et malloc
      // renvoie un pointeur sur cet espace.
      // C'est à priori le seul endroit où tu vas utiliser
      // struct noeud
      res = (ab) malloc(sizeof(struct noeud));
     
      if (res == NULL) {
        fprintf(stderr, "Impossible d'allouer le noeud");
        return NULL;
      }
     
      res->val = v;
      res->g = ls;
      res->d = rs;
     
      return res;
    }
     
    /*ajout dun element dans un ab*/
    // Avec cette version toutes les modifications
    // que tu vas faire sur r seront perdues au
    // retour de la fonction
    // si tu as :
    // r=NULL;
    // ajout_old(r, 1);
    // ici r sera toujours NULL
    // pour modifier la valeur de r il faut réecrire
    // la fonction avec pour paramètre un pointeur 
    // sur r, donc de type ab*
    // Comme tu fais pour scanf par exemple
    void ajout_old(ab r, int elt)
    {
      if (r == NULL) {
        r = creat(elt, NULL, NULL);
      } else if (r->g == NULL) {
        r->g = creat(elt, NULL, NULL);
      } else if (r->d == NULL) {
        r->d = creat(elt, NULL, NULL);
      } else {
        ajout_old(r->g, elt);
      }
    }
     
    // ici pr est un pointeur sur un ab
    // si le pointeur est NULL il doit y avoir une
    // erreur
    // si le pointeur pointe sur NULL = arbre vide
    // j'ai sur parenthésé pour que tu vois
    // ce qui est manipulé
    void ajout(ab* pr, int elt)
    {
      if (pr==NULL) {
        printf("Erreur.");
        exit(1);
      } else if ((*pr)==NULL)
        *pr=creat(elt,NULL,NULL);
      else if ((*pr)->g==NULL)
        (*pr)->g=creat(elt,NULL,NULL);
      else if ((*pr)->d==NULL)
        (*pr)->d=creat(elt,NULL,NULL);
      else
        // remarque que je passe l'adresse du 
        // fils gauche
        ajout( &((*pr)->g), elt);
    }
     
    /*affichage dun ab*/
    void parcourirArbre(ab n)
    {
      if (n != NULL) {
        parcourirArbre(n->g);
        printf("%d ", n->val);
        parcourirArbre(n->d);
      }
    }
     
    /*programme principal*/
     
    main()
    {
      int choix, cho, x;
      ab a = NULL;
      do {
        /*faire le choix */
        printf("\n");
     
        printf("1)- Creation d'un arbre binaire.");
        printf("\n");
        printf("2)- Affichage d'un arbre binaire.");
        printf("\n");
        printf("\n");
        printf("ENTRER VOTRE CHOIX : ");
        scanf("%d", &choix);
        printf("\n");
        /*travailler le choix */
        switch (choix) {
        case 1:{
            cho = 1;
            while (cho != 0) {
              printf
                  ("Entrer la valeur pour l'inserer dans l'arbre:\n");
              scanf("%d", &x);
              ajout(&a, x);
              printf
                  ("Voulez vous ajoutez un element?  (1 / 0)\n");
              scanf("%d", &cho);
            }
            printf("\n");
     
            break;
          }
     
        case 2:{
            printf("**AFFICHAGE DE LA LISTE**\n");
            parcourirArbre(a);
            break;
     
          }
     
        }
     
      } while (choix != 0);
     
    //  getch();
     
    }
    ~

  15. #15
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    @mohsenuss91
    Une précision : tu utilises systématiquement une forme fausse lors de l'utilisation de malloc()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	ab res;
     	res = (ab) malloc(sizeof(ab));
    malloc() renvoie l'adresse du premier élément du tableau alloué. Si les éléments sont du type ab, alors la valeur de retour doit être stockée dans un objet de type "adresse d'un ab" : ab*. On doit donc avoir la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	ab * res;
     	res = malloc(sizeof(ab));
    // ou
            ab * res; 
            res = malloc(sizeof *res);
    A remarquer qu'en C, il est inutile de caster le retour de malloc() (en C++ il faut le faire, mais on n'utilise en général pas malloc()).

  16. #16
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Par défaut
    merci a vous ça marche maintenant juste une petite chose comment faire pour afficher mon arbre de cette façon !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            1
           / \
          2   3
         / \
        4   5
       / \
      6   7
     / \
    8   9

  17. #17
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Salut,

    Tu n'es pas très à l'aise avec les parcours d'arbre, essaye donc de commencer avec quelquechose de plus simple comme afficher l'arbre sous la forme [racine [fils gauche] [fils droit]] par exemple pour ton arbre on aurait :
    [1 [2 [4 [6 [8] [9] ] [7] ] [5] ] [3] ].

    Pour avoir un pretty print d'un arbre en ascii art en général c'est relativement compliqué (il faut savoir combien de blancs mettre avant chaque racine, combien de lignes vont former les les liens représentés par des / et des \ ; même si dans ton cas avec des peignes cela se simplifie un peu).

    Si tu tiens absolument à imprimer ton arbre comme tu l'as dessiné, essaye de faire un lien entre la profondeur du noeud gauche et le nombre de blancs qu'il y a avant lui, le nombre de blancs entre un fils gauche et un fils droit, le nombre de blancs entre / et \, les nombre de blancs avant chaque / en fonction de la profondeur du noeud père ...

  18. #18
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Par défaut
    je veux transformer l'algorithme suivant en langage C svp!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    fonction notdeg(a: ab): booleen
     
    debut
    si(a=nil) alors notdeg<-vrai
    sinonsi((a^.g=nil)et(a^.d=nil)) alors notdeg<-faux
    sinonsi((a^.g<>nil)et(a^.d<>nil)) alors notdeg<-vrai
    sinon notdeg<-notdeg(a^.g)et notdeg(a^.d);
    fin;

  19. #19
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Et où bloques-tu ?

  20. #20
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Par défaut
    les booléens
    voila ce que j'ai fais mais ça marche pas !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    bool notdeg(ab r)
    {
         if(r==NULL) {return true;}
         else if((r->g==NULL)&&(r->d==NULL)) {return false;}
         else if((r->g!=NULL)(r->d!=NULL)) {return true;}
         else {return notdeg(r->g)&& notdeg(r->d) ;}
         }

Discussions similaires

  1. Afficher un arbre binaire avec sa structure
    Par PhoneKilleR dans le forum C
    Réponses: 7
    Dernier message: 24/04/2008, 00h24
  2. suppression d'un arbre binaire
    Par NomUtilisateurDejaPris dans le forum C
    Réponses: 11
    Dernier message: 16/02/2004, 11h05
  3. [Arbre binaire de Recherche]
    Par Giovanny Temgoua dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 06/02/2004, 12h45
  4. Arbre binaire
    Par Heaven dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 02/02/2004, 20h01
  5. [LG]probleme de creation arbre binaire
    Par jsaviola dans le forum Langage
    Réponses: 2
    Dernier message: 06/01/2004, 21h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo