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 :

Liste chainée+Gestion dune liste client


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Par défaut Gestion dune liste client
    Bonjour je dois gérer une liste client en utilisant une liste chaînée...J'ai défini diverses fonctions pour ce faire et ensuite j'ai essayé d' insérer une nouvelle fiche client mais la "Erreur de segmentation (core dumped)".a l'aide d'un debugger j'ai trouvé l'erreur
    à la ligne 14 de mon programme:
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    #include<stdio.h>
    #include<stdlib.h>
    #include "liste_client_test.h"
     
    void inserer(l_fiches **tete,fiche_c nouvellef)
    {
    //int fin_fich;
     
    /*On insere en tete*/
    l_fiches *nouveau;
     
    nouveau=(l_fiches*)malloc(sizeof(l_fiches));//On reserve lespace pour la nouvelle fiche client
    nouveau->client=nouvellef;
    nouveau->p_suiv=*tete;
    *tete=nouveau;
    }
     
     
    l_fiches* lire_fichier()
    {
    FILE *fichier;
    fiche_c f;
    l_fiches *liste=NULL; 			//Initialisation de la liste chainee
     
    fichier=fopen("liste_client.txt","r");	//On ouvre le fichier en mode lecture
     
    while((fscanf(fichier,"%d\t%d\t%f",&(f.numero),&(f.cc),&(f.solde)))!=EOF)
    {
    inserer(&liste,f);
    }
     
    fclose(fichier);
    return liste;
    }
     
     
    void afficher(l_fiches *liste)
    {
    while(liste!=NULL)
    {
    printf("%d\t%d\t%f",liste->client.numero,liste->client.cc,liste->client.solde);
    liste=liste->p_suiv;
    }
    }
     
    l_fiches* selectionner(l_fiches* liste,int numero)
    {
    l_fiches* select=NULL;
    while(liste!=NULL)
    {
    	if(numero==(liste->client.numero))
    	{
    	select=liste;
    	return select;
    	}
    liste=liste->p_suiv;
    }
    return select;
    }
     
    void modifier(l_fiches* liste)
    {
    int numero;
    l_fiches* cherche;
    printf("Entrer le numero de client a rechercher:\n");
    scanf("%d",&numero);
    cherche=selectionner(liste,numero);
     
    if(cherche!=NULL)
    {
    printf("code: %d et solde: %f",cherche->client.cc,cherche->client.solde);
    scanf("%d",&(cherche->client.cc));
    }
    else
    {
    printf("Numero de carte introuvable\n");
    }
    }
     
     
    void sauvegarder(l_fiches* liste)
    {
    FILE *fichier;
    l_fiches *courant;
     
    if((fichier=fopen("liste_client.txt","w"))==NULL)
    {
    printf("Fichier introuvable\n");
    exit(1);
    }
    courant=liste;
    while(courant!=NULL)
    {
    fprintf(fichier,"%d\t%d\t%f\n",courant->client.numero,courant->client.cc,courant->client.solde);
    courant=courant->p_suiv;
    }
    fclose (fichier);
    }
     
    void liberer_mem(l_fiches* liste)
    {
    while(liste!=NULL)
    {
    l_fiches* courant;
    courant=liste;
    	while(courant!=NULL)
    	{
    	liste=liste->p_suiv;
    	free(courant);
    	courant=liste;	
    	}
    }
    }
     
     
    int main()
    {
    /*Insertion d'une nouvelle fiche*/
    fiche_c nouveau;
    l_fiches *tete=NULL;
    l_fiches *liste;
    printf("Veuillez entrer le numero client: \n");
    scanf("%d",&(nouveau.numero));
    printf("Veuillez entrer le code: \n");
    scanf("%d",&(nouveau.cc));
     
    liste=lire_fichier(); //On va dabord lire le ficher texte et creer la liste chainee
    inserer(&tete,nouveau);//On insere une nouvelle fiche
    afficher(liste);//On affiche la nouvelle liste
    sauvegarder(liste);//On sauvegarde
    liberer_mem(liste);//On libere la memoire
     
     
    printf("Fin\n");
    return 0;
    }
    Je vous met aussi mon .h

    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
    #ifndef liste_client_test_h
    #define liste_client_test_h
     
    typedef struct
    {
    int numero;
    int cc;
    float solde;
    }fiche_c;
     
    typedef struct l_fiches
    {
    fiche_c client;
    struct l_fiches *p_suiv;
    }l_fiches;
     
     
    void inserer(l_fiches **tete,fiche_c nouvellef);
    l_fiches* lire_fichier();
    void afficher(l_fiches *liste);
    void modifier(l_fiches* liste);
    l_fiches* selectionner(l_fiches* liste,int numero);
    void sauvegarder(l_fiches* liste);
    void liberer_mem(l_fiches* liste);
     
    #endif
    J'espère que vous pourrez m'aider à m'en dépatouiller!Dans l'attente de vos remarque...
    ++

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    Par défaut
    meme si ce n est peut etre pas la cause de ton erreur, tu as oublie de relier nouveau a l ancienne liste

    nouveau->p_suiv=*tete->p_suiv;
    *tete=nouveau;

    sinon tu n aura toujours qu une fiche dans ta liste.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Tu sais que si tu mets "&(*ptr)" c'est comme si tu mettais "ptr" tout seul ?
    Ton problème vient sans doute de la tête ! Pourquoi tu définis un pointeur de pointeur pour la tête ?
    Un pointeur simple suffit, par contre les fonctions qui vont modifier ce pointeur dans leurs paramètres (pas le type de retour hein ?) doivent avoir un pointeur de pointeur, donc il faut faire : &ptr à ce moment là.

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    l_fiches **tete;
    ....
    inserer(&(*tete),nouveau);//On insere une nouvelle fiche
    *tete est indéfini et &*tete n'a donc pas de sens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    l_fiches *tete = NULL;
    ....
    inserer(&tete,nouveau);//On insere une nouvelle fiche

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Par défaut
    Salut diogene je viens de faire les modifications que tu m'as conseillé . Maintenant j'arrive effectivement à créer ma liste mais quand je sauvegarde dans un fichier texte la nouvelle fiche n'a pas été sauvegardée...
    Ps: j'ai édité mon code plus haut

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    liste=lire_fichier(); //On va dabord lire le ficher texte et creer la liste chainee
    inserer(&tete,nouveau);//On insere une nouvelle fiche
    afficher(liste);//On affiche la nouvelle liste
    sauvegarder(liste);//On sauvegarde
    liberer_mem(liste);//On libere la memoire
    Tu as deux listes : l'une en tete et l'autre en liste. La partie fichier et affichage porte sur liste et l'insertion sur tete

  7. #7
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Citation Envoyé par boby35 Voir le message
    Salut diogene je viens de faire les modifications que tu m'as conseillé . Maintenant j'arrive effectivement à créer ma liste mais quand je sauvegarde dans un fichier texte la nouvelle fiche n'a pas été sauvegardée...
    Ps: j'ai édité mon code plus haut
    Pas besoin de 'tete'
    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
    int main() {
    	/*Insertion d'une nouvelle fiche*/
    	fiche_c nouveau;
    	l_fiches *liste;
    	printf("Veuillez entrer le numero client: \n");
    	scanf("%d", &(nouveau.numero));
    	printf("Veuillez entrer le code: \n");
    	scanf("%d", &(nouveau.cc));
     
    	liste=lire_fichier(); //On va dabord lire le ficher texte et creer la liste chainee
    	inserer(&liste, nouveau);//On insere une nouvelle fiche
    	afficher(liste);//On affiche la nouvelle liste
    	sauvegarder(liste);//On sauvegarde
    	liberer_mem(liste);//On libere la memoire
     
     
    	printf("Fin\n");
    	return 0;
    }
    Je n'ai pas testé plus loin, à vous de le faire.
    Le nommage dans inserer() me semble piégeux.
    Il ne faut pas caster les retours de malloc()

  8. #8
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Par défaut
    Citation Envoyé par dev_tours Voir le message
    meme si ce n est peut etre pas la cause de ton erreur, tu as oublie de relier nouveau a l ancienne liste

    nouveau->p_suiv=*tete->p_suiv;
    *tete=nouveau;

    sinon tu n aura toujours qu une fiche dans ta liste.

    Je viens de modifier mon programme
    mais toujours la même erreur...

Discussions similaires

  1. [AJAX] liste liée a une liste liée a une liste
    Par dirty_harry dans le forum AJAX
    Réponses: 2
    Dernier message: 03/07/2009, 11h18
  2. Liste chainée, sockets, serveur multi clients.
    Par jbarreau-mainson dans le forum Réseau
    Réponses: 4
    Dernier message: 01/05/2009, 12h15
  3. Réponses: 3
    Dernier message: 27/03/2009, 18h23
  4. Réponses: 24
    Dernier message: 30/10/2005, 09h27

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