Modifier le programme précédent :
#include <stdlib.h> #include <stdio.h> /* les types communs a toutes les procedures */ /* ----------------------------------------- */ struct commande { char nom[80]; char article[80]; int nombre,prix; struct commande *suiv; }; /*********************************************************************/ /* */ /* print_com */ /* */ /* But: */ /* Imprime une structure commande */ /* */ /*********************************************************************/ void print_com(struct commande com) { printf("%s %s %d %d\n", com.nom, com.article, com.nombre, com.prix); }
/*********************************************************************/ /* */ /* max_com */ /* */ /* But: */ /* Recherche la commande pour laquelle le produit nombre * prix */ /* est le maximum */ /* */ /* Interface: */ /* l_com : la liste dans laquelle doit se faire la recherche */ /* valeur rendue : pointeur vers la structure commande recherchée */ /* ou NULL si l_com est vide */ /* */ /*********************************************************************/ struct commande *max_com(struct commande * l_com) { struct commande *pmax; /* pointeur vers le max courant */ struct commande *pcour; /* pointeur vers l'element courant */ int vmax,vcour; if (l_com == NULL) return(NULL); else { pmax = l_com; vmax = (pmax -> nombre) * (pmax -> prix); for (pcour = l_com -> suiv; pcour != NULL; pcour = pcour ->suiv) { vcour = (pcour -> nombre * pcour -> prix); if (vcour > vmax) { vmax = vcour; pmax = pcour; } } return(pmax); } }
/*********************************************************************/ /* main */ /*********************************************************************/ int main(void) { FILE * fi; struct commande *l_com = NULL; /* liste des commandes */ struct commande *prec,*cour; /* pour la commande précédente et courante */ int val_ret; /* valeur de retour de fscanf */ if ((fi = fopen("exer7.data","r")) == NULL) printf("Impossible d'ouvrir le fichier exer7.data\n"); else { /* lecture du fichier avec création de la liste de commandes */ /* --------------------------------------------------------- */ do { cour = malloc(sizeof(struct commande)); val_ret = fscanf(fi,"%s %s %d %d", cour -> nom, cour -> article, &(cour -> nombre), &(cour -> prix)); if (val_ret == EOF) { free(cour); if(l_com != NULL) prec -> suiv = NULL; } else { if (l_com == NULL) l_com = cour; else prec -> suiv = cour; prec = cour; } } while (val_ret != EOF); /* parcours de la liste avec impression */ /* ------------------------------------ */ if (l_com == NULL) printf("La liste de commandes est vide\n"); else { for (cour = l_com; cour != NULL; cour = cour -> suiv) print_com(*cour); /* recherche et impression de la commande maximum */ /* ---------------------------------------------- */ printf("La commande maximum est :\n"); print_com(*max_com(l_com)); } fclose(fi); /* fermeture du fichier */ } return 0; }