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 :

listes chainées, extraction d'un element


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    Points : 10
    Points
    10
    Par défaut listes chainées, extraction d'un element
    Bonjour a tous,

    Je dois ecrire des fonctions de manipulation de listes chainées et j'ai un probleme pour la fonction d'extraction d'un element en fin de liste. La fonction doit retourner un pointeur sur le premier element de la liste.
    Quand je teste ma fonction j'ai une "Erreur de segmentation".Je n'arrive pas a identifier le probleme.

    voici ma fonction:

    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
     
    //pliste est un pointeur sur le 1er element de la liste chainée et *ppel est un pointeur destiné a recevoir l'adresse de l'element extrait.
     
    P_un_elem_liste extraire_elem_fin_liste(P_un_elem_liste pliste, P_un_elem_liste *ppel)
    {
    	P_un_elem_liste pp;
     
    	if (pliste == NULL){
    		*ppel = NULL;
    		return *ppel;
    	}
    	while (pliste->suiv != NULL){               
    		pp = pliste;                          
    		pliste = pliste->suiv;                        
    	}
    	*ppel = pliste;
    	return pp;
    }
    voici la structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct _un_elem_liste *P_un_elem_liste;
     
    typedef struct _un_elem_liste
    	{
    	Tval val;
    	P_un_elem_liste suiv;
    	} Un_elem_liste;
    Merci d'avance.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Je pense que tu dois initialiser le pointeur pp au début de ta fonction, car par exemple si la liste chaînee n'a qu'un seul élément, la fonction retourne alors une adresse bidon vu que la boucle while est contournée et que par conséquent aucune valeur n'a été donné à pp.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    P_un_elem_liste pp=pliste;
    Dis-nous ce que ça donne.
    Si ça ne marche toujours pas, essaye de fournir un code compilable qui génère le problème.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    toujours "Erreur de segmentation"

  4. #4
    Invité
    Invité(e)
    Par défaut
    Es tu certain que le pointeur pliste->suiv du dernier élément de ta liste est bien à NULL. Par exemple, il me semble qu'il faudrait faire, à la fin de ton code

    pp->suiv=NULL;

    Si ce n'est pas le cas, alors la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (pliste->suiv != NULL){               
    		pp = pliste;                          
    		pliste = pliste->suiv;                        
    	}
    provoquera probablement une erreur de segmentation.

    Tu dois pouvoir voir ce qui se passe en traçant cette boucle (par exemple en affichant les valeurs des éléments de liste que tu traverses)

    Francois

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    Merci pour ta reponse

    Comme ca marche toujours pas j'envoie le code de ma fonction avec tous les fichiers necessaire pour le compiler.Je pense que tout y est.


    listes.c:
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include "listes.h"
    #include "Tval.h"
     
    /****************************************************************************************/
    /* Pour extraire le dernier element d'une liste                                            */
    /****************************************************************************************/
    P_un_elem_liste extraire_elem_fin_liste(P_un_elem_liste pliste, P_un_elem_liste *ppel)
    {
     
    	P_un_elem_liste pp=pliste;
     
    	if (pliste == NULL){
    		*ppel = NULL;
    		return *ppel;
    	}
    	while (pliste->suiv != NULL){
    		pp = pliste;
    		pliste = pliste->suiv;
    	}
    	*ppel = pliste;
    	return pp;
    }
     
    /****************************************************************************************/
    /* Pour inserer un element dans une liste                                            */
    /****************************************************************************************/
    P_un_elem_liste inserer_elem_fin_liste(P_un_elem_liste pliste, P_un_elem_liste pel)
    {
    	P_un_elem_liste p=pliste;
    	if(!pliste) return pel;
    	while(pliste->suiv!=NULL){
    	   pliste=pliste->suiv;
    	}
    	pliste->suiv=pel;
    	return p;
    }
    /****************************************************************************************/
    /* Pour creer un element d'une liste                                            */
    /****************************************************************************************/
    P_un_elem_liste creer_elem_liste(Tval val)
    {
     
       P_un_elem_liste pel;
     
       pel = (P_un_elem_liste)malloc(sizeof(Un_elem_liste));
        if(!pel){
        fprintf (stderr,"allocation impossible");
        exit(EXIT_FAILURE);
      }
     
       pel->val = copier_val(val);
     pel->suiv = NULL;
       return pel;
    }
    /****************************************************************************************/
    /* pour detruire un element d'une liste                                                        */
    /****************************************************************************************/
    P_un_elem_liste detruire_elem_liste(P_un_elem_liste pel)
    {
       detruire_val(pel->val);
       free(pel);
       return NULL;
    }
     
    /****************************************************************************************/
    /* Pour afficher le contenu de la liste                                                         */
    /****************************************************************************************/
    void afficher_liste(FILE *flux, P_un_elem_liste pliste)
    {
    	while (pliste != NULL){
    		afficher_val(flux,pliste->val);
    		pliste=pliste->suiv;
    	}
    }
    /********************************************************************************/
    /* Pour lire la liste dans un fichier texte                                            */
    /*********************************************************************************/
    P_un_elem_liste lire_liste(FILE *flux)
    {
        Tval pval;
        P_un_elem_liste p=NULL;
        while(lire_val(flux,&pval)!=EOF){
           p=inserer_elem_fin_liste(p,creer_elem_liste(pval));
           detruire_val(pval);
      }
      return p;
    }
    listes.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
    #ifndef LISTES
    #define LISTES
     
    #include "Tval.h"
     
    /*****************************************************************************/
    /* Definition de la structure liste.                                         */
    /*****************************************************************************/
    typedef struct _un_elem_liste *P_un_elem_liste;
     
    typedef struct _un_elem_liste
    	{
    	Tval val;
    	P_un_elem_liste suiv;
    	} Un_elem_liste;
    /********************************************************************************************/
    /* Prototype de la fonction                                                                             */
    /********************************************************************************************/
    P_un_elem_liste extraire_elem_fin_liste(P_un_elem_liste pliste, P_un_elem_liste *ppel);
    P_un_elem_liste inserer_elem_fin_liste(P_un_elem_liste pliste, P_un_elem_liste pel);
    P_un_elem_liste creer_elem_liste(Tval val);
    P_un_elem_liste detruire_elem_liste(P_un_elem_liste pel);
    void afficher_liste(FILE *flux, P_un_elem_liste pliste);
    P_un_elem_liste lire_liste(FILE *flux);
    Tval.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
     
     
    #ifndef TVAL_INT
    #define TVAL_INT
     
     
    typedef int Tval;
    /*****************************************************************************/
    /* Fonctions de manipulation du type Tval                                    */
    /*****************************************************************************/
    void afficher_val (FILE *flux, const Tval val);
    int lire_val(FILE *flux, Tval *pval);
    Tval copier_val(const Tval val);
    Tval detruire_val(Tval val);
     
    #endif
    le main
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "Tval.h"
    #include "listes.h"
     
    int main() {
      P_un_elem_liste pliste;
      P_un_elem_liste pliste1;
      P_un_elem_liste *ppel;
      FILE *f1;
      FILE *f2;
     
      if((f1=fopen ("test_fic.txt","r"))==NULL){
        printf("Erreur lors de l'ouverture du fichier");
        exit(EXIT_FAILURE);
      }
      if((f2=fopen ("test_fic.txt_2","w"))==NULL){
        printf("Erreur lors de l'ouverture du fichier");
        exit(EXIT_FAILURE);
     
     pliste = lire_liste(f1);
     pliste1 = extraire_elem_fin_liste(pliste,ppel);
     afficher_liste(f2,pliste1);
      return 0;
    }
    Merci

  6. #6
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main() {
    ....
      P_un_elem_liste *ppel;
    ....
     pliste1 = extraire_elem_fin_liste(pliste,ppel);
    ppel n'est pas initialisé : Dans la fonction extraire_elem_fin_liste *ppel va planter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main() {
    ....
      P_un_elem_liste ppel;
    ....
     pliste1 = extraire_elem_fin_liste(pliste,&ppel);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    Merci c'est resolu, c'est la solution donné par fcharton qui m'a permis de regler mon probleme.

    merci a tous

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Un petit conseil aussi. Il ne faut pas tester un pointeur de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (!pointeur) { ...blabla... }
    mais plutôt comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (pointeur==NULL) { ...blabla... }
    Il y en a plusieurs qui traînent dans tes fichiers.

    La norme C90 dit que la valeur de NULL est définie par l'implémentation. Donc, même si NULL est généralement défini comme l'adresse 0, il est préférable de tester un pointeur avec NULL et non 0. Car en cas de valeur différente, c'est le bug assuré.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. inserer un element d'une liste chainée au bon endroit
    Par kazuzu dans le forum Débuter
    Réponses: 2
    Dernier message: 01/03/2010, 14h52
  2. Réponses: 6
    Dernier message: 25/07/2009, 09h21
  3. Comment avoir plusieurs elements dans une liste chainée
    Par line86 dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 01/05/2008, 21h18
  4. Liste chainé supprimer un element
    Par line86 dans le forum C
    Réponses: 7
    Dernier message: 20/09/2007, 17h17
  5. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25

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