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;
}
A voir également:
- Probleme dans ma liste chainee
- Liste déroulante excel - Guide
- Liste déroulante en cascade - Guide
- Liste code ascii - Guide
- Site dangereux liste - Guide
- Liste site streaming illégal - Accueil - Services en ligne
4 réponses
Quelques remarques au préalable :
1) Les #include incluent des headers standards donc tu es sensé écrire
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 :
Ca devrait être
Bonne chance
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 être
date.suivant = NULL;
Bonne chance
jo_one
Messages postés
2
Date d'inscription
Statut
Membre
Dernière intervention
je te remercie pour tes information ! en toute franchise je vais aller voir dans mes bouquins avec tes info car je ne suis tjs pas plus eclairer, ce qui est plutot normale car j'apprends seul!!!!
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:
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
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