Rechercher : dans
Par :

Pb avec les listes chainées/structures en C

Dernière réponse le 16 mai 2009 à 10:23:31 sisinfo, le 16 mai 2009 à 01:41:10 
 Signaler ce message aux modérateurs

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;
}

Configuration: Windows XP Internet Explorer 7.0

Meilleures réponses pour « pb avec les listes chainées/structures en C » dans :
Liste simplement chaînée VoirLISTES SIMPLEMENT CHAINÉES Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la liste IV. Opérations sur les listes chaînées A. Initialisation B. Insertion d'un élément dans la liste 1. Insertion...
Les files en langage C VoirLes files - Premier Entré Premier Sorti Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la file IV. Opérations sur les files A. Initialisation B. Insertion d'un élément dans la file C. Oter un...
Liste doublement chaînée VoirLISTES DOUBLEMENT CHAINÉES Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la liste IV. Opérations sur les listes doublement chaînées A. Initialisation B. Insertion d'un élément dans la liste 1....
Langage C - Les listes chaînées VoirLa notion de structure autoréferrentielle Une structure autoréferrentielle (parfois appelée structure récursive) correspond à une structure dont au moins un des champs contient un pointeur vers une structure de même type. De cette façon on crée...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...
Les structures en langage C VoirDifférence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de...

1

 lami20j, le 16 mai 2009 à 10:23:31

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)
    ;
106485010510997108

Répondre à lami20j