Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Programmation > Langage C > liste chainée > Lecture du sujet

liste chainée

Vous devez être inscrit pour pouvoir poster des messages

Page : 1 
Auteur Message
1 visiteur sur ce sujet (1 anonyme)
Page : 1 
Hors ligne unknown77 # Posté le 19/07/2008 à 13:53:48
Groupe : Membres
Bonjour , voilà j'ai un problème d'affichage ^^, il m'affiche tout le temps liste vide quand j'ajoute une fiche :-° ...
Merci d'avance

Code : C
  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
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// Chaine.cpp : définit le point d'entrée pour l'application console.
//

#include "stdafx.h"
#include "stdlib.h"
#include "malloc.h"

void ajout(struct liste *,struct liste *,struct liste *);
void affiche(struct liste *,struct liste *,struct liste *);


struct liste
{
	char prenom[30];
	int age;
	struct liste *psvt;




};
typedef struct liste* LISTE;

static void vider(void)
{
    int c;

    while ((c = getchar()) != '\n' && c != EOF)
    {}
}

int main()
{
	LISTE ptete = NULL,ptemp = NULL, psuivant = NULL;
	int choix;
	do
	{
		system("cls");
		printf("1. Ajout\n");
		printf("2. Afficher\n");
		printf("3. Quitter\n");
		printf("Choix : ");
		scanf("%d",&choix);
		switch(choix)
		{
			case 1:
			ajout(ptete,ptemp,psuivant);
			break;
			case 2:
			affiche(ptete,ptemp,psuivant);
			break;
			
		}
	}
	while(choix != 3);
		
		


		

	return 0;
}

void ajout(struct liste *ptete,struct liste *ptemp ,struct liste *psuivant )
{
	ptemp = (liste *)malloc(sizeof(liste));
	if(ptemp != NULL)
	{
		if(ptete == NULL)
		{
			printf("Prenom :");
			vider();
			gets(ptemp->prenom);
			printf("Age :");
			scanf("%d",&(ptemp->age));
			ptemp->psvt = NULL;
			ptete = ptemp;
			psuivant = ptete;
			ptemp == NULL;
		}
		else
		{
			printf("Prenom :");
			fflush(stdin);
			gets(ptemp->prenom);
			printf("Age :");
			scanf("%d",&(ptemp->age));
			ptemp->psvt = NULL;
			while (psuivant->psvt != NULL)
			{
				psuivant=psuivant->psvt;			
			}
			psuivant->psvt=ptemp;		
		
		
		}
	
	}

		
		
}

void affiche(struct liste *ptete,struct liste *ptemp ,struct liste *psuivant)
{
	psuivant=ptete;
	if(ptete != NULL)
	{
		while(psuivant != NULL)
		{
			printf("%s\n",psuivant->prenom);
			printf("%d\n\n",psuivant->age);
			psuivant = psuivant->psvt;
		
		
		
		
		}
		system("pause");
	}
	else
		if(ptete == NULL)
		{
			printf("Liste vide\n");
			system("pause");
		
		
		
		
		}







}


Hors ligne etrange02 # Posté le 19/07/2008 à 14:05:15
Pourquoi, il en faut une?
Avatar
Groupe : Membres
Je trouve tes includes bizarres, non :-° ? Pour les bibliothèques standards, on utilise des chevrons <stdlib.h>.

:colere2: Pas de fautes d'orthographe s'il vous plaît et un peu de respect pour la syntaxe :colere2:
 
Hors ligne unknown77 # Posté le 19/07/2008 à 14:12:42
Groupe : Membres
sous visual studio 2005 Pro les includes marchent avec "" ou <> mais peut être pas avec les autres programmes
Hors ligne etrange02 # Posté le 19/07/2008 à 14:43:34
Pourquoi, il en faut une?
Avatar
Groupe : Membres
Peux-tu me donner le rôle de ta fonction vider() ? Elle ne semble ne vider que le buffer et ne permet pas la saisie d'un nom. A ma connaissance, EOF ne s'utilise qu'avec les fichiers (c'est à vérifier).

Ou sinon, vérifie que tu n'as pas fait d'erreur avec les pointeurs. Je crois qu'il faut mettre un "&" lors de l'appel de la fonction ajout.

Et si tu as du temps, ajoute quelques commentaires dans ton code, je pense que cela peut t'aider à y voir plus clair (et à moi aussi ;) ).

J'ai revu ton code à ma façon (j'ai essayé de conserver ton code au maximum). Tu peux l'améliorer ou même le modifier. Un conseil avant de le lire, lorsque tu code fais morceau par morceau pour ne pas te perdre et savoir où son tes premières erreurs ! Dans le cas contraire, tu ne pourra plus rien comprendre. Crois en mon expérience !

Code : C
 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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// Chaine.cpp : définit le point d'entrée pour l'application console.
//

#include <string.h>
#include <stdlib.h>

void ajout(int *, int);
void afficheStruct(int, int);


struct liste//On définit une structure permettant d'entrer des informations
{
	char prenom[30];
	int age;
};
typedef struct liste LISTE;


int main()
{
	LISTE *dossier = NULL, *dossierSauvegarde = NULL, *dossierNouveau = NULL;//pointeurs de type LISTE
	int choix, nombreAmis = 0, ancienAmis = 0;
	int i = 0, j = 0, k = 0;//Variables servant à l'incrémentation

	while(choix != 3)//On rentre dans la boucle principale
	{
		system("cls");
		printf("1. Ajout\n");//Affichage du menu
		printf("2. Afficher\n");
		printf("3. Quitter\n");
		printf("Choix : ");
		scanf("%d",&choix);

		switch(choix)
		{
		case 1://Si on souhaite faire un ajout
                ancienAmis = nombreAmis;
                printf("Combien de fiche voulez-vous creer ? ");
                scanf("%ld", &nombreAmis);
                dossierNouveau = malloc((nombreAmis)*sizeof(LISTE));

                printf("Merci de remplir le formulaire\n");

                for (i=0; i<nombreAmis; i++)
                {
                    printf("Prenom de la personne %ld : ", i+1);
                    scanf("%s", &dossierNouveau[i].prenom);
                    printf("Age de la personne %ld : ", i+1);
                    scanf("%ld", &dossierNouveau[i].age);
                }

                free(dossierSauvegarde);//On évite les fuites de mémoires, c'est très important pour la suite de l'apprentissage
                dossierSauvegarde = malloc((ancienAmis)*sizeof(LISTE));

                for (i=0; i<ancienAmis; i++)//On crée une sauvegarde de la liste
                {
                    for (k=0; k<30; k++)
                        dossierSauvegarde[i].prenom[k] = dossier[i].prenom[k];
                    dossierSauvegarde[i].age = dossier[i].age;
                }

                free(dossier);
                dossier = malloc((nombreAmis + ancienAmis)*sizeof(LISTE));//on réinitialise la liste
                j = 0;

                for (i=0; i<ancienAmis; i++)//On copie la sauvegarde dans la nouvelle liste afine de ne pas la perdre
                {
                    for (k=0; k<30; k++)
                        dossier[i].prenom[k] = dossierSauvegarde[i].prenom[k];
                    dossier[i].age = dossierSauvegarde[i].age;
                }

                for (i=ancienAmis; i<nombreAmis+ancienAmis; i++)//Et on ajoute les nouvelles listes
                {
                    for (k=0; k<30; k++)
                        dossier[i].prenom[k] = dossierNouveau[j].prenom[k];
                    dossier[i].age = dossierNouveau[j].age;
                    j++;
                }

                nombreAmis +=ancienAmis;//On met le nombre d'ami(s) enregistré à jour
                free(dossierNouveau);
                break;
		case 2:
                for (i=0; i<nombreAmis; i++)
                {
                    printf("%s a %ld ans\n", dossier[i].prenom, dossier[i].age);
                }
                system("PAUSE");
                break;
		}
	}

	free(dossier);
	free(dossierNouveau);
	free(dossierSauvegarde);
	return EXIT_SUCCESS;//C'est mieux que "return 0" ;)
}
Édité le 19/07/2008 à 22:11:48 par etrange02

:colere2: Pas de fautes d'orthographe s'il vous plaît et un peu de respect pour la syntaxe :colere2:
 

Retour au forum "Langage C" ou à la liste des forums

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 462 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.1746s (0.1494s)