#include <stdio.
h>
#include <stdlib.h>
//Définition de la structure etud contenan t3 champs
typedef struct etud
{
int id;
float note;
struct etud *next;
} etud;
//Réinitialiser les valeurs de la liste
etud* initList()
{
return NULL;
}
//Ajout d'un nouvel étudiant. l'insertion se fait dans le bon
emplacement: insertion + tri
etud* addEtudTri(etud *list, int id, float note)
{
etud *newEtud = (etud*)malloc(sizeof(etud));
newEtud->id = id;
newEtud->note = note;
if (list == NULL || note < list->note)
{
newEtud->next = list;
list = newEtud;
}
else
{
etud *current = list;
while (current->next != NULL && current->next->note < note)
{
current = current->next;
}
newEtud->next = current->next;
current->next = newEtud;
}
return list;
}
// Parcours de la liste + Affichage de ses éléments
void afficheEtud(etud *list)
{
etud *current = list;
while (current != NULL)
{
printf("\nID de l'etudiant: %d, Note = : %.2f \n", current->id,
current->note);
current = current->next;
}
}
// Suppression des notes <10
void suppEtudInf10(etud **list)
{
while (*list != NULL && (*list)->note < 10)
{
etud *temp = *list;
*list = (*list)->next;
free(temp);
}
if (*list == NULL)
{
return;
}
etud *current = *list;
while (current->next != NULL)
{
if (current->next->note < 10)
{
etud *temp = current->next;
current->next = temp->next;
free(temp);
}
else
{current = current->next;
}
}
}
// calcul de la moyenne: parcours de la liste, calcul de la somme des
notes et du nombre des étudiants
float calcMoyenne(etud *list)
{
float somme = 0;
int nbr = 0;
etud *current = list;
while (current != NULL)
{
somme += current->note;
nbr++;
current = current->next;
}
return somme / nbr;
}
//Ajout d'un nouvel étudiant. l'insertion se fait dans le bon
emplacement: insertion + tri
//le tri se fait au sens inverse pour obtenir une liste inverse
etud* addEtudTriinverse(etud *list, int id, float note)
{
etud *newEtud = (etud*)malloc(sizeof(etud));
newEtud->id = id;
newEtud->note = note;
if (list == NULL || note > list->note)
{
newEtud->next = list;
list = newEtud;
}
else
{
etud *current = list;
while (current->next != NULL && current->next->note < note)
{
current = current->next;
}
newEtud->next = current->next;
current->next = newEtud;
}
return list;
}
//Création de la liste inverse qui appelle la fonction précédente
etud* inverserListe(etud* list) {
etud* inverse = NULL;
while (list != NULL) {
inverse = addEtudTriinverse(inverse, list->id, list->note);
list = list->next;
}
return inverse;
}
// Fonction de fusion de deux listes
void fusionListes(etud *list1, etud *list2)
{
etud *result = NULL;
while (list1 != NULL && list2 != NULL)
{
if (list1->note < list2->note)
{
result = addEtudTri(result, list1->id, list1->note);
list1 = list1->next;
}
else
{
result = addEtudTri(result, list2->id, list2->note);list2 =
list2->next;
}
}
while (list1 != NULL)
{
result = addEtudTri(result, list1->id, list1->note);
list1 = list1->next;
}
while (list2 != NULL)
{
result = addEtudTri(result, list2->id, list2->note);
list2 = list2->next;
}
afficheEtud(result);
}
int main()
{
int nb;
printf("Donner le nombre des etudiants\n");
scanf("%d", &nb);
//initialisation
etud *list = initList();
int id;
float note;
for (int i=0; i<nb; i++)
{
printf("\nDonner l' identifiant et la note de l'etudiant: \n");
scanf("%d %f", &id, ¬e);
list = addEtudTri(list, id, note);
}
printf("\nLe nombre des etudiants est: %d\n", nb);
printf("\nLa liste des etudiants:\n");
afficheEtud(list);
printf("\nAjout d'un nouvel etudiant:\n");
printf("\nDonner l'identifant: \n");
scanf("%d", &id);
printf("\nDonner la note: \n");
scanf("%f", ¬e);
list = addEtudTri(list, id, note);
printf("\nNouvelle liste des etudiants:\n");
afficheEtud(list);
printf("\nNombre d'etudnats: %d\n", nb+1);
printf("\nSuppression des etudiants ayant une note < 10:\n");
suppEtudInf10(&list);
afficheEtud(list);
printf("\nLa moyenne des notes de la classe: %.2f\n",
calcMoyenne(list));
printf("\nListe des etudiants inversee:\n");
etud* listeInverse = inverserListe(list);
printf("\nListe inversée :\n");
afficheEtud(listeInverse);
printf("\nFusion de deux listes triees:\n");
etud *list2 = initList();
//création d'une 2e liste
list2 = addEtudTri (list2, 50, 5.0);
list2 = addEtudTri (list2, 51, 7.75);
list2 = addEtudTri (list2, 52, 12.25);
list2 = addEtudTri (list2, 53, 14.0);
printf("\nListe 1:\n");
afficheEtud(list);
printf("\nListe 2:\n");
afficheEtud(list2);
printf("\nListes fusionnees:\n");
fusionListes(list, list2);
return 0;
}