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 :

graphe généalogique en c


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Par défaut graphe généalogique en c
    Bonsoir chers amis. J'aimerais votre aide sur ce tp
    On souhaite faire une appli pour créer et manipuler un graphe généalogique où les personnes seront reliées entre elles via leurs liens de parenté.
    Une variable de type PERSONNE est un pointeur sur une structure pour stocker (le père, la mère, etc.).
    Une liste de PERSONNE est une liste chaînée , permettant de stocker des objets de type PERSONNE.
    J'ai proposé la définition des structures suivantes.Pensez vous que c'est correcte ? Sinon proposez moi des améliorations.
    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
     
     
    typedef struct Personne_struct Personne_struct ;
    struct Personne_struct
    {   int numero;
         char * nom ;
        char *prénom ;
        int annee_nais;
        int annee_deces;
        Personne_struct *pere;
        Personne_struct *mere;
        liste conjoint;
        liste ex_conjoint;
        liste enfant;
     
    };
     
    typedef struct Personne_list Personne_list ;
    struct Personne_list
    {
        Personne_struct personne;
        Personne_struct *suivant;
    }
     
    typedef struct liste liste ;
    struct liste
    {
     
        Personne_list *premier;
    }

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Deux remarques à chaud :

    1- on ne dit pas "condjoint"
    2- on parle d'arbre généalogique alors pourquoi avoir une liste chaînée alors qu'il faudrait un.....arbre ?

  3. #3
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Par défaut Abre généalogique en c
    Merci pour la remarque.
    En fait le tp a un but pédagogique. C'est de pouvoir savoir manipuler les listes chaînées.Elles serviront à manipuler les enfants et les conjoints ou ex-conjoints d'une personne.
    Merci

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    OK c'est une précision importante pour justifier l'usage de la liste chaînée.

    Dans ce cas une dernière remarque importante : supprime ton type liste et utilise Personne_liste directement. Cacher un pointeur derrière un typedef est souvent source de complexité. De plus cela serait plus symétrique dans la définition de ta structure, au niveau des champs. En effet tes types perso sont déjà utilisés avec des pointeurs.

    Personnellement, j'aurais simplement appelé Personne_struct Personne et Personne_liste Groupe

  5. #5
    Membre averti
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Par défaut Abre généalogique en c
    si j'ai bien compris on aura :
    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
     
    typedef struct Personne_struct Personne_struct ;
    struct Personne_struct
    {   int numero;
         char * nom ;
        char *prénom ;
        int annee_nais;
        int annee_deces;
        Personne_struct *pere;
        Personne_struct *mere;
       struct Personne_list *conjoint;
      struct Personne_list *ex_conjoint;
      struct Personne_list *enfant;
     
     
    *
    };
    *
    typedef struct Personne_list Personne_list ;
    struct Personne_list
    {
        Personne_struct personne;
        Personne_struct *suivant;
    }
    typedef Personne_list * llist;
    *
    sinon merci d'être plus explicite.

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Puisque ta structure de liste contient un pointeur, tu n'as pas besoin de mettre un pointeur de liste dans ta structure personne.

    Pourquoi faire une structure de liste, pour le frere, alors que tu n'en as pas fait pour le pere ou la mere?

    Si tu avais les liens vers les freres (plus proches aine et cadet), tu n'aurais pas besoin d'un pointeur de liste de fils.
    Le fils ainé suffirait à avoir toute la fratrie.

    Prévois-tu vraiment d'avoir plusieurs conjoints? ca existe, ca n'est pas le débat, mais je doute que ce soit l'attente du sujet de TP.
    Si ce n'est pas le cas, un simple pointeur de personne suffirait.

    Attention toutefois, tous tes pointeurs ne se valent pas!
    Certains correspondent à des allocations, tandis que d'autres sont des simples références.
    Pour gérer proprement la mémoire, il faudra libérer chaque allocation une et une seule fois.
    Je pense que garder à coté des généalogies une liste de toutes les personnes allouées permettrait de ne pas te tromper.

    C'est un vrai problème, qu'il faut toujours garder en tête.

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Ton dernier typedef n'est pas utilisé. Tu ne dois pas mettre d'accent dans tes noms.

    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
    typedef struct Personne Personne;
     
    struct Personne
    {
        int numero;
        char *nom;
        char *prenom;
        int annee_nais;
        int annee_deces;
        Personne *pere;
        Personne *mere;
        struct Groupe *conjoint;
        struct Groupe *ex_conjoint;
        struct Groupe *enfant;
    };
     
    typedef struct Groupe Groupe;
     
    struct Groupe
    {
        Personne personne;
        Personne *suivante;
    };
    Je m'interroge quand même sur la définition de ton groupe et de sa capacité en faire une liste chainée. Normalement, un élément d'une liste chainée contient la donnée qui nous intéresse (ici, une personne) et un pointeur vers un autre élément. Ici, tu as bien la donnée, mais tu as un pointeur vers une autre personne et non vers un autre élément de ta liste. Comment comptes-tu parcourir ta liste (d'un point de vue algorithmie) ?

Discussions similaires

  1. Classe pour la création d'un graphe xy
    Par Bob dans le forum MFC
    Réponses: 24
    Dernier message: 03/12/2009, 17h20
  2. [Turbo Pascal] [Windows XP] Problème avec l'unité GRAPH
    Par themofleur dans le forum Turbo Pascal
    Réponses: 22
    Dernier message: 29/03/2003, 22h43
  3. Perl & Graphes
    Par makram9999 dans le forum Modules
    Réponses: 4
    Dernier message: 24/03/2003, 11h24
  4. [] [Excel] Exporter un graphe MSChart vers Excel
    Par Gonzo dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/12/2002, 17h49
  5. Concerne les graphes
    Par mcr dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 12/11/2002, 11h02

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