0% ont trouvé ce document utile (0 vote)
46 vues7 pages

Gestion de listes et de piles en C

Le document contient la définition de structures de données pour représenter des listes et des piles. Il présente également des fonctions pour manipuler ces structures comme ajouter, supprimer ou afficher des éléments.

Transféré par

essadam96
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats DOCX, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
46 vues7 pages

Gestion de listes et de piles en C

Le document contient la définition de structures de données pour représenter des listes et des piles. Il présente également des fonctions pour manipuler ces structures comme ajouter, supprimer ou afficher des éléments.

Transféré par

essadam96
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats DOCX, PDF, TXT ou lisez en ligne sur Scribd

#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;

Vous aimerez peut-être aussi