Probleme dans ma liste chainee
Résolu
Bonjour,a tous je suis debutant en programmation et je voudrais realiser un petit programme en C qui gere les heures de travails; g commencer par declarer ma structure et ensuite g voulu en faire un tableau en allouant de la memoire a chaque structures entrees. pour ce j'utilise une liste chainee mais a l'affichage, le resulta est nul! pouvez vous m'aider en me signalant mes erreurs afin que je puisse comprendre la matiere svp! voici mon code source:
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
struct heure{
int h; // pour les heures
int m; // pour les minutes
};
struct date{
int jrs; //pour les jours
int mois;
int ann; //pour l'annee
};
struct fiche{
struct date jours;
struct heure debut;
struct heure fin;
float t_trv; // le resulta du temps de travaile
struct fiche *suivant;
};
typedef struct fiche liste;
int main()
{
liste date;
liste *premier,*second;
date->suivant=NULL;
premier=&date;
premier=(liste *)malloc(sizeof(liste));
if(premier==NULL){
printf("erreur\n");
}
second=premier;
while(scanf(" %d/%d/%d ",&second->jours.jrs,&second->jours.mois,&second->jours.ann)==3){
second->suivant=(liste *)malloc(sizeof(liste));
if(second==NULL){
printf(" erreur_2\n");
}
second=second->suivant;
second->suivant=NULL;
}
free(second);
// affichage de ma liste
for(second=premier; second !=NULL; second=second->suivant)
printf(" %d/%d/%d \n",second->jours.jrs,second->jours.mois,second->jours.ann);
return 0;
}
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
struct heure{
int h; // pour les heures
int m; // pour les minutes
};
struct date{
int jrs; //pour les jours
int mois;
int ann; //pour l'annee
};
struct fiche{
struct date jours;
struct heure debut;
struct heure fin;
float t_trv; // le resulta du temps de travaile
struct fiche *suivant;
};
typedef struct fiche liste;
int main()
{
liste date;
liste *premier,*second;
date->suivant=NULL;
premier=&date;
premier=(liste *)malloc(sizeof(liste));
if(premier==NULL){
printf("erreur\n");
}
second=premier;
while(scanf(" %d/%d/%d ",&second->jours.jrs,&second->jours.mois,&second->jours.ann)==3){
second->suivant=(liste *)malloc(sizeof(liste));
if(second==NULL){
printf(" erreur_2\n");
}
second=second->suivant;
second->suivant=NULL;
}
free(second);
// affichage de ma liste
for(second=premier; second !=NULL; second=second->suivant)
printf(" %d/%d/%d \n",second->jours.jrs,second->jours.mois,second->jours.ann);
return 0;
}
Configuration: Windows Vista Internet Explorer 7.0
4 réponses
-
Quelques remarques au préalable :
1) Les #include incluent des headers standards donc tu es sensé écrire#include <stdio.h> ...
2) En toute rigueur, il y a un petit problème de design en terme de structure. Il faut distinguer une fiche (la donnée stockée dans le maillon) d'un maillon (une donnée et un pointeur vers le maillon suivant). Pour une liste générique il suffit alors de stocker un "struct maillon *" qui pointe sur le maillon suivant et un "void *" qui pointe sur la donnée la fiche en l'occurrence). Dès lors tu peux programmer un module de liste chaînée générique munies de fonctions d'insertion et de suppression.
3) Si tu peux programmer en C++ ton programme s'écrit très facilement avec des std::list.
https://community.hpe.com/t5/custom/page/page-id/HPPSocialUserSignonPage?redirectreason=permissiondenied&referer=https%3A%2F%2Fcommunity.hpe.com%2Ft5%2FServers-Systems-The-Right%2FSGI-com-Tech-Archive-Resources-now-retired%2Fba-p%2F6992583
Je n'ai malheureusement pas le temps de te corriger ton programme je dois partir dans quelques minutes. Afin de comprendre ce qui ne marche pas dans ton programme n'hésite pas à utiliser un debugger. Au passage j'ai relevé cette erreur à la compilation :int main() { liste date; liste *premier,*second; date->suivant=NULL; ...
Ca devrait êtredate.suivant = NULL;
Bonne chance -
Bah en gros si tu corriges la ligne que je t'ai indiqué le programme marche (en italique c'est ce que j'ai tapé) et si tu mets bien les #include comme je t'ai dit:
2/8/5 1/2/9 o 2/8/5 1/2/9 0/0/0
Par contre en tout rigueur il y a des structures que tu alloues (malloc) mais que tu ne désalloues pas à la fin de ton programme (free) ce qui est pas top. Idéalement ton programme devrait se terminer par un parcours de la liste et un free de chaque maillon. Bien entendu il ne faut pas libérer un maillon d'avoir stocker la position du maillon qui suit.
Si tu as besoin de complément d'information ou si des points ne te paraissent pas clair n'hésite pas, j'essaierai d'être plus claire. Et si ton problème est résolu, pense à le cocher comme tel ;-)
Bonne chance -
cc, je tenais a te remercier pour ton aide qui m'a ete d'une grande utiliter! g fini par enlever un pointeur liste de facon a ne travailler qu'avec un seul et ça fonctionne apparament! maintenant je vais essayer dans faire deux fonctions (initialiser_date et affich_liste).
-
Ok bon courage :-) Pour les problèmes ultérieurs que tu pourrais rencontrer, ouvre un nouveau sujet.
Bonne chance