Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Débuter
Débuter Forum d'entraide pour débuter en langage C. Avant de poster -> FAQ C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 25/12/2012, 12h02   #1
Nardjesse
Invité de passage
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2011
Messages : 5
Points : 0
Points : 0
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 :
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?
Nardjesse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/12/2012, 15h59   #2
diogene
Responsable Modération
 
Avatar de diogene
 
Homme Patrick Gonord
Enseignant Chercheur
Inscription : juin 2005
Messages : 5 434
Détails du profil
Informations personnelles :
Nom : Homme Patrick Gonord
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Enseignant Chercheur
Secteur : Enseignement

Informations forums :
Inscription : juin 2005
Messages : 5 434
Points : 12 967
Points : 12 967
-
Code :
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 :
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 !
diogene est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 25/12/2012, 16h25   #3
Nardjesse
Invité de passage
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2011
Messages : 5
Points : 0
Points : 0
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

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

Code :
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
Nardjesse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/12/2012, 18h41   #4
diogene
Responsable Modération
 
Avatar de diogene
 
Homme Patrick Gonord
Enseignant Chercheur
Inscription : juin 2005
Messages : 5 434
Détails du profil
Informations personnelles :
Nom : Homme Patrick Gonord
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Enseignant Chercheur
Secteur : Enseignement

Informations forums :
Inscription : juin 2005
Messages : 5 434
Points : 12 967
Points : 12 967
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 :
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 !
diogene est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 25/12/2012, 18h58   #5
Nardjesse
Invité de passage
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2011
Messages : 5
Points : 0
Points : 0
Ah merci! désolée pour ma précédente modification, je vais réessayé
Nardjesse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 11h06   #6
diogene
Responsable Modération
 
Avatar de diogene
 
Homme Patrick Gonord
Enseignant Chercheur
Inscription : juin 2005
Messages : 5 434
Détails du profil
Informations personnelles :
Nom : Homme Patrick Gonord
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Enseignant Chercheur
Secteur : Enseignement

Informations forums :
Inscription : juin 2005
Messages : 5 434
Points : 12 967
Points : 12 967
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 :
1
2
        strcpy(new_elt->mot,m);
        strcpy(new_elt->syno,s);
- 2 : Puisque m et s sont des tableaux, on a :
Code :
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 !
diogene est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/12/2012, 22h50   #7
Nardjesse
Invité de passage
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2011
Messages : 5
Points : 0
Points : 0
Merci beaucoup! ça marche nickel
Encore merci.
Nardjesse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2012, 19h57   #8
Nardjesse
Invité de passage
 
Femme
Étudiant
Inscription : novembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2011
Messages : 5
Points : 0
Points : 0
Alors, une dernière question.
Je voudrais juste savoir si c'est possible d'utiliser la fonction 'strcmp' comme ceci:


Code :
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
Nardjesse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2013, 11h51   #9
LittleWhite
Responsable 2D/3D/Jeux


 
Avatar de LittleWhite
 
Homme Alexandre Laurent
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 10 444
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Laurent
Localisation : France

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

Informations forums :
Inscription : mai 2008
Messages : 10 444
Points : 40 264
Points : 40 264
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
La rubrique a aussi un blog !

Ma page sur DVP
Mon Portfolio

Qui connaît l'erreur, connaît la solution.
LittleWhite est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 19h30.


 
 
 
 
Partenaires

Hébergement Web