Vous êtes sur la page 1sur 3

Les listes doublement chainées

1. La structure d’une liste doublement chainée d’entiers

typedef struct cellule{


int valeur;
struct cellule *suivant;
struct cellule *precedent;

} cellule, *liste;

2. Ajouter un élément en tête d’une liste doublement chainée

liste Ajoutete(int val,liste l){


liste l1;
//Allouer une nouvelle cellule
l1=(liste)malloc(sizeof(cellule));
//Stocker la donnée
l1->valeur=val;
//Cette nouvelle cellule devienne la tete de la liste,
alors on attache à son suivant l'ancien tête pointé par l et à son
precedent NULL
l1->suivant=l;
l1->precedent=NULL;

//Si la liste n'est pas vide, on attache au précédent de l'ancien tête


la nouvelle cellule
if(l!=NULL)
l->precedent=l1;

return l1;
}

3. Ajouter un élément à la fin d’une liste doublement chainée

liste AjoutFin(int val,liste l){


liste l1;
//Allouer une nouvelle cellule
l1=(liste)malloc(sizeof(cellule));
//Stocker la donnée
l1->valeur=val;
//Cette nouvelle cellule devienne la dernière cellule de la liste,
//alors on attache à son suivant NULL
l1->suivant=NULL;

//Si la liste est vide la nouvelle cellule devienne la tête


//et la fin en même temps, alors son précédent devient NULL
if(l==NULL){
l1->precedent=NULL;
return l1;
}
//Sinon
else{
liste l2=l;
// On traverse la liste jusqu'à la dernière cellule
while(l2->suivant!=NULL){
l2=l2->suivant;
}
// On attache à son suivant la nouvelle cellule
l2->suivant=l1;
// Et au précédent de la nouvelle cellule l'ancienne dernière
cellule
l1->precedent=l2;

return l;

}
}

4. Afficher une liste doublement chainée -itérative-


void AffichList(liste l){
//Tant que la liste contient encore des éléments
while (l!=NULL) {
//On affiche le contenu de chaque cellule
printf(" %d ",l->valeur);
l=l->suivant;
}
printf("\n");
}

5. Supprimer la tête d’une liste doublement chainée


liste SuppTete(liste l){

liste l1;
//Si la liste est vide rien à supprimer
if(l==NULL)
return NULL;
//Sinon on supprime la première cellule, et la deuxième cellule
devienne
//la tête alors son précédent devient NULL
else
{
l1=l;
l=l->suivant;
free(l1);
l->precedent=NULL;
return l;
}}

6. Supprimer la fin d’une liste doublement chainée


liste SuppFin(liste l){
liste l1;
//Si la liste est vide rien à supprimer
if(l==NULL)
return NULL;
//Si la liste est composée d'une seule cellule on la supprime et on
retourne NULL
if(l->suivant==NULL)
{
free(l);
return NULL;
}
//Si la liste contient plusieurs cellules
l1=l;
//On traverse la liste jusqu'à la derniere cellule
while(l1->suivant!=NULL)
{
l1=l1->suivant;
}
// Et on attache au suivant de son precedent NULL puisqu'il devient
//la fin de la liste après la suppression de la derniere cellule
l1->precedent->suivant=NULL;
free(l1);

return l;

7. Supprimer toutes les occurrences d'un élément quelconque d’une liste doublement
chainée -itérative-

liste SupprimerElemQlcIter(int val, liste l)


{ liste l1=l;
while(l1!=NULL)
{
// Si on trouve la cellule qui contient la valeur à supprimer
if(l1->valeur==val)
{
//Si la premiere cellule contient la valeur à supprimer,
//la deuxieme cellule devienne la tête alors son precedent
devient NULL
if(l1->precedent==NULL){
l=l->suivant;
l->precedent=NULL;
}
// Sinon le suivant du precedent de la cellule à supprimer
devient le suivant de cette cellule
else{
l1->precedent->suivant=l1->suivant;
}
// Et si la cellule à supprimer n'est pas la derniere dans
la liste,
//alors le precedent du suivant la cellule à supprimer
devient le precedent de cette cellule
if(l1->suivant!=NULL){
l1->suivant->precedent=l1->precedent;
}
free(l1);
}

l1=l1->suivant;
}
return l;

Vous aimerez peut-être aussi