Oui.Envoyé par benjiprog
J'ai affecté l'adresse de mon nouvel élement (nom) à mon pointeur (suivant) seulement les noms et ages saisies au clavier ne s'affiche pas y'a t'il un problème dans ma fonction d'affichage?
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 #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> #define LG 10 struct element{ /*Déclaration de la structure*/ char nom[LG+1]; int age; struct element *suivant; /*Pointeur sur l'élément suivant*/ }; void creation (struct element * *); /*Prototype des fonctions*/ void affiche (struct element *); int main (void) { struct element *fiche; creation(&fiche); affiche(fiche); getch (); return (0); } /*********Fonction de création de liste chainée**********/ void creation (struct element * *adr) { char nom[LG+1]; int age; struct element *courant; /*Pointeur pour l'échange de valeur et réservation mémoire*/ printf ("Entrer un nom vide pour terminer\n\n"); *adr=NULL; /*Initialisation du tout début de liste*/ while (1) { printf ("Nom :"); gets(nom); if (!strlen(nom)) break; /*Sortie de boucle si nom vide*/ printf ("Age :"); scanf ("%d",&age); getchar(); courant=(struct element *)malloc (sizeof(struct element)); /*réservation mémoire*/ strcpy(courant->nom,nom); courant->age=age; courant->suivant=(struct element *)&nom; } } /*******Fonction d'affichage de la liste chainée******/ void affiche (struct element *point) { printf ("\n\tNOM\tAGE\n\n"); while (point) { printf ("%12s",point->nom); printf ("%7d\n",point->age); point=point->suivant; } }
ben ça, c'est tellement stupide que je me demande comment tu as pu avoir une idée pareille.
Code : Sélectionner tout - Visualiser dans une fenêtre à part courant->suivant=(struct element *)&nom;
Dans une liste chaînée, le pointeur "suivant" ne peut pointer que sur deux choses:
1) Une autre structure élément (le suivant dans la liste)
2) NULL (si l'élément en question est le dernier, NULL indique qu'il n'y a pas d'élément après)
![]()
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Oui enfin je suis pas aussi callé que toi en C, bref j'arrive pas a afficher les données dans le même ordre que je les aient saisies si vous avez une solution simple (svp) je suis ouvert merci d'avance.ben ça, c'est tellement stupide que je me demande comment tu as pu avoir une idée pareille.
Eh bien en fait, tu as trois choix possibles:
1°) Tu lie les éléments en ordre inverse (assez simple à faire, mais ici il tu veux le même ordre)
2°) Tu maintiens un pointeur vers le dernier élément de la liste pour rajouter à la fin
3°) Tu maintiens un pointeur de pointeur, plus compliqué
Un petit exemple pour le 2:
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 void creation (struct element * *pt_pt_premier) { char nom[LG+1]; int age; struct element *pt_nouveau=NULL; /*Pointeur pour l'échange de valeur et réservation mémoire*/ struct element *pt_dernier=NULL; char *pt_ligne=NULL; /* pointeur vers le \n à enlever */ *pt_pt_premier=NULL; /*Initialisation du tout début de liste*/ pt_dernier=NULL; printf ("Entrer un nom vide pour terminer\n\n"); while(1) { printf ("Nom :"); fgets(nom, LG+1, stdin);/*gets() est une fonction trop dangereuse et ne devrait pas exister*/ /* Retire le \n du nom */ pt_ligne=strchr(nom, '\n'); if(pt_ligne) *pt_ligne='\0'; if (!strlen(nom)) break; /*Sortie de boucle si nom vide*/ printf ("Age :"); scanf ("%d",&age); getchar(); /* Création d'un nouvel élément de la liste */ /* (en C, le cast du retour de malloc() est inutile et déconseillé) */ pt_nouveau = malloc(sizeof(struct element)); /*réservation mémoire*/ strcpy(pt_nouveau->nom,nom); pt_nouveau->age=age; pt_nouveau->suivant = NULL; /* Ajout de l'élément à la fin de la liste */ /* Si la liste n'est pas vide, on ajoute après pt_dernier. */ /* Sinon, on crée la liste avec pt_nouveau */ if(pt_dernier) pt_dernier->suivant = pt_nouveau; else *pt_pt_premier = pt_nouveau; pt_dernier = pt_nouveau; }/* while */ }
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Partager