Oui.Citation:
Envoyé par benjiprog
Version imprimable
Oui.Citation:
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:
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: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)
:roll:
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.Citation:
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:
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 */ }