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 ?
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 ?
Quel est le but de ton exercice ?
Une liste simplement chainée suffit.
tout dans une seule structure simplifice aussi le codage :
Pas besoin de "sListeReperes".
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; };
Tu sauvegarde bien le 1ere élément de la liste, dans le main() pour pouvoir repartir de celui-ci :
Un totu mieux que mes explications.
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) ....
Il y a trois petites erreurs dans ton programme :
- « Nouvelle » au masculin s'écrit « Nouvel » ;
- Dans les fonctions InsListeVide() et InsFinListe(), tu alloues un maillon en trop :
… 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 ;
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;
- Tu as oublié une étape dans InsFinListe(), et c'est ce qui provoque ton erreur :
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.
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++; }
Partager