1. #1
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    avril 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Biens de consommation

    Informations forums :
    Inscription : avril 2016
    Messages : 32
    Points : 25
    Points
    25

    Par défaut Affichage liste chaînée - éléments manquants

    Bonjour, j'ai un souci avec mon programme que je n'arrive pas à comprendre.

    Ma fonction d'affichage ne marche pas correctement, il m'affiche non seulement pas tous les éléments qui dans ma liste, mais aussi elle ne m'affiche le dernier élément n-1 fois.
    Exemple si je saisie trois chaines, la fonction m'affiche la dernière 2 fois. Je vous mets tout le code.
    fichier.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    struct cellule
    {
    	char *chaine;
    	struct cellule *suivant;
    };
    typedef struct cellule cellule;
    struct liste
    {
    	cellule * debut;
    	cellule *fin;
    	int taille;
    };
    typedef struct liste liste;
    en plus le fichier principal
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "exo5.h"
    #define MAX 1000
     
    //fonction 'affichage
     
    void affiche(liste *list){
    	cellule * tmp=list->debut;
    	while(tmp->suivant!=NULL)
    	{
    		printf("%s ",tmp->chaine);
    		tmp->suivant=tmp->suivant->suivant;
    	}
    	printf("\n");0
    }
     
    //fonction d'initialisation
     
    void initialiser(liste * l)
    {
    	l->debut=NULL;
    	l->fin=NULL;
    	l->taille=0;
    }
    //le main
     
    int main()
    {
     
    	unsigned int taille;
    	printf("saisir la taille du tableau: \n");
    	scanf("%u",&taille);
    	char buffer[MAX];
    	cellule * tmp;
    	//creation de la liste
    	liste *list = malloc(sizeof(liste));
    	initialiser(list);
    	for(int i=0; i<taille;i++)
    	{
    		printf("Saisir mois %d\n",i+1);
    		scanf("%s", buffer);
    		cellule *c= malloc(sizeof(cellule));//creation de la cellule
    		c->chaine = (char*) malloc(strlen(buffer)*sizeof(char)+1);//allocation du tableau de char
    		strcpy(c->chaine,buffer);//affectation de la chaine au champ chain de cellule
    		if(list->debut==NULL)
    		{
    			list->debut=c;
    			list->fin=c;
    		}
    		else{
    			tmp=list->debut;
    			list->debut=c;
    			c->suivant=tmp;
    		}
    		list->taille++;
     
    	}
    	affiche(list);
    }
    Merci d'avance pour vos aides.

  2. #2
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    juin 2007
    Messages
    2 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 2 693
    Points : 7 844
    Points
    7 844

    Par défaut

    Le problème principal est dans la fonction d'affichage.

    Voici les corrections requises (lignes 11 et 14) et deux suggestions d'amélioration:

    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
    $ diff exo.c.20180310-010033 exo.c   
    11c11
    <       while(tmp->suivant!=NULL)  // tu n'affiches pas le dernier élément
    ---
    >       while(tmp!=NULL)
    14c14
    <               tmp->suivant=tmp->suivant->suivant; // ici tu ne parcours pas la liste mais tu la corrompt
    ---
    >               tmp=tmp->suivant;
    45,46c45
    <               c->chaine = (char*) malloc(strlen(buffer)*sizeof(char)+1);//allocation du tableau de char
    <               strcpy(c->chaine,buffer);//affectation de la chaine au champ chain de cellule
    ---
    >               c->chaine = strdup(buffer); // c'est plus simple comme ça !
    53,55c52,53
    <                       tmp=list->debut;
    <                       list->debut=c;
    <                       c->suivant=tmp;
    ---
    >                       list->fin->suivant=c; // il est plus simple d'ajouter un élément à la fin de la liste plutôt qu'au début, et en plus, elle sera affichée dans l'ordre de saisie
    >                       list->fin=c;
    ɹǝsn *sıɹɐlos*

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    avril 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Biens de consommation

    Informations forums :
    Inscription : avril 2016
    Messages : 32
    Points : 25
    Points
    25

    Par défaut

    Merci beaucoup M., ca marche bien maintenant.

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

Discussions similaires

  1. Problème de listes chaînées
    Par harmonia1981 dans le forum C
    Réponses: 2
    Dernier message: 18/02/2010, 11h45
  2. Probléme affichage liste déroulante avec I.E.
    Par desperados91 dans le forum ASP
    Réponses: 3
    Dernier message: 23/11/2009, 14h52
  3. Réponses: 9
    Dernier message: 26/09/2007, 17h21
  4. Problème de listes chaînées ou de saisie
    Par mathrb dans le forum C
    Réponses: 7
    Dernier message: 12/03/2007, 12h52
  5. Problème Mailing-List ASP avec CDO et access
    Par francois_pignon dans le forum ASP
    Réponses: 3
    Dernier message: 04/06/2006, 21h31

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