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 a fils multiples


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Par défaut Arbre a fils multiples
    Bonsoir,

    Mon objectif est de créer un arbre a n fils, n n'étant pas connu au moment de la compilation et lors de l’exécution du programme. Tout se fait donc par allocation dynamique.

    J'ai donc une structure node :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct node_struct node;
     
    struct node_struct{
    	int nb;    // Le nombre que je veux stocker dans ma node
     
    	node** tabFils;    // Le tableau de fils 
    	int nbFils;    // Le nombre de fils
    };
    Et 2 fonctions permettant d'initialiser une node :
    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
     
    node* creerNULL_node(){
        node* sortie = (node*) malloc (sizeof(node*));
        sortie->nbFils = 0;
        return sortie;
    }
     
    node* creer_node(int nb){
        node* sortie = (node*) malloc (sizeof(node*));
        sortie->nb = nb;
        sortie->nbFils = 0;
        sortie->tabFils[0] = creerNULL_node();
     
        return sortie;
    }
    Déjà, juste à partir de l'appel de creer_node(), le débogueur me crie dessus comme quoi je n'ai pas le droit de toucher à mon tabFils[0].
    Ma question est : pourquoi cela ?

    J'ai tâtonné ( ou plutôt, j'ai fais n'importe quoi en espérant que ça marche ) et maintenant, je désespère. Car ça ne marche pas dès la création d'une node.

    Surtout qu'après j'ai ma fonction qui ajoute un fils qui, comme j'ai suivi le même raisonnement, devrait joyeusement planter :
    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
    void pushFils_node(node* current,int nb){
        if( current == NULL ){
            printf("pushFils_node : current = NULL\n");
            return;
        }
        node* newNode = creer_node(nb);
     
        if( current->nbFils == 0 ){
            printf("\n\nA\n");
            current->tabFils[0] = newNode;
            current->nbFils += 1;
        } else {
            printf("\n\nB\n");
            node* buffer = creerNULL_node();
            buffer = (node*) realloc (current->tabFils, (current->nbFils+1) * sizeof(node));
     
            if (buffer != NULL){
                affiche_node(current);
     
                current->tabFils[0] = buffer;
                affiche_node(current);
                current->tabFils[current->nbFils] = newNode;
                current->nbFils += 1;
     
                affiche_node(current);
            } else {
                free (current->tabFils);
                puts ("Error (re)allocating memory");
                exit (1);
            }
     
        }
    }


    Je vous remercie d'avance pour votre aide qui me permettra de sauvegarder ma santé mentale

  2. #2
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut la joie des pointeurs de pointeurs
    tu as qq confusions entre nodes, pointeurs sur nodes, et pointeurs sur tableaux de pointeurs sur nodes. c'est la joie du C.

    ligne 9 tu fais ça :
    node* sortie = (node*) malloc (sizeof(node*));
    alors que ce que tu voudrais vraiment faire, c'est plutôt :
    node* sortie = (node*) malloc (sizeof(node));
    parce que tu veux que malloc alloue la taille nécessaire pour stocker une structure node complète, et pas seulement un pointeur vers cette structure.

    lorsque tu fais sortie->tabFils[0] = creerNULL_node();
    à ce stade, sortie->tabFils est un pointeur non initialisé, donc accéder au premier élément de ce tableau est très dangereux, tu dois d'abord "allouer un tableau de pointeurs", via un autre appel à malloc.

    enfin, même si ce n'est pas relié à tes problèmes, cette façon de gérer un arbre à fils multiples n'est pas idéale, parce qu'elle est très ennuyeuse à maintenir, et coûte beaucoup d'allocations mémoires. une autre façon de faire, que perso je trouve plus simple, c'est de faire en sorte qu'une node parente ne contienne qu'un pointeur vers le premier de ses fils, et faire en sorte que chaque node contienne un pointeur vers un node "frère".

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Par défaut
    enfin, même si ce n'est pas relié à tes problèmes, cette façon de gérer un arbre à fils multiples n'est pas idéale, parce qu'elle est très ennuyeuse à maintenir, et coûte beaucoup d'allocations mémoires. une autre façon de faire, que perso je trouve plus simple, c'est de faire en sorte qu'une node parente ne contienne qu'un pointeur vers le premier de ses fils, et faire en sorte que chaque node contienne un pointeur vers un node "frère".
    J'avais commencé par cette méthode mais celle que je testais me plaisais plus.
    Je dit bien "plaisais" car j'en ai ma claque des reallocs et des pointeurs sur des tableaux de pointeurs en C ( vivement que je reprenne mon C++, j'aurais toujours les mêmes histoires mais je m'en sortirais 20 fois mieux, me demandez pas pourquoi ).

    Merci pour le rappel sur malloc, je mettais des * partout pour faire joli et ce n'était pas une bonne idée.

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

Discussions similaires

  1. lecteur code barre multiple sans fil
    Par Dimitri S. dans le forum Périphériques
    Réponses: 4
    Dernier message: 07/05/2015, 13h50
  2. Problème de récursivité : relation père fils multiple
    Par relbeghdadi dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/01/2012, 12h37
  3. Arbre : 1 fils, plusieurs père?
    Par -={-_-}=- dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 05/12/2009, 15h02
  4. Evenement sur les fils d'un arbre
    Par f.lam dans le forum WinDev
    Réponses: 4
    Dernier message: 04/04/2007, 17h26
  5. [C#]Comment avoir les fils d un noeud dans 1 arbre
    Par wodel dans le forum Windows Forms
    Réponses: 6
    Dernier message: 03/04/2006, 13h42

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