Professional Documents
Culture Documents
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.
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).
Reprsentation
Une liste chane est constitue dun ensemble de maillon
Chaque maillon est gnralement constitu:
e1
@ e2
Un maillon
e1
5
@ e2
e2
@ e3
e3
@ e4
e4
NULL
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
struct maillon {
valeur (type quelconque)
struct maillon * suivant;
};
typedef struct maillon maillon_t;
e1
9
@ e2
e2
@ e3
e3
@ e4
e4
NULL
10
Allocation mmoire
Exemple
#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
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);
}
16
17
Exemple
Programme quivalent:
void init_liste(Liste * liste)
{
*liste=NULL;
}
19
liste
20
21
22
En dbut de liste
la fin
Nimporte o dans la liste
e1
@ e2
e2
@ e3
e3
e
e1
23
@ e2
e2
NULL
@ e1
@ e3
e3
NULL
??
e1
@ e2
e2
@ e3
e3
NULL
e1
25
@ e2
e2
@ e3
e3
@e
??
NULL
Algorithme:
Parcourir la liste jusqu trouver le dernier maillon
Rajouter le nouveau maillon avec les bons liens de
chanage
Traiter les cas particuliers :
26
s= liste;
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;
}
e1
@ e2
e2
e3
@ e3
e1
28
@ e2
e2
@ e3
@ e4
e4
NULL
??
??
e3
@ e4
e4
NULL
e1
@ e2
e2
e3
@ e3
e1
29
@ e2
e2
@ e3
@ e4
e4
NULL
??
@ e3
e3
@ e4
e4
NULL
e1
@ e2
e2
e3
@ e3
e1
30
@ e2
e2
@ e3
@ e4
e4
NULL
??
@ e3
e3
@ e4
e4
NULL
e1
@ e2
e2
e3
@ e3
e1
31
@ e2
e2
@e
@ e4
e4
NULL
??
@ e3
e3
@ e4
e4
NULL
@ e2
@ e1
@e
@ e2
@ e4
@ e3
??
NULL
@ e4
33
35
En dbut de liste
la fin
Nimporte o dans la liste
e1
e1
36
@ e2
@ e2
e2
@ e3
e3
@ e4
e4
NULL
e2
@ e3
e3
@ e4
e4
NULL
e2
@ e3
e3
@ e4
e4
NULL
37
e1
e1
38
@ e2
@ e2
e2
e2
@ e3
@ e3
e3
e3
@ e4
NULL
e4
NULL
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
40
e1
e1
41
@ e2
@ e2
e2
e2
@ e3
@ e4
e3
e4
@ e4
NULL
e4
NULL
-13
@ e2
@ e3
@ e4
34
NULL
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
return liste;
}
}
44
e1
liste
45
@ e2
e2
@ e3
e3
@ e4
e4
NULL
}
return liste;
}
46