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 :

Problème affichage d'une liste chainée


Sujet :

C

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Problème affichage d'une liste chainée
    Bonjour!
    Alors voilà, je débute en C et je cherche à écrire un programme qui lit les mots et leurs synonymes et les mets dans une liste.

    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
    #include<stdio.h>
    #include<stdlib.h>
     
     
    typedef struct element telement;
    struct element
    {
        char* mot;
        char* syno;
        struct element*suivant;
     
    };
    typedef telement*tliste;
     
    tliste ajouter(tliste liste, char* m, char* s)
    {
        telement*new_elt=malloc(sizeof(telement));
            new_elt->mot=m;
            new_elt->syno=s;
            new_elt->suivant=liste;
            liste=new_elt;
            return liste;
     
    }
     
    void afficher(tliste liste)
    {
        telement*temp=liste;
        while(temp!=NULL)
        {
            printf("%s :%s\n",temp->mot,temp->syno);
            temp=temp->suivant;
        }
    }
     
     
    int main()
    {
        tliste dico=NULL;
        char* m;
        char* s;
        int i, x;
        printf("Donnez le nombre de mots");
        scanf("%d",&i);
        for(x=1;x<=i;x++)
        {
      printf("Donnez le mot puis sa signification  ");
        scanf("%s",&m);
        scanf("%s",&s);
        dico=ajouter(dico, m, s);
     
        }
    printf("Votre liste est:\n");
    afficher(dico);
     
    return 0;
     
    }
    Rien à la compilation, mais il plante toujours à l'execution quand il arrive à la fonction 'afficher'. J'ai essayé plusieurs variantes pour la fonction mais rien n'y fait. Je ne vois vraiment pas où est le problème.
    Qu'en pensez-vous?

  2. #2
    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
        char* m;
        char* s;
    ...
        scanf("%s",&m);
        scanf("%s",&s);
    Pour stocker une chaine de caractères, il faut un tableau (suffisamment grand), pas un pointeur. Un pointeur est uniquement fait pour stocker une adresse. On doit donc avoir quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        char m[100];
        char s[100];
    ...
        scanf("%s",m);
        scanf("%s",s);
        dico=ajouter(dico, m, s);
    - Dans la fonction ajouter, les champs mot et syno sont remplis avec l'adresse des tableaux m et s du main(). Ils stockerons donc tous la même adresse et lors de l'affichage on obtiendra pour tous les éléments de la liste la même sortie, à savoir la dernière entrée dans les tableaux m et s.
    IL faut donc copier dans le maillon non pas l'adresse des tableaux mais le contenu (allocation dynamique + strcpy())
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Ah d'accord!
    Il n'y donc aucun autre moyen pour stocker une chaine de caractères? Parce que dans l'énoncé de l’exercice nous ne devons utiliser que les listes

    Edit:
    Euh non finalement j'ai du mal comprendre l'énoncé. Par contre j'ai essayé avec les modifications et ça m'affiche un truc bizarre à l'execution.
    Juste pour tenter j'ai entré les mots Claque et Frappe et voila ce qu'il m'affiche

    Votre liste est:
    π(a l'envers)7< : µces
    Voici le nouveau code, je me suis surement gouré en le modifiant:

    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
    typedef struct element telement;
    struct element
    {
        char mot[50];
        char syno[50];
        struct element*suivant;
     
    };
    typedef telement*tliste;
     
    tliste ajouter(tliste liste, char m, char s)
    {
        telement*new_elt=malloc(sizeof(telement));
            new_elt->mot[50]=m;
            new_elt->syno[50]=s;
            new_elt->suivant=liste;
            liste=new_elt;
            return liste;
     
    }
     
    void afficher(tliste liste)
    {
        telement*temp=liste;
        while(temp!=NULL)
        {
            printf("%s :%s\n",temp->mot,temp->syno);
            temp=temp->suivant;
        }
    }
     
     
    int main()
    {
        tliste dico=NULL;
        char m[50];
        char s[50];
        int i, x;
        printf("Donnez le nombre de mots");
        scanf("%d",&i);
        for(x=1;x<=i;x++)
        {
      printf("Donnez le mot puis sa signification  ");
        scanf("%s",&m);
        scanf("%s",&s);
        dico=ajouter(dico, m, s);
     
        }
    printf("Votre liste est:\n");
    afficher(dico);
     
    return 0;
     
    }
    C'est la première fois que j'utilise une chaine de caractères dans une liste

  4. #4
    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
    Il s'agit toujours d'utiliser les listes.
    Chaque maillon de la liste comporte toujours les deux champs mot et syno, mais au lieu d'y copier l'adresse de la chaine d'origine, on alloue de la mémoire pour en faire un duplicata suivant le modèle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    new_elt->mot= malloc(strlen(m)+1);
    strcpy(new_elt->mot, m);
    Note : pour une bonne programmation les allocations dynamiques doivent être testées pour vérifier leur réussite
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Ah merci! désolée pour ma précédente modification, je vais réessayé

  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
    Sur ton code modifié, que j'ai vu après mon précédent message, quelques commentaires :

    - 1 : Tu as modifé la structure d'un maillon pour placer des tableaux. C'est une option qui a l'avantage de ne pas demander d'allocation dynamique supplémentaire ce qui simplifie la création/destruction d'un maillon. Elle a l'inconvénient de fixer la taille des tableaux qui ne seront donc pas dimensionnés de façon optimale en fonction de la chaine à recevoir.
    Avec cette option, il faut effectuer également la copie des tableaux ce qui ne se fait pas de cette façon, mais par exemple par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            strcpy(new_elt->mot,m);
            strcpy(new_elt->syno,s);
    - 2 : Puisque m et s sont des tableaux, on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        scanf("%s",m);
        scanf("%s",s);
    m et s sont dans ce contexte déjà l'adresse des premiers éléments des tableaux et il ne faut pas mettre le '&'
    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
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup! ça marche nickel
    Encore merci.

  8. #8
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Alors, une dernière question.
    Je voudrais juste savoir si c'est possible d'utiliser la fonction 'strcmp' comme ceci:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    telement*new_elt=malloc(sizeof(telement));
        tliste temp, p;
        temp=liste;
        p=temp->suivant;
        int res, res1; 
    .
    .
    .
    res=strcmp(temp->mot, new_elt->mot);
     res1=strcmp(p->mot, new_elt->mot);
    Pour comparer et mettre la liste dans l'ordre alphabétique. L'utilisation est-elle juste?
    Merci

  9. #9
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 288
    Points
    218 288
    Billets dans le blog
    117
    Par défaut
    Bonjour,

    Je trouve que la meilleure façon de savoir, c'est de tester . Et si ça marche pas, de pas tout supprimer d'un coup, mais de comprendre pourquoi il y a erreur (en lisant la documentation de la fonction, ou voir ce que dit le compilateur).

    Sinon, cela me semble ok.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. Problème affichage d'une liste déroulante
    Par rob1son76 dans le forum IHM
    Réponses: 6
    Dernier message: 30/10/2012, 13h24
  2. [JSTL] problème affichage d'une list
    Par Echap dans le forum Taglibs
    Réponses: 0
    Dernier message: 28/09/2011, 04h20
  3. Sous WSS 3.0 problème affichage d'une liste
    Par aurel80 dans le forum Configuration
    Réponses: 9
    Dernier message: 09/09/2009, 13h25
  4. Sous WSS 3.0 problème affichage d'une liste
    Par aurel80 dans le forum SharePoint
    Réponses: 9
    Dernier message: 09/09/2009, 13h25
  5. Réponses: 28
    Dernier message: 24/05/2006, 19h20

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