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 :

suppression d'un arbre binaire


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 15
    Points : 10
    Points
    10
    Par défaut suppression d'un arbre binaire
    Bonjour,
    je manipule un arbre binaire et, à mon grand regret, je n'arrive pas à en supprimer une partie. Voila 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
     
    //voila le type de l'arbre:
    struct noeud
        {
        int val;
        struct noeud * G;
        struct noeud * D;
        };
    typedef struct noeud Noeud;
    typedef struct noeud * ptr;
     
    //voila ma fonction SupprArbre:
    void SupprArbre (ptr *A)
    {
      ptr x=*A;
      if(!ptrVide(*A))
        { 
          ptr p;
          p=FilsGauche(*A);SupprArbre(&p);
          p=FilsDroit(*A);SupprArbre(&p);
          free(x);
         x=NULL;
        }
    }
     
    //voila la partie de code ki me turlupine: 
     
        printf("r avant:\n");
        AffArbre(r);
        getchar();
        SupprArbre(&r);
        printf("r apres:\n");
        AffArbre(r);
        getchar();
    En effet, lors de l'affichage de l'arbre r, ben c'est exactement la même chose qui est affichée! Moi, je souhaiterais qu'après l'appel de la fonction SupprArbre, l'arbre r soit à NULL et que l'espace mémoire qui était alloué à partir de r soit libéré bien sur.
    Merci.

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Dans la fonction de suppression tu ne travaille pas sur l'arbre, mais sur un autre arbre qui pointe au meme endroit. En clair tu libere bien l'espace memoire avec free(x) (puisque x et *A pointe au meme endroit), mais jamais tu ne remet A a NULL, c'est x que tu mets a NULL, il faudrait faire *A = NULL.
    D'ailleurs les variables x et p ne sont pas utiles.

  3. #3
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut arbres
    j'espère ne pas me tromper, mais ça me gène de voir que tu déclares A comme un ptr* alors que ptr est déjà un pointeur. essaie de mettre simplement ptr x=A; et non ptr x=*A;

    remplace tous tes *A par des A

    de même fais un supprarbre(p) et pas &p.

    aussi, dans l'appel, fais supprarbre(r) car r est déjà une adresse.

  4. #4
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut Re: arbres
    Citation Envoyé par khayyam90
    j'espère ne pas me tromper, mais ça me gène de voir que tu déclares A comme un ptr* alors que ptr est déjà un pointeur. essaie de mettre simplement ptr x=A; et non ptr x=*A;

    remplace tous tes *A par des A

    de même fais un supprarbre(p) et pas &p.

    aussi, dans l'appel, fais supprarbre(r) car r est déjà une adresse.
    Non comme il souhaite modifier l'adresse et non le contenu de r (il veut le mettre a NULL dans sa suppression), il faut bien passer un pointeur sur pointeur.

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    La solution de gl fonctionne et me convient tout à fait.
    Maintenant, un autre problème.
    J'ai une fonction CreaCorresp telle que :
    void CreaCorresp (ptr p, int nb)

    Dans cette fonction, je parcours l'arbre p et le modifie (je supprime une partie de cet arbre à l'aide de la fonction SupprArbre). Ainsi, lorsque j'arrive au niveau d'une feuille j'effectue un traitement et, supprime le pointeur de cette feuille. Je boucle ceci tant que je ne suis pas passé par toutes les feuilles. Alors, au debut de la boucle, j'ai une declaration telle que :
    ptr r=p; //où p est l'arbre passé en paramètre
    //et r se deplace dans p
    Cette initialisation me permet donc de revenir à la racine au debut de la boucle.
    Le truc, c'est qu'apparemment, r est supprimé correctement, mais dans l'arbre p (au niveau de r), le pointeur n'est pas à NULL. Pourtant lors de l'initialisation, p et r pointe sur le même objet, alors si je modifie r un peu plus loin , p devrait être modifié de la même facon nan?

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par NomUtilisateurDejaPris
    Le truc, c'est qu'apparemment, r est supprimé correctement, mais dans l'arbre p (au niveau de r), le pointeur n'est pas à NULL. Pourtant lors de l'initialisation, p et r pointe sur le même objet, alors si je modifie r un peu plus loin , p devrait être modifié de la même facon nan?
    Peux-tu poster le code de cette fonction ainsi que l'appel, que l'on puisse voir ce qui se passe.

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Voila le code de la fonction CreaCorresp :
    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
     
    void CreaCorresp (ptr p, int nb)
    {
    int i=0;
    t_cor tab;
    while(i != nb)
        {
        ptr r=p; //r: pointeur ki bouj ds larbre
        while(!Feuille(r))
           if(!ptrVide(FilsGauche(r)))
              r=FilsGauche(r);
           else 
              r=FilsDroit(r);
        tab.tablo[i].c=CaracArbre(r);
        SupprArbre(&r);
        i++;
        }
    }
     
    //L'appel de cette fonctoin se fait tout simplement comme il suit:
    CreaCorresp(pt,lg);
    Grâce à différent tests, je sais qu'après l'appel de SupprArbre(&r), r est à NULL. Pourtant, il semblerait que dans p, cette même partie n'est pas à NULL.
    Comme je l'ai dit dans un précedent message, je fais l'initialisation r=p pour remettre l'arbre r au niveau de la racine de l'arbre.

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Tu as le meme probleme que precedement, la fonction SupprArbre modifie le pointeur r, mais pas le contenu de p. En effet, lorsque tu fais r=p, les deux pointeurs designe la meme zone memoire, ensuite tu te promene dans ton arbre et tu supprimme des elements, ces elements sont effectivement supprimmer, mais quand tu mets ensuite r a NULL, tu modifie ce sur quoi pointe r, mais aucunement le contenu de p. Generalement lorsque l'on supprimme des elements de la sorte, on ne supprimme pas l'element sur lequel on se trouve, mais un de ces fils, ensuite lorsque tu mets le fils en question a NULL, la modification est visible depuis r ET depuis p puisque tu modifie le contenu de la memoire pointe par r et, indirectement, par p.

  9. #9
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    merci beaucoup pour votre aide, problème résolu

  10. #10
    Membre habitué
    Inscrit en
    Novembre 2002
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 120
    Points : 125
    Points
    125
    Par défaut
    Un petit tag [résolu] alors?

  11. #11
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    euh.. Ce petit tag c'est moi qui doit le mettre? si oui comment faire?

  12. #12
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 135
    Points : 146
    Points
    146
    Par défaut
    Citation Envoyé par NomUtilisateurDejaPris
    euh.. Ce petit tag c'est moi qui doit le mettre? si oui comment faire?
    oui, c'est toi
    tu édites le premier post du thread et tu modifies le titre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Suppression dans un arbre binaire de recherche
    Par allomona dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 06/12/2014, 08h51
  2. Problème de suppression dans un arbre binaire ordonné
    Par Odenelle dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 04/01/2014, 13h18
  3. Algorithme de suppression d'un élément dans un arbre binaire de recherche
    Par mohsenuss91 dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 24/12/2011, 12h05
  4. Suppression dans un arbre binaire de recherche
    Par zeine77 dans le forum Langage
    Réponses: 1
    Dernier message: 11/05/2007, 20h40
  5. Réponses: 3
    Dernier message: 31/12/2005, 12h30

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