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 :

Problème avec structure arbre


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut Problème avec structure arbre
    Bonjour,

    Voila j'ai encore un soucis qui est le suivant, j'ai une fonction qui me permet de libérer un arbre seulement voila elle n'arrête pas de boucler sur le fils gauche et je n'arrive vraiment pas à voir pourquoi
    La voici:

    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
    void libere_arbre (arbre *p)
    {
        if ((*p)->gauche != NULL)
        {
            libere_arbre (&(*p)->gauche);
        }
        if ((*p)->droite != NULL)
        {
            libere_arbre (&(*p)->droite);
        }
        free (*p);
        *p = NULL;
     
        return ;
    }
    Merci d'avance

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    C'est pas évident à voir comme ça. Il faudrait que tu postes le code en entier, ou au moins une partie compilable.

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    C'est vrai que cela manque un peu de code.

    Au fait, j'espère que arbre est un pointeur sur structure (et pas une structure).
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    Oui puisque voici la structure que j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct charArbre
    {
            char data; 
            struct charArbre *gauche; 
            struct charArbre *droite;
    } *arbre;
    Le problème est que faire un main demande que je fasse un fichier assez énorme avec beaucoup de fonctions et que le soucis que j'ai ce produit dans un cas vraiment particulier. Je vais essayé de le résumer. Je créer un arbre contenant le contenu d'une liste chaîné ensuite j'utilise l'arbre pour faire quelque manipulation (sans le modifier puisque je vérifie son contenu avant et après le traitement et le résultat est même) et lorsque je fais "libere_arbre(&a)" ma fonction boucle tout le temps dans le test:
    J'espère avoir été assez clair.

  5. #5
    Membre confirmé
    Femme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 339
    Points : 586
    Points
    586
    Par défaut
    Elle boucle sur la libération du fils gauche parce que la condition de fin n'est pas prise en compte (et donc ça ne passe jamais au deuxieme appel récursif pour le fils droit).

    Es-tu sûr de bien manipuler le free() ?
    Un free(p) ne suffit-il pas ?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    Non car c'est un pointeur sur mon arbre que je passe à ma fonction et non l'arbre tout court. Et oui la raison que tu as donné est la bonne mais c'est justement le pourquoi que je n'arrive pas à saisir...

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 487
    Points : 294
    Points
    294
    Par défaut
    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
    void libere_arbre (arbre p)
    {
        if (p->gauche != NULL)
        {
            libere_arbre (p->gauche);
        }
        if (p->droite != NULL)
        {
            libere_arbre (p->droite);
        }
        free (p);
        p = NULL;
     
        return ;
    }

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    @dot-_-net: Je ne pense pas que ce soit une amélioration.

    scary: Vérifie que tu n'as pas de cycle dans ton arbre, avec une fonction de parcours normale (sans chercher à modifier l'arbre).

    Si ta fonction de parcours ne se termine pas, c'est que l'arbre contient un cycle --> erreur.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    En effet ceci était LA vérification à faire, j'ai afficher mon arbre juste avant de la libérer et je me suis aperçu qu'il n'était même pas strictement binaire (si mon arbre n'est pas strictement binaire la fonction s'arrête) alors qu'il l'est à la création, et j'ai vu que c'était parce que je libérait la liste qui utilise mon arbre juste avant et donc que les adresses correspondant aux nœud de mon arbre ne correspondaient plus du tout à rien et donc qu'il plantait, j'ai donc fait l'inverse libérer mon arbre puis ma liste et la sa marche très bien.

    Merci beaucoup de ce petit conseil qui m'a bien aidé

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

Discussions similaires

  1. Problème avec les arbres
    Par madjidri dans le forum C
    Réponses: 2
    Dernier message: 06/12/2007, 01h09
  2. Problème avec structure dans une fonction
    Par Saliman dans le forum C
    Réponses: 2
    Dernier message: 22/11/2007, 11h45
  3. Problème avec un arbre
    Par coco38 dans le forum Prolog
    Réponses: 6
    Dernier message: 03/11/2007, 16h21
  4. Problème avec les arbres
    Par isoman dans le forum C
    Réponses: 6
    Dernier message: 23/02/2007, 18h51
  5. [Tableaux] Problème avec un arbre de sélection
    Par grumly22 dans le forum Langage
    Réponses: 24
    Dernier message: 29/05/2006, 14h05

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