Citation :
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
/*********** Macro pour en-tête de page d'écran ******************/
#define HEADER(s) printf("\nPage %d\n",s);\
printf("No.\t\tNom\t\tPrenom\n" );\
for(j = 0; j < 55; j++) printf("_" )
main()
{
typedef struct etudiant
{
char name[21];
char name2[21];
// long num;
struct etudiant *pre; /* pointeur vers élément précédent */
struct etudiant *suiv; /* pointeur vers élément suivant */
} listelement;
listelement *deb; /* pointeur vers début de liste */
listelement *fin; /* pointeur vers fin de liste */
listelement * nouv; /* pointeur vers nouvel élément */
listelement *der; /* pointeur vers dernier l'expression inséré */
listelement * a; /* variable de contrôle */
char buffer [81]; /* pour contrôle de la saisie */
int i; /* compteur d'enregistrements */
char s,rep; //= 1; /* compteur de pages */
int j, num; /* variables de contrôle */
/******************** allocation mémoire pour premier élément ****************/
if ((deb = (listelement *) malloc(sizeof(listelement))) == NULL)
{
printf("\nPlus de mémoire libre.\n" );
exit(1); /* fin programme */
}
i = 0;
fin = nouv = der = deb; /* initialise pointeurs */
deb->pre = deb->suiv = NULL;
printf("****CREATION D'UNE STRUCTURE ETUDIANT****\n" );
/************************ saisie des enregistrements ************************/
do
{
printf("Enregistrement no %d\n", i+1);
printf("Nom de l etudiant, (fin par \"0\" ) : " );
gets(buffer);
while (strlen(buffer) > 20) /* contrôle désignation */
{
printf("Nom trop long.\n" );
printf("Nom de l'etudiant (20 caractères max., fin par \"0\" ) : " );
gets(buffer);
}
strcpy(nouv->name, buffer); /* ajout désignation dans la liste */
if (strcmp(nouv->name, "0" )) /* si désignation != "0" */
{
printf("Prénom de l'etudiant : " );
scanf("%s", &nouv ->name2);
while (getchar() != '\n' /* vidage tampon de saisie */
;
/***************** insertion nouvel élément ******************/
if (strcmp(nouv->name, deb->name) <= 0) /* nouveau <= premier */
{
if (nouv != deb) /* si au moins 1 élément dans liste */
{
nouv->pre = NULL; /* insertion nouveau premier elt */
nouv->suiv = deb;
deb->pre = nouv;
deb = nouv;
}
}
else if (strcmp(nouv->name, fin->name) >= 0)
/* nouveau >= dernier */
{
if (nouv != deb) /* si au moins 1 él. dans liste */
{
nouv->pre = fin; /* insertion nouveau dernier élt */
nouv->suiv = NULL;
fin->suiv = nouv;
fin= nouv;
}
}
else if (strcmp(nouv->name, der->name) >= 0) /* nouveau >= dernier inséré */
{
if (nouv != deb) /* au moins 1 él. dans liste */
{
/***** calcul de la position du nouvel élément *****/
for(a = der; strcmp(a->suiv->name, nouv->name) < 0;
a = a->suiv)
;
nouv->pre = a; /* insertion nouvel élément */
nouv->suiv = a->suiv;
a->suiv->pre = nouv;
a->suiv = nouv;
}
}
else /* nouveau < dernier inséré */
{
/******** calcul de la position du nouvel élément ********/
for(a = der; strcmp(nouv->name, a->pre->name) < 0;
a = a->pre)
;
nouv->pre = a->pre; /* insertion nouvel élément */
nouv->suiv = a;
a->pre->suiv = nouv;
a->pre = nouv;
}
der = nouv; /* actualise pointeur vers dernier élément */
/******** allocation mémoire pour nouvel élément *******/
if ((nouv = (listelement *) malloc(sizeof(listelement))) == NULL)
{
printf("\nPlus de mémoire. <Entrée> pour continuer.\n" );
getch();
i++; /* actualise compteur enr. */
break; /* sortie de boucle */
}
i++;
} /* fin if(strcmp(...)) supérieur */
else /* si fin de saisie */
der= nouv; /* tester le dernier nom saisi */
/* dans la condition de boucle */
} while (strcmp(der->name, "0" ));
/*************** affichage des enregistrements *****************************/
if (i > 0) /* au moins 1 enregistrement saisi */
{
printf("\nNombre d'enregistrements saisis : %d\n", i);
printf("AFFICHER LES ENREGISTREMENTS :\n" );
printf("Triés en ordre ascendant\t\t(a)\n" );
printf("Triés en ordre descendant\t\t(d)\n" );
printf("Fin par appui sur une touche quelconque\n" );
printf("Votre choix : " );
rep = getche();
switch (rep)
{
case 'a':
HEADER(s); /* en-tête */
for (a = deb, num = 1; a != NULL; a = a->suiv, num++)
{
printf("\n%d\t\t%s\t\t%s\n", num, a->name,a->name2);
if ((num%9) == 0 && num != i)
{
printf("\n<Entrée> pour page suivante." );
getch();
s++; /* compteur de pages */
HEADER(s);
}
}
break;
case 'd':
HEADER(s); /* en-tête */
for (a = fin, num = 1; a != NULL; a = a->pre, num++)
{
printf("\n%d\t\t%s\t\t%s\n", num, a->name, a->name2);
if ((num%9) == 0 && num != i)
{
printf("\n<Entrée> pour page suivante.\n" );
getch();
s++; /* compteur de pages */
HEADER(s);
}
}
break;
default:
;
}
/******************* libération de la mémoire ************************/
for (a = deb; a != NULL; a = nouv)
{
nouv = a->suiv; /* sauve adresse suivante avant */
/* libération de l'élément actuel contenu */
/* dans cette adresse. Autrement, cette adresse */
/* serait perdue et l'accès à la liste impossible */
free(a);
}
} /* fin if i > 0 */
getch();
} /* fin main */
|