Académique Documents
Professionnel Documents
Culture Documents
IMPLÉMENTATION
2/
IMPLÉMENTATION
3/
IMPLÉMENTATION
4/
IMPLÉMENTATION
5/
LISTES SIMPLEMENT CHAÎNÉES
6/
LISTES SIMPLEMENT CHAÎNÉES
En revanche, par rapport aux tableaux où les
éléments sont contigus dans la mémoire, les
éléments d'une liste sont éparpillés dans la
mémoire. La liaison entre les éléments se fait grâce
à un pointeur.
Le pointeur suivant du dernier élément doit pointer
vers NULL (la fin de la liste).
Pour accéder à un élément, la liste est parcourue
en commençant par la tête, le pointeur suivant
permettant le déplacement vers le prochain
élément. Le déplacement se fait dans une seule
direction, du premier vers le dernier élément.
7/
LISTES SIMPLEMENT CHAÎNÉES
Pour définir un élément de la liste le type struct
sera utilisé. L'élément de la liste contiendra un
champ donnée et un pointeur suivant. Le pointeur
suivant doit être du même type que l'élément,
sinon il ne pourra pas pointer vers l'élément. Le
pointeur "suivant" permettra l'accès vers le
prochain élément.
typedef struct ElementListe {
char *donnee;
struct ElementListe *suivant;
}Element;
8/
LISTES SIMPLEMENT CHAÎNÉES
Pour avoir le contrôle de la liste il est préférable de
sauvegarder certains éléments : le premier
élément, le dernier élément, le nombre d'éléments.
Pour réaliser cela une autre structure sera utilisée
(ce n'est pas obligatoire, des variables peuvent être
utilisées). Voici sa composition :
typedef struct ListeRepere {
Element *debut;
Element *fin;
int taille ;
}Liste ;
9/
LISTES SIMPLEMENT CHAÎNÉES
Le pointeur debut contiendra l'adresse du premier
élément de la liste. Le pointeur fin contiendra
l'adresse du dernier élément de la liste. La variable
taille contient le nombre d'éléments.
Quelle que soit la position dans la liste, les
pointeurs debut et fin pointent toujours
respectivement vers le premier et le dernier
élément.
Le champ taille contiendra le nombre d'éléments
de la liste quelle que soit l'opération effectuée sur
la liste.
10 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
Pour ajouter un élément dans la liste il y a plusieurs
situations :
1. Insertion dans une liste vide
2. Insertion au début de la liste
3. Insertion à la fin de la liste
4. Insertion ailleurs dans la liste
11 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
Insertion dans une liste vide
int ins_liste_vide (Liste *liste, char *donnee);
Étapes :
–remplir le champ de données du nouvel élément ;
–lepointeur suivant du nouvel élément pointera
vers NULL ;
–les pointeurs debut et fin pointeront vers le
nouvel élément ;
–la taille est mise à jour.
12 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
13 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
int ins_liste_vide (Liste * liste, char *donnee)
{
Element *nouveau_element;
strcpy (nouveau_element->donnee, donnee);
nouveau_element->suivant = NULL;
liste->debut = nouveau_element;
liste->fin = nouveau_element;
liste→taille++;
return 0;
14 /
}
OPÉRATIONS SUR LES LISTES CHAÎNÉES
Insertion au début de la liste
int ins_debut_liste (Liste *liste,char *donnee);
Étapes:
–remplir le champ de données du nouvel élément ;
–lepointeur suivant du nouvel élément pointe vers le
1er élément ;
–le pointeur debut pointe vers le nouvel élément ;
–le pointeur fin ne change pas ;
–la taille est incrémentée.
15 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
16 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
int ins_debut_liste (Liste * liste, char *donnee){
Element *nouveau_element;
strcpy (nouveau_element->donnee, donnee);
nouveau_element->suivant = liste->debut;
liste->debut = nouveau_element;
liste->taille++;
return 0;
}
17 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
Insertion à la fin de la liste
int ins_fin_liste (Liste *liste, Element *courant, char
*donnee);
Étapes:
–remplir le champ de données du nouvel élément ;
–le pointeur suivant du dernier élément pointe vers
le nouvel élément ;
–le pointeur fin pointe vers le nouvel élément ;
–le pointeur debut ne change pas ;
–la taille est incrémentée.
18 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
19 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
int ins_fin_liste (Liste * liste, Element * courant, char
*donnee)
{
Element *nouveau_element;
strcpy (nouveau_element->donnee, donnee);
courant->suivant = nouveau_element;
nouveau_element->suivant = NULL;
liste->fin = nouveau_element;
liste->taille++;
return 0;
} 20 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
Insertion ailleurs dans la liste
int ins_liste (Liste *liste, char *donnee,int pos);
L'insertion s'effectuera après une certaine position
passée en argument à la fonction.
Étapes:
–remplir le champ de données du nouvel élément ;
21 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
22 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
23 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
int ins_liste (Liste * liste, char *donnee, int pos)
{
if (liste->taille < 2)
return -1;
if (pos < 1 || pos >= liste->taille)
return -1;
Element *courant;
Element *nouveau_element;
int i;
24 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
courant = liste->debut;
for (i = 1; i < pos; ++i)
courant = courant->suivant;
if (courant->suivant == NULL)
return -1;
strcpy (nouveau_element->donnee, donnee);
nouveau_element->suivant = courant >suivant;
courant->suivant = nouveau_element;
liste->taille++;
return 0;
25 /
}
OPÉRATIONS SUR LES LISTES CHAÎNÉES
Pour supprimer un élément dans la liste il y a
plusieurs situations :
1. Suppression au début de la liste
2. Suppression ailleurs dans la liste
26 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
Suppression au début de la liste
int supp_debut (Liste *liste);
Étapes:
–lepointeur supp_elem contiendra l'adresse du 1er
élément
–le pointeur debut pointera vers le 2ème élément
–la taille de la liste sera décrémentée d'un élément
27 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
28 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
int supp_debut (Liste * liste){
if (liste->taille == 0)
return -1;
Element *supp_element;
supp_element = liste->debut;
liste->debut = liste->debut->suivant;
29 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
if (liste->taille == 1)
liste->fin = NULL;
free (supp_element->donnee);
free (supp_element);
liste->taille--;
return 0;
}
30 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
Suppression ailleurs dans la liste
int supp_dans_liste (Liste *liste, int pos);
Étapes:
–lepointeur supp_elem contiendra l'adresse vers
laquelle pointe le pointeur suivant d'élément
courant
–le pointeur suivant de l'élément courant pointera
vers l'élément sur lequel pointe le pointeur suivant
de l'élément qui suit l'élément courant dans la liste
31 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
Si l'élément courant est l'avant dernier
élément, le pointeur fin doit être mis à jour
–la taille de la liste sera décrémentée d'un
élément
32 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
33 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
34 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
35 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
for (i = 1; i < pos; ++i)
courant = courant->suivant;
supp_element = courant->suivant;
courant->suivant = courant->suivant->suivant;
if(courant->suivant == NULL)
liste->fin = courant;
free (supp_element->donnee);
free (supp_element);
liste->taille--;
return 0; 36 /
}
OPÉRATIONS SUR LES LISTES CHAÎNÉES
Affichage de la liste
Pour afficher la liste entière il faut se positionner au
début de la liste (le pointeur debut le permettra).
Ensuite en utilisant le pointeur suivant de chaque
élément, la liste est parcourue du 1er vers le dernier
élément.
La condition d'arrêt est donnée par le pointeur suivant
du dernier élément qui vaut NULL.
37 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
void affiche (Liste * liste)
{
Element *courant;
courant = liste->debut;
while (courant != NULL){
printf ("%p - %s\n", courant, courant->donnee);
courant = courant->suivant;
}
}
38 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
Pour détruire la liste entière, on utilise la suppression
au début de la liste tant que la taille est plus grande
que zéro.
39 /
OPÉRATIONS SUR LES LISTES CHAÎNÉES
EXEMPLE COMPLET
40 /