Pb avec les listes chainées/structures en C

Fermé
sisinfo - 16 mai 2009 à 01:41
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 16 mai 2009 à 10:23
Bonsoir, je travaille sur les listes chainées pour un projet( ici il s'agit d'ajouter un element de type Cave dans une liste) et ca fait des heures ke je tourne en rond à cause d'une erreure que me donne le compilateur lors de l'éxécution du fichier ajouterVin2.c dont l'éxécutable est ajouter2:
"4 [main] ajouter2 5820_cygtls:: handle_exceptions:Error while dumping state[probably corrupted stack]
Segmentation fault(core dumped)"

En faite je travail sous windows avec cygwin. Et merci d'avance pour votre aide.

voici le code:
//fichier vin2.h

struct Vin
{
char region[16];
char domaine[20];//domaine de cultivation(lieu)
char chateau[20];//ex:Bordeaux
char couleur[15];
int annee;
char cepage[12];//d�crit la vari�t� de plante de la vigne utilis�e pour produire le vin
int taille;
int nbBouteilles;
int anneeMat;//l'ann�e de maturit�
char localisation[4];//dans la cave
char commentaires[70];


};
//fichier cave2.h
struct Cave
{
struct Vin *carac;//les caractéristiques du vin
struct Cave *suivant;

};
//fichier ajouterVin2.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "vin2.h"
#include "cave2.h"


/**********************************************
La fonction int ajouterVin(pvin nom) renverra 0 si l'ajout du vin dans
la liste chainee se fera sans aucune erreur et 1 sinon.
*********************************************************/

int ajouterVin(struct Cave *vin,struct Cave *tete)
{
struct Cave *nouveau;
struct Cave *courant;
char *res;


if(tete==NULL)//la liste est vide, c'est donc le premier vin qui est ajouté
{
printf("Debut:1\n");
nouveau=(struct Cave*)malloc(sizeof(struct Cave));//alloue la mémoire nécessaire au nouveau maillon de la liste

if(nouveau==NULL)
{ printf("Erreure s'est produite lors de l'allocation dynamique de la mémoire dans l'ajout\n");
return 1;

}
else
{
nouveau->suivant=tete;//la tete est assigné au maillon suivant ici null car la liste est vide
tete=nouveau;
printf("Debut:1\n");
}
}//fin if

else//la liste contient au moins 1 element
{
courant=tete;

if(courant->suivant!=NULL) //parcours de la liste chaînée jusqu'au dernier maillon
{
courant=courant->suivant;

}

nouveau=(struct Cave*)malloc(sizeof(struct Cave));//alloue la mémoire nécessaire au nouveau maillon de la liste

if(nouveau==NULL)
{ printf("Erreure s'est produite lors de l'allocation dynamique de la mémoire dans l'ajout\n");
return 1;
}
else
{
printf("Debut:1\n");
courant->suivant=nouveau;
printf("Debut:1\n");
nouveau->suivant=NULL;
}

}//fin else

//insertion des caractéristiques du vin dans l'élément nouveau
res=strcpy(nouveau->carac->region,vin->carac->region);
res=strcpy(nouveau->carac->domaine,vin->carac->domaine);
res=strcpy(nouveau->carac->chateau,vin->carac->chateau);
res=strcpy(nouveau->carac->couleur,vin->carac->couleur);
nouveau->carac->annee=vin->carac->annee;
res=strcpy(nouveau->carac->cepage,vin->carac->cepage);
nouveau->carac->taille=vin->carac->taille;

free(nouveau);

return 0;

}

int main()
{
char *res;
struct Cave *vin1;

/*voici une ligne que j'ai ajouté*/
vin1=(struct Cave*)malloc(sizeof(struct Cave));

struct Cave *tete;
tete=NULL;
printf("Debut:1\n");
res=strcpy(vin1->carac->region,"Bordeaux");
res=strcpy(vin1->carac->domaine,"domaine familial");
res=strcpy(vin1->carac->chateau,"Bordeaux Côtes de francs");
res=strcpy(vin1->carac->couleur,"Rouge");
vin1->carac->annee=1993;
res=strcpy(vin1->carac->cepage,"merlot");
vin1->carac->taille=2;
vin1->carac->nbBouteilles=10;
vin1->carac->anneeMat=10;
res=strcpy(vin1->carac->localisation,"3C");
printf("fin\n");
res=strcpy(vin1->carac->commentaires,"lalalalallala");

if((ajouterVin(vin1,tete))!=0)
printf("Erreur lors de l'insertion d'un vin\n");
else
printf("Succes de l'ajout du vin\n");

return 0;
}

1 réponse

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
16 mai 2009 à 10:23
Salut,

Je n'ai pas lu tout ton code, mais à la 1ère vue j'ai remarqué ça

else//la liste contient au moins 1 element
{
courant=tete;

if(courant->suivant!=NULL) //parcours de la liste chaînée jusqu'au dernier maillon
{
courant=courant->suivant;

}


Si tu veux parcourir la liste jusqu'au dernier élément if ne suffit pas.
Ca marche peut être si la liste contient un seul élément mais s'il y a plusieurs la condition traitera toujours le 1er élément vu que courant = tete

Tu dois utiliser une boucle (for ou while)
Ce qui donnera quelque chose de genre
Avec while
else//la liste contient au moins 1 element
{
courant=tete;

while(courant->suivant != NULL)
    courant=courant->suivant;
Avec for
else//la liste contient au moins 1 element
{
for(courant=tete;courant->suivant != NULL; courant=courant->suivant)
    ;
0