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 :

Implementation d'Arbre Binaire


Sujet :

C

  1. #1
    Membre du Club Avatar de sisiniya
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Points : 67
    Points
    67
    Par défaut Implementation d'Arbre Binaire
    Bonjour ... ,

    Je veux alimenter mon arbre binaire avec les membres d'une famille comme suit : chaque noeud contient comme infos (rang et prenom)

    GrandPere

    Parent1 Parent2

    Enfant1 Enfant2 Enf1 Enf2

    J'ai trouvé des difficultés pour concevoir la manière dont on peut insérer les prenom, car je dois les inserer par rapport à leurs rang !!

    Alors, ce que j'ai proposé comme solution temporaire , c'est que j'ai utilisé bien evidement une structure arbre compagnée par une fonction qui permet d'ajouter les noeud selon un ordre bien déteminé , c'est à dire, c'est moi qui a précisé cet ordre qui est comme suite :

    j'ai considéré que j'ai just 3 niveau dans l'arbre, et j'ai numéroté les rang pour chaque noeud :
    4
    3 6
    1 2 5 7


    Pourquoi ce-ci ?? C'est pour que je puisse faire des testes lors de l'ajout d'un noeud comme vous pouvez le constater dans mon code .

    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
     
     
    /*Structure de données: Arbre binaire de recherche*/
    #include <stdio.h>
    #include <stdlib.h>
    #define TRUE 1
     
    /* Définition de la structure Noeud d'un arbre*/
    typedef struct _Noeud{
      int rang;
      char prenom[30];
      struct _Noeud* succ_gauche;
      struct _Noeud* succ_droit;
    } Noeud;
     
    /*Définition du type TArbre, une structure de type TArbre est définie par un pointeur sur la racine de l'arbre*/
    typedef Noeud* TArbre;
     
    /* Fonction ajouterNoeud: crée un Noeud et l'ajoute dans un arbre binaire de recherche.*/
    void ajouterNoeud(TArbre* arbre,char *pren,int r)
    {
        Noeud* nouveauNoeud;
        TArbre pArbre; /* Variable utilisée pour parcourir l'arbre*/
     
            // -------------->> Création du nouveau noeud  <<----------------
        nouveauNoeud=(Noeud *)malloc(sizeof(Noeud));
        nouveauNoeud->rang=r;
        strcpy(nouveauNoeud->prenom,pren);
        nouveauNoeud->succ_gauche=NULL;
        nouveauNoeud->succ_droit=NULL;
     
            // ---------->> Ajout du nouveau noeud dans l'arbre  <<-----------
        pArbre=*arbre;
     
        // ->> si c'est un nouvel arbre alors le nouveau noeud sera la racine de cet arbre
        if(pArbre==NULL)
                pArbre=nouveauNoeud;
        else
        {
            while(TRUE)
            {
                if(r < pArbre->rang)
                {
                    if(pArbre->succ_gauche == NULL)
                    {
                        pArbre->succ_gauche = nouveauNoeud;
                        break;
                    }
                    else
                        pArbre = pArbre->succ_gauche;
                }
                else
                {
                    if(pArbre->succ_droit == NULL)
                    {
                        pArbre->succ_droit = nouveauNoeud;
                        break;
                    }
                    else
                        pArbre = pArbre->succ_droit;
                }
            }
        }
    }
     
    void sauvgarder(FILE *f,TArbre arbre)
    {
      if(arbre){
          fprintf(f,"prenom : %s      rang : %d\n",arbre->prenom,arbre->rang);
          sauvgarder(f,arbre->succ_droit);
          sauvgarder(f,arbre->succ_gauche);
      }
    }
     
    void ecrireFichier(TArbre arbre)
    {
        FILE *f=fopen("solution.txt","w");
        if(!f)
             printf("Erreur douverture\n");
        else{
            sauvgarder(f,arbre);
        }
       fclose(f);
    }
     
    int main()
    {
        TArbre *arbre;
        char prenom_grandParent[30];
        char prenom_Parent1[30];
        char prenom_Parent2[30];
        /*char prenom_grandParent[30];
        char prenom_Parent1[30];
        char prenom_Parent2[30];*/
     
        printf("\n\n\t\t\t############################################\n");
            printf("\t\t\t#        REALISER PAR ETUDIANTE            #\n");
            printf("\t\t\t#           SISINIYA                       #\n");
            printf("\t\t\t############################################\n");
     
        printf("\n\n-->>Les numero des rangs de chaque noeud de l'arbre binaire ont ete propose comme suite : \n\n");
        printf("\t\n                             |4| \n");
        printf("\t         |3|                      |6|\n");
        printf("\t    |1|      |2|           |5|          |7|\n\n");
     
        printf("\n -->> entrer le prenom du grande pere  : ");
        scanf("%s",prenom_grandParent);
        fflush(stdin);
        ajouterNoeud(arbre,prenom_grandParent,4);
     
        printf("\n -->> entrer le prenom des fils du grand parent : \n ");
        printf("\t\t * Prenom Parent 1 : ");
        scanf("%s",prenom_Parent1);
        fflush(stdin);
        ajouterNoeud(arbre,prenom_Parent1,3);
     
        printf("\n\t\t * Prenom Parent 2 : ");
        scanf("%s",prenom_Parent2);
        fflush(stdin);
        ajouterNoeud(arbre,prenom_Parent2,6);
     
        ecrireFichier(*arbre);
     
        printf("\n\n \t\tFIN DE MON APPLICATION \t\t  Sisiniya 2009/2010\n\n");
     
     
        return 0;
    }
    je sais bien que ma proposition pour résoudre le problème n'est pas pratiquable, C'est pour cela vient ma demande :

    Mon Code me génére une erreur d'execution , c'est que lorsqu'il arrive à l'instruction du main , là où il y a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    printf("\n -->> entrer le prenom du grande pere  : ");
        scanf("%s",prenom_grandParent);
        fflush(stdin);
        ajouterNoeud(arbre,prenom_grandParent,4);
    quand je saisi , et au lieu qu'il me passe la main de saisir les parents, il n'arrive pas à executer ajouterNoeud (Voir SVP l'image qui illustre bien l'erreur )



    Merci bien pour votre aide.


    Sisiniya
    Fichiers attachés Fichiers attachés

  2. #2
    Membre du Club Avatar de sisiniya
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Points : 67
    Points
    67
    Par défaut
    Pardon le schéma d'arbre que je vous ai monté n'a pas été bien afficher, espérant que vous avez deviné la forme :

    grand pere a deux fils qui sont schématiser par parent1 et parent 1:
    chaque parent a deux enfants.

  3. #3
    Membre expert

    Homme Profil pro
    Spécialiste progiciel
    Inscrit en
    Février 2010
    Messages
    1 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Spécialiste progiciel
    Secteur : Service public

    Informations forums :
    Inscription : Février 2010
    Messages : 1 747
    Points : 3 016
    Points
    3 016
    Par défaut
    Bonjour,

    Déjà, tu ne remplis jamais le successeur gauche.
    En effet, tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        nouveauNoeud->rang=r;
     
        nouveauNoeud->succ_gauche=NULL;
        nouveauNoeud->succ_droit=NULL;
     
     pArbre=*arbre; // Itérations suivantes
    pArbre=nouveauNoeud; // Première itération 
     if(r < pArbre->rang) // Or r = parbre->rang (première itération)
     
    Donc tu ne mets pas de successeur gauche
    Uniquement un successeur droit.
    En espérant que cela t'aidera

    Cordialement,
    Christophe
    Cordialement,
    Christophe

    Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sisiniya Voir le message
    Bonjour ... ,

    Je veux alimenter mon arbre binaire avec les membres d'une famille comme suit : chaque noeud contient comme infos (rang et prenom)

    GrandPere

    Parent1 Parent2

    Enfant1 Enfant2 Enf1 Enf2
    Ben oui mais ce n'est pas un arbre binaire qu'il te faut. Chaque élément de l'arbre peut avoir plusieurs enfants (et pas seulement 2).

    Il te faut implémenter un arbre ou chaque feuille possède un tableau de "n" feuilles filles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // Définition de la structure s_noeud d'un arbre
    typedef struct s_noeud{
      int rang;
      char prenom[30];
      struct s_noeud* enfant;
    } t_noeud;
     
    // Définition de la structure principale d'un arbre
    typedef struct
    {
        t_noeud *racine;
        // Autres éléments éventuels laissés au choix du programmeur et faciles à rajouter
    } t_arbre;

    A moins que t'aies raisonné à l'envers en inversant ton arbre (car en effet chaque élément n'a que 2 parents) ce qui donnerait alors


    Enfant

    Parent1 Parent2

    Parent11 Parent12 Parent21 Parent22
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Afficher un arbre binaire avec sa structure
    Par PhoneKilleR dans le forum C
    Réponses: 7
    Dernier message: 23/04/2008, 23h24
  2. implementer une faune sous forme d'arbre binaire.
    Par mansour67 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 01/04/2008, 17h22
  3. Réponses: 11
    Dernier message: 07/04/2004, 13h06
  4. Arbre binaire
    Par Heaven dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 02/02/2004, 19h01
  5. [LG]probleme de creation arbre binaire
    Par jsaviola dans le forum Langage
    Réponses: 2
    Dernier message: 06/01/2004, 20h57

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