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 :

Affichage de fiche et liste double chaînée


Sujet :

C

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2011
    Messages : 42
    Par défaut Affichage de fiche et liste double chaînée
    Bonjour.
    J'ai un problème avec ma liste chainée.
    Je n'arrive pas à afficher plus d'une fiche. Il s'affiche "erreur de segmentation".
    Pourriez vous m'aider s'il vous plait ?

  2. #2
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Quel est le but de ton exercice ?

    Une liste simplement chainée suffit.
    tout dans une seule structure simplifice aussi le codage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct sFiche
    {
        char Nom[N];
        char Prenom[N];
        struct sFiche *pSuivant;
    };
    Pas besoin de "sListeReperes".
    Tu sauvegarde bien le 1ere élément de la liste, dans le main() pour pouvoir repartir de celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    pPremiereFch=(struct sFiche*)malloc(sizeof(struct sFiche);
     
    ...
    // pour ajouter 
    pFiche = pPremiereFch;
    while (pFiche->pSuivant != NULL) ....
    Un totu mieux que mes explications.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 444
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 444
    Par défaut
    Il y a trois petites erreurs dans ton programme :

    1. « Nouvelle » au masculin s'écrit « Nouvel » ;

    2. Dans les fonctions InsListeVide() et InsFinListe(), tu alloues un maillon en trop :

      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
         void InsListeVide(struct sListeReperes *pReperes, struct sFiche *pFch)
          {
              //Declaration des variables
              struct sFicheListe *pNouvelleElement;
              //Allocation  d'un nouvelle element(maillon)
              if((pNouvelleElement=(struct sFicheListe*)malloc(sizeof(struct sFicheListe)))==NULL)
              {
                  perror("Erreur d'allocation d'un nouveau maillon");
                  exit(0);
              }
              if((pNouvelleElement->pFch=(struct sFiche*)malloc(sizeof(struct sFiche)))==NULL)
              {
                  perror("fonction InsListeVide:Erreur d'allocation pNouvelle->pFiche");
                  exit(0);
              }
              //Affectation de la fiche dans le nouvelle élément(nouveau maillon)
              pNouvelleElement->pFch=pFch;
      … en gros, tu rentres dans ta fonction en passant l'adresse de ta fiche en argument, tu intialises ta structure en allouant une nouvelle fiche, et tu remplaces l'adresse de cette nouvelle fiche par celle que tu as reçue en argument. Du coup, cela provoque une fuite de mémoire : tu ne pourras plus jamais désallouer cette fiche supplémentaire, qui de toutes façons ne sert à rien ;

    3. Tu as oublié une étape dans InsFinListe(), et c'est ce qui provoque ton erreur :

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
               //Affectation de la fiche dans le nouvelle élément(nouveau maillon)
               pNouvelleElement->pFch=pFch;
               //Initialisation des pointeur de fichier
               pNouvelleElement->pSuivant=NULL;
               pNouvelleElement->pPrecedent=pReperes->pFin;
               pReperes->pFin=pNouvelleElement;
               pReperes->NombreFiches++;
          }
      Tu as oublié de faire pointer le champ « pSuivant » de la dernière fiche sur la tienne. C'est pour cela que ta boucle plante dès le deuxième tour.

Discussions similaires

  1. Affichage d'une liste double dans un tableau
    Par G3G3 dans le forum Tkinter
    Réponses: 2
    Dernier message: 08/07/2008, 10h32
  2. Liste doublement chaînée
    Par garf dans le forum Langage
    Réponses: 3
    Dernier message: 27/09/2005, 09h33
  3. Réponses: 3
    Dernier message: 03/05/2005, 18h16

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