Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Définition
Représentation d'une liste en langage C
Initialisation
Ajout
Retrait
2
3
Une liste doublement chaînée est une liste dont chaque élément peut accéder à l'aide de
pointeurs aux éléments positionnés immédiatement avant et après lui dans la liste.
Le chaînage se fait donc dans les deux sens, ce qui permet de parcourir la liste en avant
comme en arrière, ce qui n'était pas possible avec la liste simple.
De plus s'il est aisé d'ajouter des éléments à chaque extrémité d'une liste simple, cela l'est
beaucoup moins quand il s'agit de retirer l'élément en fin de liste (dans le sens du chaînage).
La liste doublement chaînée nous en facilitera la tâche.
Comme pour la liste simple les éléments de la liste sont chaînés entre eux à l'aide de
pointeurs sur des éléments du même type qu'eux.
Dans le cas de la liste chaînée double, chaque élément aura un pointeur sur l'élément
précédent et un pointeur sur l'élément suivant. .
4
5
6
Pour définir un élément de la liste le type struct sera utilisé.
L'élément de la liste contiendra un ou des champs données et deux pointeurs pour accéder
à l’élément précédant et l’élément suivant.
typedef struct elem
{
int value;
struct elem *prev;
struct elem *next;
} elem ;
7
Notre liste aura deux points d'entrée un en tête de liste l'autre en fin de liste. Pour éviter de
traîner deux pointeurs, nous les mettrons dans une structure. Ceci aura pour avantage de
n'avoir qu'une seule variable à traiter par liste.
8
Nous allons construire cette liste afin qu'on puisse y insérer des éléments en début ou en fin
de liste et qu'on puisse les en retirer aussi bien par le début que par la fin de liste. Aidons
nous d'un schéma :
9
10
Ici aussi il faudra initialiser les pointeurs d'entrée à NULL, comme ils sont deux et pour
simplifier l'utilisation de la liste nous allons nous aider d'une fonction que l'on nommera Init.
11
12
Pour l'insertion d'éléments nous utiliserons deux fonctions PushBack et PushFront la
première ajoutera l'élément en fin de liste et la deuxième en début de liste. Elles recevront
donc comme paramètres la valeur à mémoriser mais aussi l'adresse d'une variable de type
dblist préalablement défini.
void PushBack(dblist *l, int val)
{ elem *nouv = malloc(sizeof(elem));
if(!nouv) exit(EXIT_FAILURE);
nouv->value = val;
nouv->prev = l->last;
nouv->next = NULL;
if(l->last) l->last->next = nouv;
else l->first = nouv;
l->last = nouv; } 13
void PushFront(dblist *l, int val)
{
elem *nouv = malloc(sizeof(elem));
if(!nouv) exit(EXIT_FAILURE);
nouv->value = val;
nouv->next = l->first;
nouv->prev = NULL;
if(l->first) l->first->prev = nouv;
else l->last = nouv;
l->first = nouv;
}
14
15
Le retrait des valeurs ce fera à l'aide des fonctions PopBack et PopFront la première retirera
l'élément de fin de liste et la deuxième celui de début de liste. Elles recevront évidement
comme paramètre l'adresse de la variable identifiant la liste et retourneront la valeur de
l'élément retiré.,
{ int val;
elem *tmp = l->last;
if(!tmp) return -1;
val = tmp->value;
l->last = tmp->prev;
if(l->last) l->last->next = NULL;
else l->first = NULL;
free(tmp);
return val;
} 16
int PopFront(dblist *l)
{
int val;
elem *tmp = l->first;
if(!tmp) return -1;
val = tmp->value;
l->first = tmp->next;
if(l->first)l->first->prev = NULL;
else l->last = NULL;
free(tmp);
return val;
} 17