You are on page 1of 4

Algorithmique et Structures de Donnes II

Anne Universitaire 2006-2007

Les Listes chanes


Lorsque vous crez un algorithme utilisant des conteneurs, il existe diffrentes manires de les implmenter. La faon la plus courante, que vous connaissez, est les tableaux. Lorsque vous crez un tableau, les lments de celui ci sont placs de faon contigu en mmoire. Pour pouvoir le crer il vous faut connatre sa taille. Si vous voulez supprimer un lment au milieu du tableau, il vous faut recopier les lments temporairement, rallouer le tableau, puis le remplir partir de l'lment supprimer. En bref, ce sont beaucoup de manipulations coteuses en ressources. Une liste chane est diffrente dans le sens o les lments de votre liste sont rpartis dans la mmoire et relis entre eux par des pointeurs. Vous pouvez ajouter et enlever des lments d'une liste chane n'importe quel endroit, n'importe quel instant, sans devoir recrer la liste entire. Nous allons essayer de voir ceci plus en dtail sur cet schma :

Vous avez sur ce schma la reprsentation que l'on pourrait faire d'un tableau et d'une liste chane. Chacune de ces reprsentation possde ses avantages et inconvnients. C'est lors de l'criture de votre programme que vous devez vous poser la question de savoir laquelle des deux mthodes est la plus intressante :

Dans un tableau, la taille est connue, l'adresse du premier lment aussi. Lorsque vous dclarez un tableau la variable contiendra l'adresse du premier lment de votre tableau. Comme le stockage est contigu, et la taille de chacun des lments connus, il est possible d'atteindre directement la case i d'un tableau. Pour dclarer un tableau il faut connatre sa taille. Les suppressions d'un lment vont entraner, bien souvent, un dplacement de lments qui suivent pour combler ce trou. Dans une liste chane, la taille est inconnue au dpart, la liste peut avoir autant d'lments que votre mmoire le permet. Il est en revanche impossible d'accder directement l'lment i de la liste chane. Pour ce faire, il vous faudra traverser les i-1 lments prcdents de la liste. Pour dclarer une liste chane il suffit de crer le pointeur qui va pointer sur le premier lment de votre liste chane, aucune taille n'est spcifier donc. Il est possible d'ajouter, de supprimer, d'intervertir des lments dune liste chane sans avoir recrer la liste en entier mais en manipulant simplement leurs pointeurs.

BEN MAHMOUD Chaker

Page 1 / 4

Algorithmique et Structures de Donnes II

Anne Universitaire 2006-2007

Structure dune liste chane


Chaque lment d'une liste chane est compos de deux parties :

La valeur que vous voulez stocker. L'adresse de l'lment suivant s'il existe.
Donn pointeur dlments suivant

Reprsentation dun lment

Une liste chane tant une succession des lments, dont le dernier pointe vers adresse invalide (NULL); voici une reprsentation possible :

Bien sr, ce n'est qu'une reprsentation, il se peut que les structures qui composent la liste ne soit pas places dans l'ordre en mmoire et encore moins de faon contigu. Au vu de l'utilisation des listes chanes, il se dessine clairement quelques fonctions indispensables :

Initialisation Ajout d'un lment Suppression d'un lment Accs l'lment suivant Accs au dernier lment de la liste, .

Le principal problme des listes chanes est l'absence de pointeur sur l'lment prcdent de la liste, il est donc possible de parcourir la chane uniquement du dbut vers la fin. Pour faciliter l'implmentation, nous allons faire quelques simplifications :

Sauvegarde du premier lment de la chane, ceci permet de retourner au dbut de la liste, L'ajout s'effectue la suite de l'lment spcifi en paramtre de la fonction.

Voici donc la reprsentation dfinitive de notre structure en mmoire, start reprsentent le pointeur ddi la sauvegarde du premier lment de la liste :

Dclaration en C d'une liste chane struct cellule { };


Dclaration dun synonyme de cette liste : Typedef struct cellule Cration dune liste vide : Liste
BEN MAHMOUD Chaker

int val; struct cellule *suivant; *Liste;

L=NULL ;
Page 2 / 4

Algorithmique et Structures de Donnes II

Anne Universitaire 2006-2007

Les primitives daccs :


Soit L est liste chane avec pointeur. Soit p une position. Soit x un type entier.

Fonction
Position Premier (Liste L) { return (L) ; }

Appel
P=premier(L) ; Ou bien P=L ;

Position Suivant ( Position P, Liste L) { return (Psuivant) ; }

P=suivant(P,L) ; Ou bien P=Psuivant ;

Int valeur (Position P, Liste L) { return (Pval) ; }

P=valeur(P,L) ; Ou bien P=Pval ;

Position Fin (Liste L) { return (NULL) ;

P=Fin(L) ; Ou bien P=NULL ;

Position queue (Liste L) { Position P ; P=L ; While(Psuivant !=NULL) P= Psuivant return (P) ; } Position prcdant (Position P, Liste L) { Position q ; q=L; While (qsuivant !=P) q= qsuivant return (q) ; }

BEN MAHMOUD Chaker

Page 3 / 4

Algorithmique et Structures de Donnes II

Anne Universitaire 2006-2007

Ajouter un lment d'une liste chane :


Ajouter en tte

Liste

ajouterEnTete (Liste L, int valeur)


{ Liste q ; q = (cellule*) malloc (sizeof (cellule)); q val = valeur; q suivant = L; L=q; return q; }

Ajouter en fin de liste

Liste

ajouterEnFin (liste L, int valeur) { Position p,q ; q = (cellule*) malloc (sizeof (cellule)); q val = valeur; if (L == NULL) { q suivant = NULL; L=q; else { }

p = queue(L); p suivant = q; q suivant = NULL;

} return L ; }
BEN MAHMOUD Chaker Page 4 / 4

You might also like