#include "liste.
h"
#include <stdio.h>
/*exercice 2*/
/*la liste de ce exercie est un liste d'entiers*/
/*question 1*/
void afficher(struct liste * l){
if (vide(l))
printf("la liste est vide ");
struct noeud * p=l->premier;
while (p){
if (p->info>0){/*je choisie d'afficher les nombres positifs*/
printf("%d",p->info);
p=p->suivant;
/*question 2*/
liste=creer();
inserer_apres_dernier(-1,*liste);
inserer_apres_dernier(-2,*liste);
inserer_apres_dernier(3,*liste);
inserer_apres_dernier(-5,*liste);
inserer_apres_dernier(5,*liste);
afficher(liste);
/*exercice1*/
//la pile contient des pointeurs sur des listes
#include <stdio.h>
#include <stdlib.h>
// Définition de la structure de noeud de la pile
typedef struct noeud {
liste* valeur;
struct noeud* suivant;
} Noeud;
// je choisie de declarer la pile de cette façon , c'est plus clair
typedef struct pile {
Noeud* sommet;
} Pile;
//definition de laa structure de la liste
typedef struct liste{
Noeud* premier;
Noeud* dernier;
}liste;
// Initialise une pile vide
void initialiser_pile(Pile* p) {
p->sommet = NULL;
// Vérifie si la pile est vide
int est_vide(Pile p) {
return (p.sommet == NULL);
// Empile une valeur sur la pile
void empiler(Pile* p, liste* valeur) {
// Alloue de la mémoire pour un nouveau noeud
Noeud* nouveau_noeud = (Noeud*)malloc(sizeof(Noeud));
// Affecte la valeur et le suivant du nouveau noeud
nouveau_noeud->valeur = valeur;
nouveau_noeud->suivant = p->sommet;
// Met à jour le sommet de la pile
p->sommet = nouveau_noeud;
// Dépile une liste de la pile
void depiler(Pile* p) {
// Vérifie si la pile est vide
assert(!est_vide(*p));
// Récupère la valeur du sommet de la pile
int valeur = p->sommet->valeur;
// Sauvegarde l'adresse du sommet pour libérer la mémoire plus tard
Noeud* ancien_sommet = p->sommet;
// Met à jour le sommet de la pile
p->sommet = p->sommet->suivant;
// Libère la mémoire allouée pour l'ancien sommet
free(ancien_sommet);
// Retourne la valeur dépilée
//retourner un pointeur sur la dernier liste dans la pile
Noeud* dernier(pile p){
assert(!est_vide(p));
return ( p.sommet->valeur);
//exercice 3
#include <stdio.h>
#include <stdlib.h>
// Définition de la structure de noeud de la liste
typedef struct noeud {
int valeur;
struct noeud* suivant;
} Noeud;
// Définition de la structure de liste
typedef struct liste {
Noeud* premier;
Noeud* dernier;
} Liste;
// Initialise une liste vide
void initialiser_liste(Liste* l) {
l->premier = NULL;
l->dernier = NULL;
// Ajoute une valeur à la fin de la liste
void ajouter_apres_dernier(Liste* l, int valeur) {
// Alloue de la mémoire pour un nouveau noeud
Noeud* nouveau_noeud = (Noeud*)malloc(sizeof(Noeud));
// Affecte la valeur et le suivant du nouveau noeud
nouveau_noeud->valeur = valeur;
nouveau_noeud->suivant = NULL;
// Si la liste est vide, le nouveau noeud devient le début et la fin de la liste
if (!l) {
l->premier = nouveau_noeud;
l->dernier = nouveau_noeud;
}
// Sinon, le nouveau noeud est ajouté à la fin de la liste
else {
l->dernier->suivant = nouveau_noeud;
l->dernier = nouveau_noeud;
//ajouter un element avant le premier de la liste
void ajouter_avant_premier(Liste* l, int valeur) {
// Alloue de la mémoire pour un nouveau noeud
Noeud* nouveau_noeud = (Noeud*)malloc(sizeof(Noeud));
// Affecte la valeur et le suivant du nouveau noeud
nouveau_noeud->valeur = valeur;
nouveau_noeud->suivant = NULL;
// Si la liste est vide, le nouveau noeud devient le début et la fin de la liste
if (!l) {
l->premier = nouveau_noeud;
l->dernier = nouveau_noeud;
// Sinon, le nouveau noeud est ajouté au début de la liste
else {
nouveau_noeud->suivant = l->premier;
l-premier = nouveau_noeud;
//supprimer le premeir element
void supprimer_premier(Liste* l) {
// Vérifie si la liste est vide
assert(l->premier!=NULL)
// Sauvegarde le noeud à supprimer
Noeud* noeud_a_supprimer = l->debut;
// Met à jour le début de la liste
l->premier = noeud_a_supprimer->suivant;
// Si le noeud à supprimer était le dernier élément de la liste, met à jour la fin de la liste
if (noeud_a_supprimer == l->dernier) {
l->dernier = NULL;
// Libère la mémoire du noeud à supprimer
free(noeud_a_supprimer);
// Supprime le successeur d'un noeud referencé de la liste
void supprimer_successeur(Liste* l, Noeud* noeud) {
// Vérifie si la liste est vide
assert(l->premier!=NULL)
// Vérifie si le noeud est le dernier élément de la liste
if (noeud == l->premier) {
printf("Erreur : le noeud est le dernier élément de la liste\n");
return;
// Retient le successeur du noeud
Noeud* successeur = noeud->suivant;
// Met à jour le suivant du noeud
noeud->suivant = successeur->suivant;
// Si le successeur était le dernier élément de la liste, met à jour la fin de la liste
if (successeur == l->dernier){
l->dernier=noeud;
void supprimer_reference(liste* l , Noeud* noeud){
//assureer que la liste n'est pas vide
assert(l->premier==NULL);
//si le noeud est le premier de la liste
if noeud==l->premier{
supprimer_premier(l);
return;
else if noeud==l->dernier{
//on cherche l'element precedent
Noeud* precedent=l->premier;
while precedent->suivant!=noeud{
precedent=precedent->suivant;
l->dernier=precedent;
precedent->suivant=NULL;
//si le noeud est dans le milieu de la liste
else {
*(noeud->suivant)=*noeud;