Académique Documents
Professionnel Documents
Culture Documents
SETTAT
Exercice 1
Une pile est une structure de données telle que : - l’ajout d’un élément se fait au sommet de la
pile, - la suppression d’un élément se fait également au sommet de la pile
Ecrire les fonctions suivantes :
• InitialiserPile (pile *p) qui initialise une liste vide
• Empiler(pile *p) qui permet d’ajouter un élément en tête de la pile
• CreerPile(pile); ajouter des entiers (Tableau) au contenus des nœuds de la pile
• Depiler(pile *p) qui enlève un élément en tête de la pile
• Affiche(pile *p) le contenu de la pile
• Max(pile *p) qui retourne la valeur maximale.
• NbElement(pile *p) qui retourne le nombre d’éléments.
• Séparer les pairs et les impairs dans deux piles différentes P2 (pairs) et P3 (impairs) et
retourner la pile initiale (P=P3+P2).
• Créer un menu qui permet de faire appel à chacune de ces fonctions
--------------------------------------------------Corrigé Ex1-------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
typedef struct noeud
{
int val;
struct noeud *suiv;
}noeud;
////////////////////////////////////////////////////////////
int estvide(pile *p)
{
if(!p)
return 1;
else return 0;
}
///////////////////////////////////////
////////////////////////////////////////
void empiler(pile *p,int x)
{
noeud *nouv=malloc(sizeof(*nouv));
nouv->val=x;
nouv->suiv=NULL;
if(p==NULL)
p->premier = nouv;
else
{
nouv->suiv = p->premier;
p->premier = nouv;
}
}
//////////////////////////////////////////////////////////////
void depiler(pile *p)
{
noeud *tmp=p->premier;
if(p==NULL)
{printf("Pile vide");}
p->premier=tmp->suiv;
free(tmp);
}
////////////////////////////////////////////////////////////// :
int longeur(pile *p)
{ int i=0;
if(p==NULL)
return 0;
while( p->premier!=NULL)
{
p->premier=p->premier->suiv;
i++;
}
return i;
}
//////////////////////////////////////////////////////////////////
void affiche(pile *p)
{ if(p==NULL)
{printf("ERREUR\n");
exit(1);
}
noeud *tmp=p->premier;
while(tmp!=NULL)
{
printf("VALEUR = %d \n",tmp->val);
tmp=tmp->suiv;
}
}
//////////////////////// ////////////////////////////////////////
void separer(pile *p, pile *p4, pile *p6 ){
while (p->premier!=NULL) {
if (((p->premier->val) % 2) == 0)
{
empiler(p4, p->premier->val);
depiler(p);
}
else
{
empiler(p6, p->premier->val);
depiler(p);
}
}
while (p4->premier!=NULL) {
empiler(p, p4->premier->val);
depiler(p4);
}
empiler(p, p6->premier->val);
depiler(p6);
}
///////////////////////////////////////////////////////////////////////////
int MaxPile (pile *P){
noeud *courant=P->premier;
//////////////////////////////////////////////////////////////////////////////
void creePile(pile *p, int n)
{
int i;
for(i=1; i<=n; i++){
empiler (p, i); }
}
////////////////////////////////////////////////////////////////////////////
int main()
{ int rep,x,test;
pile p;
pile p4;
pile p6;
Initialiser(&p);
Initialiser(&p4);
Initialiser(&p6);
/*
do{
printf("VALEUR = \n");
scanf("%d",&x);
empiler(&p,x);
printf("continuez ?\n");
scanf("%d",&rep);
}while(rep!=0);
*/
creePile(&p, 5);
affiche(&p);
separer(&p, &p4, &p6);
printf("APRES separation\n");
affiche(&p);
printf("Max = %d \n",MaxPile(&p));
printf("LONGUEUR = %d \n",longeur(&p));
return 0;
}
Exercice 2 :
Une file est une structure de données telle que : - l’ajout d’un élément se fait au queue de la
file, - la suppression d’un élément se fait au sommet de la file.
typedef struct Element Element;
struct Element
{
int nombre;
Element *suivant;
};
Ecrire un programme qui ajoute une tache dans une file de tache en prenant en considération
la priorité.
NB : Une file d’attente avec priorité est une collection d’éléments dans laquelle l’insertion
ne se fait pas toujours à la queue. Tout nouvel élément est inséré, dans la file, selon sa
priorité. Le retrait se fait toujours du début.
Dans une file avec priorité, un élément prioritaire prendra la tête de la file même s’il arrive
le dernier.
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
//////////////////////////////////////////////////////////////////////////////////////////////////
void enfiler(File *file, int nvNombre)
{
Element *nouveau = malloc(sizeof(*nouveau));
if (file == NULL || nouveau == NULL)
{
exit(EXIT_FAILURE);
}
nouveau->nombre = nvNombre;
nouveau->suivant = NULL;
//////////////////////////////////////////////////////////////////////////////////////////////////////////
int defiler(File *file)
{
if (file == NULL)
{
exit(EXIT_FAILURE);
}
int nombreDefile = 0;
return nombreDefile;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void afficherFile(File *file)
{
if (file == NULL)
{
exit(EXIT_FAILURE);
}
printf("\n");
}
///////////////////////////////////////////////////////////////////////////////////////////////////
int size (File *q){
int cpt =0;
struct Element *courant;
courant=q->premier;
if(courant==NULL) printf("la file est vide \n");
else{
while(courant!=NULL){
cpt++;
courant=courant->suivant;
}}
return cpt;}
////////////////////////////////////////////////
}
return min;
}
//////////////////////////////////////////
void insererFile(File * f, int x){
File *f1 = malloc(sizeof(*f1));
f1->premier=NULL;
bool reponse=true ;
while (f->premier!=NULL)
{
if ( ( (f->premier->nombre) > x) && reponse )
{
enfiler(f1, x);
enfiler(f1, f->premier->nombre);
defiler(f);
reponse=false ;
}
else
{
enfiler(f1, f->premier->nombre);
defiler(f);
}
}
while (f1->premier!=NULL)
{
enfiler(f, f1->premier->nombre);
defiler(f1);
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int renvoiePremier(File *q){
if(q->premier==NULL){
printf("la file est vide \n");
return -1;
}
else return q->premier->nombre;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main()
{
File maFile ;
initialiser(&maFile );
int sizee,min ,choix ,val, elt, nb;
do{
printf("\n ***** GESTION MA FILE *****");
printf("\n 1. Enfiler");
printf("\n 2. Defiler ");
printf("\n 3. Afficher la file ");
printf("\n 4. Taille la file ");
printf("\n 5. Renvoyer le premier element");
printf("\n 6. Min ");
printf("\n 7. Inserer un entier ");
printf("\n 8. Quitter ");
printf("\n Saisissez votre choix ? ");
scanf("%d", &choix);
switch(choix){
case 1: printf("\n Enter la valeur à inserer dans la file :");
scanf("%d", &val);
enfiler(&maFile, val); break;
case 2: defiler(&maFile); break;
case 3: afficherFile(&maFile); break;
case 4: sizee=size (&maFile); printf("\nnombre des elements de la file: %d \n",sizee); break;
case 5: elt =renvoiePremier(&maFile); printf("\n %d :\n",elt); break;
case 6: min =getMin(&maFile); printf("\n min : %d \n",min); break;
case 7: printf("\n entier a inserer :\n"); scanf("%d", &nb);insererFile(&maFile,nb); break;
//insere 3 dans la liste :1->2 4
}
}
while(choix != 8);
getch();
return 0;
}
-----------------------------------------------file a priorité----------------------------------------
#include <stdio.h>
#include <stdlib.h>
///////////////////////////////////////////////////////////////////
void defiler(File* f) {
Element* temp = f->premier;
f->premier = temp->suivant;
free(temp);
}
/////////////////////////////////////////////////////////////////
void enfiler(File* f, char tache [], int p) {
Element* start = f->premier;
Element* temp = (Element*)malloc(sizeof(Element));
temp->priorite = p;
temp->suivant=NULL;
if (f->premier==NULL)
{
f->premier=temp;
}
else {
else {
while (start->suivant != NULL && start->suivant->priorite > p) {
start = start->suivant;
}
temp->suivant = start->suivant;
start->suivant = temp;
}
}
}
//////////////////////////////////////////////////////////////////////////
int estVide(File* f) {
return (f->premier) == NULL;
}
/////////////////////////////////////////////////////////////////////
int main() {
File pq;
intialise(&pq);
// printf("hh %s" , pq.premier->data);
enfiler(&pq, "toto", 2);
enfiler(&pq, "TITI", 3);
enfiler(&pq, "TATA", 0);
while (!estVide(&pq)) {
printf("%s \n", RetourSommet(&pq));
defiler(&pq);
}
return 0;
}
Exercice 3
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
///////////////////////////////////////////////////////////////
File* Initialisation(void)
{ File*f;
f=(File*)malloc(sizeof(File));
f->prem=f->dern=NULL;
return f;
}
/////////////////////////////////////////////////////////////
void enfiler(File*f, int val)
{ Elem *e;
e=(Elem*)malloc(sizeof(Elem));
e->val=val;
e->suiv=NULL;
if (f->dern==NULL)// si file vide
f->dern=f->prem=e;
else{ f->dern->suiv=e; f->dern=e; }
}
////////////////////////////////////////////////////////////////
void n_2_bin(File * F, int N)
{int t;
while(N != 0)
{ enfiler(F, N % 2);
t=N % 2;
N = (N -t)/ 2;
}
}
/////////////////////////////////////////////////////////////
int bin_2_n(File * F)
{ int N=0,i=0;
Elem*E =F->prem;
while(E != NULL)
{ N= N + E->val*pow(2,i);
i++; E = E->suiv;
}
return N;
}
///////////////////////////////////////////////////////////
void affiche_file(File*f)
{ Elem*e=f->prem;
if(f->dern==NULL)
printf("file vide");
printf("prem ->");
while(e!=NULL)
{printf("%d->",e->val);
e=e->suiv; }
printf("dern\n");
}
/////////////////////////////////////////////////////
int main()
{
File*F; F=Initialisation();
int N;
do{
printf("Entrez un entier\n");
scanf("%d",&N);
}while (N<0);
n_2_bin(F, N);
affiche_file(F);
printf("\nF2N =%d\n",bin_2_n(F));
return 0;
}