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 maximun */
/* */
/* 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()
{
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 */
}
}