Probleme avec ma liste chainee
jo_one
-
jo_one -
jo_one -
Bonjour,
pour quel raison mes fonctions( affich_liste() et tps_trv() ) ne fonctionnent pas separement dans le main()???? maintenant a l'interrieur de ajout_element(), elles fonctionnent comme souhaiter??! pouvez vous m'eclairsir sur mes erreus svp!!! voici mon code source/
#include "stdafx.h"
#include <stdio.h>
#include "time.h"
#include "malloc.h"
#include "stdlib.h"
struct heures{
int h;
int m;
};
struct date{
int jrs;
int mois;
int ann;
};
typedef struct element{
struct date jours;
struct heures debut;
struct heures fin;
float t_trv; // temps de travail(h*60+m),(fin -debut)/60
struct element *suivant;
}liste;
int tps_trv(liste *d_liste,liste *noeud);
int affiche_liste(liste *d_liste,liste *noeud);
int ajout_element(liste *d_liste,liste *nouvel);
/******************************************************/
int main(array<System::String ^> ^args)
{
liste *debut=NULL; // liste vide
liste *element; // nouvel element a ajouter
int n;
do
{
printf("\nchoix: ");
scanf("%d",&n);
switch(n)
{
case 1: ajout_element(debut,element);
break;
case 2: tps_trv(debut,element);
break;
case 3: affiche_liste(debut,element);
break;
}
}while(n!=0);
return 0;
}
/***********************************************************/
int ajout_element(liste *d_liste, liste *nouvel)
{
nouvel=(liste *)malloc(sizeof(liste)); // affectation de memoire pour l'element a ajouter
if(nouvel==NULL)
{
printf("erreue d\'alloc\n");
}
d_liste = nouvel; // faire pointer debut_liste sur nouvel element
printf(" \nEntrer la date-> ex.(JJ/MM/AA)-> ");
while(scanf("%d/%d/%d",&nouvel->jours.jrs,&nouvel->jours.mois,&nouvel->jours.ann)==3)
{
fflush (stdin);
printf(" heures de depart-> ex.(hh:mm)-> ");
scanf("%d:%d",&nouvel->debut.h,&nouvel->debut.m);
fflush(stdin);
printf(" heure de fin: ");
scanf("%d:%d",&nouvel->fin.h,&nouvel->fin.m);
fflush(stdin);
nouvel->suivant = (liste *)malloc(sizeof(liste)); //allouer memoire pour l'element suivant de la liste
if(nouvel->suivant==NULL)
{
printf("erreur d\'allocation second*\n");
}
nouvel = nouvel->suivant; // affectation de la memoire allouee au nouvau pointeur(nouvel element)
nouvel->suivant=NULL; // plus rien ensuite(fin de liste)
printf(" \ndate suivante-> ex.(JJ/MM/AA)-> "); //repet. pour l'avoir dans ma boucle
}
printf("\n");
tps_trv(d_liste,nouvel);
printf("\n");
affiche_liste(d_liste,nouvel);
free(nouvel);
return 0;
}
/***********************************************************/
int affiche_liste(liste *d_liste,liste *noeud)
{
for(noeud= d_liste;noeud->suivant!=NULL;noeud=noeud->suivant)
{
printf(" %d/%d/%d\n",noeud->jours.jrs,noeud->jours.mois,noeud->jours.ann);
printf(" arrivee %d:%d\n",noeud->debut.h,noeud->debut.m);
printf(" fin %d:%d\n",noeud->fin.h,noeud->fin.m);
printf(" temps de travail %.2lf\n",noeud->t_trv);
}
return 0;
}
/**************************************************************/
int tps_trv(liste *d_liste,liste *noeud)
{
int d1,dmin;
int f1,fmin,resulta_m;
noeud=d_liste;
while(noeud->suivant !=NULL)
{
d1 = noeud->debut.h *60;
dmin = d1 + noeud->debut.m; // heure de debut en minute
f1 = noeud->fin.h *60;
fmin = f1 + noeud->fin.m; // heure de fin en minute
resulta_m=(fmin-dmin);
noeud->t_trv = 1.0*resulta_m/60;
printf("\n( %d ",fmin);
printf(" -%d) ",dmin);
printf(" =(%d",resulta_m);
printf("/60)= %lf\n",noeud->t_trv);
noeud=noeud->suivant;
}
return 0;
}
/*************************************************************/
pour quel raison mes fonctions( affich_liste() et tps_trv() ) ne fonctionnent pas separement dans le main()???? maintenant a l'interrieur de ajout_element(), elles fonctionnent comme souhaiter??! pouvez vous m'eclairsir sur mes erreus svp!!! voici mon code source/
#include "stdafx.h"
#include <stdio.h>
#include "time.h"
#include "malloc.h"
#include "stdlib.h"
struct heures{
int h;
int m;
};
struct date{
int jrs;
int mois;
int ann;
};
typedef struct element{
struct date jours;
struct heures debut;
struct heures fin;
float t_trv; // temps de travail(h*60+m),(fin -debut)/60
struct element *suivant;
}liste;
int tps_trv(liste *d_liste,liste *noeud);
int affiche_liste(liste *d_liste,liste *noeud);
int ajout_element(liste *d_liste,liste *nouvel);
/******************************************************/
int main(array<System::String ^> ^args)
{
liste *debut=NULL; // liste vide
liste *element; // nouvel element a ajouter
int n;
do
{
printf("\nchoix: ");
scanf("%d",&n);
switch(n)
{
case 1: ajout_element(debut,element);
break;
case 2: tps_trv(debut,element);
break;
case 3: affiche_liste(debut,element);
break;
}
}while(n!=0);
return 0;
}
/***********************************************************/
int ajout_element(liste *d_liste, liste *nouvel)
{
nouvel=(liste *)malloc(sizeof(liste)); // affectation de memoire pour l'element a ajouter
if(nouvel==NULL)
{
printf("erreue d\'alloc\n");
}
d_liste = nouvel; // faire pointer debut_liste sur nouvel element
printf(" \nEntrer la date-> ex.(JJ/MM/AA)-> ");
while(scanf("%d/%d/%d",&nouvel->jours.jrs,&nouvel->jours.mois,&nouvel->jours.ann)==3)
{
fflush (stdin);
printf(" heures de depart-> ex.(hh:mm)-> ");
scanf("%d:%d",&nouvel->debut.h,&nouvel->debut.m);
fflush(stdin);
printf(" heure de fin: ");
scanf("%d:%d",&nouvel->fin.h,&nouvel->fin.m);
fflush(stdin);
nouvel->suivant = (liste *)malloc(sizeof(liste)); //allouer memoire pour l'element suivant de la liste
if(nouvel->suivant==NULL)
{
printf("erreur d\'allocation second*\n");
}
nouvel = nouvel->suivant; // affectation de la memoire allouee au nouvau pointeur(nouvel element)
nouvel->suivant=NULL; // plus rien ensuite(fin de liste)
printf(" \ndate suivante-> ex.(JJ/MM/AA)-> "); //repet. pour l'avoir dans ma boucle
}
printf("\n");
tps_trv(d_liste,nouvel);
printf("\n");
affiche_liste(d_liste,nouvel);
free(nouvel);
return 0;
}
/***********************************************************/
int affiche_liste(liste *d_liste,liste *noeud)
{
for(noeud= d_liste;noeud->suivant!=NULL;noeud=noeud->suivant)
{
printf(" %d/%d/%d\n",noeud->jours.jrs,noeud->jours.mois,noeud->jours.ann);
printf(" arrivee %d:%d\n",noeud->debut.h,noeud->debut.m);
printf(" fin %d:%d\n",noeud->fin.h,noeud->fin.m);
printf(" temps de travail %.2lf\n",noeud->t_trv);
}
return 0;
}
/**************************************************************/
int tps_trv(liste *d_liste,liste *noeud)
{
int d1,dmin;
int f1,fmin,resulta_m;
noeud=d_liste;
while(noeud->suivant !=NULL)
{
d1 = noeud->debut.h *60;
dmin = d1 + noeud->debut.m; // heure de debut en minute
f1 = noeud->fin.h *60;
fmin = f1 + noeud->fin.m; // heure de fin en minute
resulta_m=(fmin-dmin);
noeud->t_trv = 1.0*resulta_m/60;
printf("\n( %d ",fmin);
printf(" -%d) ",dmin);
printf(" =(%d",resulta_m);
printf("/60)= %lf\n",noeud->t_trv);
noeud=noeud->suivant;
}
return 0;
}
/*************************************************************/
A voir également:
- Probleme avec ma liste chainee
- Liste déroulante excel - Guide
- Liste code ascii - Guide
- Liste déroulante en cascade - Guide
- Site dangereux liste - Guide
- Voir liste d'amis facebook - Guide
1 réponse
Salut,
vu que l'affichage t'intéresse tu n'est pas obliger de déclarer ta fonction avec int
int affiche_liste(liste *d_liste,liste *noeud)
{
for(noeud= d_liste;noeud->suivant!=NULL;noeud=noeud->suivant)
{
printf(" %d/%d/%d\n",noeud->jours.jrs,noeud->jours.mois,noeud->jours.ann);
printf(" arrivee %d:%d\n",noeud->debut.h,noeud->debut.m);
printf(" fin %d:%d\n",noeud->fin.h,noeud->fin.m);
printf(" temps de travail %.2lf\n",noeud->t_trv);
}
return 0;
}
Il suffit le type void, puisque tu n'as rien à retourner (j'ai fait une modification dans la boucle, voir en gras )
vu que l'affichage t'intéresse tu n'est pas obliger de déclarer ta fonction avec int
int affiche_liste(liste *d_liste,liste *noeud)
{
for(noeud= d_liste;noeud->suivant!=NULL;noeud=noeud->suivant)
{
printf(" %d/%d/%d\n",noeud->jours.jrs,noeud->jours.mois,noeud->jours.ann);
printf(" arrivee %d:%d\n",noeud->debut.h,noeud->debut.m);
printf(" fin %d:%d\n",noeud->fin.h,noeud->fin.m);
printf(" temps de travail %.2lf\n",noeud->t_trv);
}
return 0;
}
Il suffit le type void, puisque tu n'as rien à retourner (j'ai fait une modification dans la boucle, voir en gras )
void affiche_liste(liste *d_liste,liste *noeud)
{
for(noeud= d_liste;noeud!=NULL;noeud=noeud->suivant){
printf(" %d/%d/%d\n",noeud->jours.jrs,noeud->jours.mois,noeud->jours.ann);
printf(" arrivee %d:%d\n",noeud->debut.h,noeud->debut.m);
printf(" fin %d:%d\n",noeud->fin.h,noeud->fin.m);
printf(" temps de travail %.2lf\n",noeud->t_trv);
}
}
jo_one
merci beaucoup pour ta correction mais cela n'avance rien elle ne fonctionne tjs pas separement ???? pourquoi????! et ( noeud!=NULL) affiche le dernier element qui est vide a cause du while(..) de ma fonction ajout_element, voila pq(noeud->suivant!=NULL) comme ça il ce stop au (pointeur->suivant = null )sans afficher l'element vide! si maintenant c'est vraiment une erreur importante!!! signale le moi stp! merci!
jo_one
>
jo_one
svp!!! dite moi pourquoi mes fonction ne fonctionnes pas ?? car g du mal a avance dans mon programme sans avoir mes fonctions separee! merci a vous!