INSTITUT SUPERIEUR DU GENIE ELECTRIQUE Année académique 2022 / 2023
………………………………
2AMIFI – 2ARIT décembre 2023
…………………..
Semestre 3
…………….. P
a
Enseignant : Gouayon KOALA r
……………………………… c
o
CORRIGÉ TP N°2 - STRUCTURES DE DONNEES DYNAMIQUES
Exercice 1 (Pile.c):
1- Écrire en langage C, la structure d’une pile à l’aide d’une liste chaînée.
#include <stdio.h>
#include <stdlib.h>
/* Définition de la structure de donnée*/
typedef float TypeDonnee;
typedef struct Cell {
TypeDonnee donnee;
struct Cell *suivant;
} TypeCellule;
/**** Définition de la stucture Pile ****/
typedef TypeCellule *Pile;
2- Écrire les primitives de gestion des piles.
//Dans le même fichier Pile.c
/**** Fonction d'initialistion d'une Pile ****/
Pile Initialiser()
{
return NULL;
}
/**** Fonction EsVide : renvoie 1 si la liste est vide ****/
int EstVide(Pile P)
{
/* renvoie 1 si la Pile est vide */
return (P == NULL) ? 1 : 0;
}
/**** Fonction EstPleine une liste chaîne n’est jamais pleine ****/
int EstPleine(Pile P)
{
return 0; /* une liste chaÓnÈe níest jamais pleine */
}
/**** Fonction AccederSommet ****/
int AccederSommet(Pile P, TypeDonnee *pelem)
{
if (EstVide(P))
return 1; /* on retourne un code díerreur */
*pelem = P->donnee; /* on renvoie l’élément */
return 0;
}
/**** Fonction Empiler permet d’ajouter un élément au sommet ****/
void Empiler(Pile* pP, TypeDonnee elem)
{
Pile q;
q = (TypeCellule*)malloc(sizeof(TypeCellule)); /* allocation */
q->donnee = elem; /* ajout de l’élément à empiler */
q->suivant = *pP; /* insertion en tête de liste */
*pP =q; /* mise à jour de la tête de liste */
}
/**** Fonction Depiler permet de supprimer un element ****/
int Depiler(Pile *pP, TypeDonnee *pelem)
{
Pile q;
if (EstVide(*pP))
return 1; /* on ne peut pas supprimer d’élément */
*pelem = (*pP)->donnee; /* on renvoie l’élément de tête */
q = *pP; /* mémorisation d’adresse de la première cellule */
*pP = (*pP)->suivant; /* passage au suivant */
free(q); /* destruction de la cellule mémorisée */
return 0;
}
/**** Fonction Detruire la Pile ****/
void Detruire(Pile *pP)
{
Pile q;
while (*pP != NULL) /* parcours de la liste */
{
q = *pP; /* mémorisation de l’adresse */
/* passage au suivant avant destruction : */
*pP = (*pP)->suivant;
free(q); /* destruction de la cellule mémorisée */
}
*pP = NULL; /* liste vide */
}
/**** Fonction Vider la Pile ****/
void Vider(Pile *pP)
{
Detruire(pP); /* destruction de la liste */
*pP = NULL; /* liste vide */
}
3- Écrire un programme principal qui permet d’utiliser la pile avec un menu qui propose
les différentes opérations que l’on peut effectuer.
//Dans le même fichier Pile.c
int main(void){
int choix;
TypeDonnee *pelem;
TypeDonnee elem;
Pile *pP;
do {
printf("********************************\n");
printf("****** Gestion de Pile ******\n");
printf("******************************** \n");
printf("** sélectionnez l'opération :: ** \n");
printf(" 1 :: Créer une Pile vide \n");
printf(" 2 :: Ajouter un élément dans la Pile \n");
printf(" 3 :: Supprimer un élément dans la Pile \n");
printf(" 4 :: Tester si la Pile est vide \n");
printf(" 5 :: Détruire la Pile \n");
printf(" 6 :: Vider la Pile \n");
printf(" 0 :: Quitter le programme \n");
scanf("%d", &choix);
switch (choix){
case 1 : *pP = Initialiser();
printf(" La pile P a été créé avec succès \n");
break;
case 2 :
printf("Entrer la valeur de l'element à ajouter dans la Pile");
scanf("%f", &elem);
Empiler(pP, elem);
printf("L'element a été ajouté avec succès!!!");
break;
case 3 :
Depiler(pP, pelem);
printf("La valeur de l'element recupérer est :: %f", *pelem);
break;
case 4 :
if (EstVide(*pP) == 1)
printf("La Pile est vide");
else
printf("La Pile n'est PAS VIDE");
break;
case 5 : Detruire(pP);
break;
case 6 : Vider(pP);
break;
}while(choix ==0);
return 0;
}
Exercice 2 (File.c):
1- Écrire en langage C, la structure de file à l’aide d’une liste chaînée
2- Écrire les primitives de gestion des files.
3- Écrire un programme principal qui permet d’utiliser la file avec un menu qui propose
les différentes opérations que l’on peut effectuer.