You are on page 1of 46

UNIVERSITE ABDELHAMID IBN BADIS MOSTAGANEM

FACULTE DES SCIENCES EXACTES ET DE LINFORMATIQUE


DEPARTEMENT DE MATHEMATIQUES ET INFORMATIQUE

Cours 4 ASD
Structures de donnes lmentaires-Liste chane

Liste chane
Une liste chane est une structure de donnes qui
permet de stocker une squence dobjets dun mme
type.
En cela, les listes chanes ressemblent aux tableaux.
Exemple :
La squence dentiers 3, 7, 2, 4 peut tre reprsente la
fois sous forme de tableau ou de liste.

Liste chane versus tableau


Il y a cependant des diffrences fondamentales entre les
listes et les tableaux :

Une liste chane est une structure linaire qui n'a pas de
dimension fixe sa cration. Ses lments de mme
type sont parpills dans la mmoire.
Dans un tableau on a accs immdiat nimporte quel lment
par son indice (accs dit alatoire), tandis que dans une liste
chane on a accs aux lments un aprs lautre, partir du
premier lment (accs dit squentiel).
Un tableau a une taille fixe, tandis quune liste peut a une taille
qui varie dynamiquement (on peut toujours rajouter ou
supprimer un lment une liste).

Avantages et inconvnients des listes


chanes
Le principale avantage des listes chanes sur les tableaux
en C est que leur taille peut grandir ou diminuer en cours
dutilisation.
Lautre avantage des listes chanes est leur souplesse
dans le rarrangement de leurs lments: on peut
facilement rajouter ou supprimer un lment nimporte
quel emplacement.
Les listes chanes prsentent nanmoins un inconvnient
qui est celui de laccs aux lments: il faut toujours
passer par le premier lment de la liste (tte de liste)
pour accder un lment de manire squentielle.

Reprsentation
Une liste chane est constitue dun ensemble de maillon
Chaque maillon est gnralement constitu:

Dun champs lment


Dun champs pointeur qui indique le maillon suivant

e1

@ e2

Un maillon

Comment a se passe lorsquon atteint la fin de la liste


chane

Le dernier maillon indique quil ny a pas de maillon en mettant


le champs pointeur NULL

e1
5

@ e2

e2

@ e3

e3

@ e4

e4

NULL

Les diffrentes listes chanes


Il existe diffrents types de listes chanes :

Liste simplement chane: constitue d'lments relis entre


eux par des pointeurs.
Liste doublement chane: chaque lment dispose non plus
d'un mais de deux pointeurs pointant respectivement sur
l'lment prcdent et l'lment suivant. Ceci permet de
lire la liste dans les deux sens, du premier vers le dernier
lment ou inversement.
Liste circulaire: le dernier lment pointe sur le premier
lment de la liste. S'il s'agit d'une liste doublement chane
alors le premier lment pointe galement sur le dernier.

Liste chane en C
En C la structure de donnes liste chane nexiste
pas en natif comme cest le cas pour les tableaux
Pour pouvoir utiliser une telle structure il est donc
ncessaire de la dfinir
Il faudra galement dfinir les oprations de base qui
permettent de manipuler une telle structure

Dfinition dune liste chane en C


crire une structure en C qui dcrit un maillon
constituant une liste chane:

struct maillon {
valeur (type quelconque)
struct maillon * suivant;
};
typedef struct maillon maillon_t;

valeur : donne stocke dans un maillon. Peut tre de


type int, float, double, tableau,
suivant: pointeur sur le maillon suivant. Ce pointeur
permet de lier les maillons entre eux.

Dfinition dune liste chane en C (2)


Une liste chane va donc pointer vers le premier maillon
de la chane.
Elle sera de la forme:

typedef maillon_t * Liste

e1
9

@ e2

e2

@ e3

e3

@ e4

e4

NULL

Allocation dynamique de la mmoire

Les listes chanes entranent l'utilisation de procdures


d'allocation et de libration dynamiques de la mmoire
Le langage C offre les outils ncessaires de gestion de la
mmoire:

malloc pour la rservation de lespace mmoire:

10

Dune taille donne


Dun type donne

free pour la libration de lespace mmoire

Allocation mmoire

Fonction de la librairie <stdlib.h>


void * malloc (size_t taille)
Renvoie un pointeur gnrique sur une zone mmoire de
taille taille en octets
NULL si lallocation a chou
La fonction malloc permet dallouer dynamiquement une
zone de mmoire contige dont la taille, exprime en
octets, lui est passe en argument.
Cette fonction retourne ladresse du dbut de la zone
alloue ou le pointeur NULL en cas derreur dallocation.
11

Exemple

Bibliothque dans laquelle est


dfinie la fonction malloc

#include<stdio.h>
#include<stdlib.h>
void main(){
float *adr;
int i;
adr = malloc(50*sizeof(float));
for(i=0; i<50; i++)
adr[i]= 0.8;
}

12

Allocation
mmoire de 50
rels

Libration de la mmoire

Fonction de la librairie <stdlib.h>


void free (void * p)
Cette fonction permet de librer lespace mmoire
point par le pointeur p
La mmoire doit avoir t pralablement alloue
dynamiquement
La fonction free prend en argument ladresse de dbut de
la zone de mmoire librer et ne retourne aucun
rsultat.

13

Exemple
#include<stdio.h>
#include<stdlib.h>
void main(){
char *adr;
int i;
adr = malloc(30*sizeof(char));
free(adr);
}

14

Remarques importantes

La valeur retourne par malloc est de type void * et devra donc tre
systmatiquement convertie dans le type dsire laide de
loprateur de cast
La valeur retourne par malloc peut tre gale NULL lorsquune
erreur se produit, il faut donc systmatiquement vrifier la valeur
retourne avant de lutiliser (sinon erreur de segmentation)
Exemple:
int * valeur ;
valeur=(int *) malloc(sizeof(int));
if (valeur == NULL){
perror( erreur dallocation mmoire );
exit(EXIT_FAILURE);
}

malloc, free, exit : stdlib.h


perror: stdio.h
15

Les fonctions de manipulation des listes


chanes en C

Nous avons cr une structure de liste chane qui


permet de grer une liste chane :

maillon_t, qui correspond un maillon de la liste et que l'on


peut dupliquer autant de fois que ncessaire ;
Liste, qui contrle l'ensemble de la liste.

Il faut maintenant dfinir les fonctions lmentaires pour


pouvoir manipuler une liste chane.

16

Les fonctions lmentaires pour les listes


chanes

Ces fonctions peuvent tre:

initialiser une liste


tester si une liste est vide
afficher le contenu de la liste
ajouter un lment la liste
supprimer un lment de la liste
supprimer la liste entire

D'autres fonctions peuvent tre galement dfinies


comme par exemple le calcul de la taille d'une liste, la
recherche dun lment, etc.

17

Exemple

On suppose que nous avons dfini la liste suivante:


struct maillon {
int valeur ;
struct maillon * suivant;
};
typedef struct maillon maillon_t;
typedef maillon_t * Liste;

Les lments de cette liste sont des entiers


Chaque maillon est de type maillon_t
Les pointeur sont de type Liste (pointeurs sur maillon_t)
18

Initialisation dune liste


Cette fonction permet de crer une liste vide o il ny a
aucun maillon
Liste init_liste()
{
return NULL;
}

Programme quivalent:
void init_liste(Liste * liste)
{
*liste=NULL;
}
19

liste

Tester si une liste est vide


Cette fonction retourne 1 si la liste est vide 0 sinon

int est_vide(Liste liste){


return liste == NULL ;
}

20

Afficher les lments dune liste

Cette fonction ncessite de parcourir toute la liste


void affiche_liste (Liste liste){
Liste p = liste;
while (p != NULL){
printf( %d , pvaleur);
p=psuivant;
}
printf( \n);
}

21

Insertion dans une liste

Pour insrer un nouvel lment dans une liste


simplement chane quelconque, il existe plusieurs
possibilit.
Linsertion peut se faire soit:

22

En dbut de liste
la fin
Nimporte o dans la liste

Ajouter un lment en dbut dune liste

e1

@ e2

e2

@ e3

e3

e est llment qui devra tre rajout

e
e1

23

@ e2

e2

NULL

@ e1

@ e3

e3

NULL

??

Ajouter un lment en dbut dune liste


Liste inserer_element_debut(Liste liste, int e){
Liste p=(Liste) malloc(sizeof(maillon_t));
if ( p == NULL){
perror( erreur dallocation mmoire );
exit(EXIT_FAILURE);
}
pvaleur = e;
psuivant = liste;
return p;
}
24

Ajouter un lment la fin dune liste

e1

@ e2

e2

@ e3

e3

NULL

e est llment qui devra tre rajout

e1

25

@ e2

e2

@ e3

e3

@e

??

NULL

Ajouter un lment la fin dune liste

Algorithme:
Parcourir la liste jusqu trouver le dernier maillon
Rajouter le nouveau maillon avec les bons liens de
chanage
Traiter les cas particuliers :

26

Cas dune liste vide

Ajouter un lment la fin dune liste


Liste inserer_element_fin(Liste liste, int e){
Liste p ; /* contient ladresse du nouveau
maillon */

/* cas dune liste non vide ncessite le parcours


de la liste */

s= liste;

Liste s ; /* permet de parcourir la liste sans


modifier ladresse du dbut qui est stocke
dans liste */

while (s suivant != NULL)


s = s suivant;

s suivant = p;

p=(Liste) malloc(sizeof(maillon_t));
if ( p == NULL){
perror( erreur dallocation mmoire );
exit(EXIT_FAILURE);
}
p->valeur = e;
p suivant = NULL ;
/* cas dune liste vide */

if ( liste == NULL)
return p ;

27

return liste;
}

Ajouter un lment nimporte o

e1

@ e2

e2

e3

@ e3

e est llment qui devra tre rajout

e1
28

@ e2

e2

@ e3

@ e4

e4

NULL

??

??

e3

@ e4

e4

NULL

Ajouter un lment nimporte o

e1

@ e2

e2

e3

@ e3

e est llment qui devra tre rajout

e1
29

@ e2

e2

@ e3

@ e4

e4

NULL

??

@ e3

e3

@ e4

e4

NULL

Ajouter un lment nimporte o

e1

@ e2

e2

e3

@ e3

e est llment qui devra tre rajout

e1
30

@ e2

e2

@ e3

@ e4

e4

NULL

??

@ e3

e3

@ e4

e4

NULL

Ajouter un lment nimporte o

e1

@ e2

e2

e3

@ e3

e est llment qui devra tre rajout

e1
31

@ e2

e2

@e

@ e4

e4

NULL

??

@ e3

e3

@ e4

e4

NULL

Ajouter un lment nimporte o


On suppose quon insre un lment dans une liste trie:
Exemple:

@ e2
@ e1

@e
@ e2

@ e4
@ e3

??

NULL
@ e4

Ncessite daccder au maillon prcdent parcours de


la liste avec 2 pointeurs
32

Ajouter un lment nimporte o


On suppose quon insre un lment dans une liste trie:
Algorithme :
Parcourir la liste
Trouver lemplacement du nouveau maillon
Insrer le nouveau maillon avec les bons liens de chanage
Traiter les cas particuliers:
- Insrer dans une liste vide
- Insrer en dbut de liste
- Insrer en fin de liste

33

Ajouter un lment nimporte o


Liste inserer_element(Liste liste, int e){
Liste p ; /* contient ladresse du nouveau
maillon */
Liste s1, s2 ; /* permettent de parcourir la
liste en gardant les informations sur le
maillon et le maillon prcdent*/
p=(Liste) malloc(sizeof(maillon_t));
if ( p == NULL){
perror( erreur dallocation
mmoire );
exit(EXIT_FAILURE);
}
p->valeur = e;
/* cas dune liste vide */
if ( liste == NULL){
p suivant = NULL ;
return p ;
}
}
34

/* cas dajout en dbut de liste */


if ( p valeur <= liste valeur) {
p suivant = liste;
return p ;
}
s1= liste;
while (( p valeur > s1 valeur) && (s1
!= NULL)){
s2 = s1;
s1 = s1 suivant;
}
p suivant = s2 suivant ;
s2 suivant = p ;
return liste;
}

Supprimer un lment dans une liste

Pour supprimer un lment dans une liste simplement


chane quelconque, il existe plusieurs possibilit.
La suppression concerne un lment qui peut se trouver
soit:

35

En dbut de liste
la fin
Nimporte o dans la liste

Supprimer un lment en dbut de liste

e1

e1

36

@ e2

@ e2

e2

@ e3

e3

@ e4

e4

NULL

e2

@ e3

e3

@ e4

e4

NULL

e2

@ e3

e3

@ e4

e4

NULL

Supprimer un lment en dbut de liste


Liste supprimer_debut (Liste liste){
Liste premier;
if ( liste == NULL) return NULL;
premier = liste;
liste =liste ->suivant;
free(premier);
return liste;
}

37

Supprimer un lment en fin de liste

e1

e1

38

@ e2

@ e2

e2

e2

@ e3

@ e3

e3

e3

@ e4

NULL

e4

NULL

Supprimer un lment en fin de liste

Algorithme:
Parcourir la liste jusquau dernier maillon
Mettre le champs suivant de lavant dernier maillon
NULL
Supprimer le dernier maillon
Traiter les cas particuliers:

39

Cas dune liste vide


Cas dun seul lment dans la liste

Supprimer un lment en fin de liste


Liste supprimer_fin(Liste liste){
Liste s1, s2 ; /* permettent de
parcourir la liste en gardant les
informations sur le maillon et le
maillon prcdent*/
/* cas dune liste vide */
if ( liste == NULL)
return NULL ;
/* cas dun seul lment */
if ( listesuivant == NULL ){
free(liste);
return NULL;
}
}

40

/* cas de plus dun lment */


s1= liste suivant;
s2 = liste;
while (s1 suivant != NULL){
s2 = s1;
s1 = s1 suivant;
}
s2 suivant = NULL ;
free(s1);
return liste;
}

Supprimer nimporte o dans la liste

e1

e1

41

@ e2

@ e2

e2

e2

@ e3

@ e4

e3

e4

@ e4

NULL

e4

NULL

Supprimer nimporte o dans la liste


Par exemple on supprime le maillon contenant la valeur val:
val == 8

-13

@ e2

@ e3

@ e4

34

NULL

Ncessite daccder au maillon prcdent parcours de


la liste avec 2 pointeurs
42

Supprimer un lment nimporte o

Algorithme:
Parcourir la liste jusqu trouver le maillon contenant
val
Mettre dans le champs suivant du maillon prcdent
ladresse du maillon suivant
Supprimer le maillon contenant val
Traiter les cas particuliers:

43

Cas dune liste vide


Cas de suppression en dbut de liste

Supprimer nimporte o dans la liste


Liste supprimer_element(Liste liste, int val){
Liste d; /* contient ladresse du maillon
supprimer sil est en dbut de liste */
Liste s1, s2 ; /* permettent de parcourir la
liste en gardant les informations sur le
maillon et le maillon prcdent*/
/* cas dune liste vide */
if ( liste == NULL) return NULL ;

/* cas de suppression du premier maillon */


if ( listevaleur == val ){
d=liste;
liste =liste suivant;
free(d);

return liste;
}
}
44

/* cas de suppression ailleurs quen


dbut */
s1= liste suivant;
s2 = liste;
while ((s1valeur !=val) &&
(s1 suivant != NULL)){
s2 = s1;
s1 = s1 suivant;
}
if (s1 valeur == val){
s2suivant=s1suivant;
free(s1);
}
return liste;
}

Supprimer tous les lments dune liste


liste

e1

liste

45

@ e2

e2

@ e3

e3

@ e4

e4

NULL

Supprimer les lments dune liste


Liste supprimer_liste (Liste liste,){
Liste p ; /* contient ladresse du maillon
supprimer */

/* cas liste vide */


if (liste == NULL) return NULL;

while ( liste != NULL){


p=liste;
liste = liste suivant;
free(p)

}
return liste;
}
46

You might also like