Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Requis
I. INTRODUCTION
II. Définition
III. La construction du prototype d'un élément de la liste
IV. Opérations sur les listes circulaires
A. Initialisation
B. Insertion d'un élément dans la liste
1. Insertion dans une liste vide
2. Insertion dans une liste non vide
C. Suppression d'un élément dans la liste
1. Suppression au début de la liste
2. Suppression dans une liste avec un seul élément
D. Affichage de la liste
1. Affichage de la liste (du 1er vers le dernier élément)
2. Affichage de la liste sans condition d'arrêt (à l'infini)
E. Destruction de la liste
V. Exemple complet
liste_circ.h
liste_circ_function.h
liste_circ.c
VI. Voir aussi
A lire aussi: Liste circulaire
Requis
Les types de données
Les structures
L'utilisation de typedef
Les pointeurs
Les fonctions utilisateur
I. INTRODUCTION
Cette article a pour but la compréhension des listes circulaires.
L'implémentation en fonction des besoins et des performances vous appartient.
II. Définition
La liste circulaire est une sorte de liste simplement ou doublement chaînée, qui comporte une
caractéristique supplémentaire pour le déplacement dans la liste, "elle n'a pas de fin".
Pour rendre la liste sans fin, le pointeur suivant du dernier élément pointera sur le 1er
élément de la liste au lieu de la valeur NULL, que nous avons vu dans le cas des listes
simplement et doublement chaînées.
Dans les listes circulaires, nous n'arriverons jamais à une position depuis laquelle nous ne
pourrons plus nous déplacer.
En arrivant au dernier élément, le déplacement recommencera au premier élément. En bref, il
s'agit d'une rotation.
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;
A. Initialisation
Prototype de la fonction :
Cette opération doit être faite avant toute autre opération sur la liste.
Elle initialise le pointeur debut et le pointeur fin avec le pointeur NULL, et la taille avec la valeur
0.
La fonction
étapes :
allocation de la mémoire pour le nouvel élément
remplir le champ de données du nouvel élément
le pointeur suivant du nouvel élément pointera vers lui-même (c'est l'étape qui rend la
liste circulaire)
les pointeurs debut et fin pointeront vers le nouvel élément
la taille est mise à jour
La fonction
étapes:
allocation de la mémoire pour le nouvel élément
remplir le champ de données du nouvel élément
le pointeur suivant du nouvel élément pointe vers l'adresse du premier élément (garder
la liste circulaire)
le pointeur debut ne change pas
le pointeur fin pointe vers le nouvel élément
la taille est incrémentée d'une unité
La fonction
Prototype de la fonction:
étapes:
le pointeur supp_elem contiendra l'adresse du 1er élément
le pointeur debut pointera vers le 2ème élément
le pointeur suivant du dernier élément pointera vers le 1er élément (qui était le 2ème
avant la suppression)
la taille de la liste sera décrémentée d'un élément
La fonction
La fonction
D. 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.
En comparaison avec les listes simplement et doublement chaînées, où la condition d'arrêt est
donnée par le pointeur suivant du dernier élément, qui vaut NULL, pour la liste circulaire, il n'y a
pas de point d'arrêt, à moins que vous n'en choisissiez un.
Voici deux variantes d'affichage :
affichage de la liste (du 1er vers le dernier élément)
affichage de la liste sans condition d'arrêt (à l'infini)
La fonction
La fonction
E. Destruction de la liste
Pour détruire la liste entière, j'ai utilisé la suppression au début de la liste tant que la taille est
plus grande que 1, ensuite la suppression dans une liste avec un seul élément.
La fonction
liste_circ.h
liste_circ_function.h
/******************************\ * liste_circ_function.h *
\******************************/ void initialisation (Liste * liste){ liste-
>debut = NULL; liste->fin = NULL; liste->taille = 0; } /* insertion dans une
liste vide */ int ins_liste_circ_vide(Liste * liste, char *donnee){ Element
*nouveau_element; if ((nouveau_element = (Element *) malloc (sizeof
(Element))) == NULL) return -1; if ((nouveau_element->donnee = (char *) malloc
(50 * sizeof (char))) == NULL) return -1; strcpy (nouveau_element->donnee,
donnee); nouveau_element->suivant = nouveau_element; liste->debut =
nouveau_element; liste->fin = nouveau_element; liste->taille++; return 0; } /*
insertion dans une liste non-vide */ int ins_liste_circ(Liste * liste, Element
*courant, char *donnee){ Element *nouveau_element; if ((nouveau_element =
(Element *) malloc (sizeof (Element))) == NULL) return -1; if
((nouveau_element->donnee = (char *) malloc (50 * sizeof (char))) == NULL)
return -1; strcpy (nouveau_element->donnee, donnee); if(courant != liste->fin)
return -1; nouveau_element->suivant = courant->suivant; courant->suivant =
nouveau_element; liste->fin = nouveau_element; liste->taille++; return 0; } /*
suppression au début de la liste */ int supp_liste_circ(Liste * liste){ if
(liste->taille < 2) return -1; Element *supp_element; supp_element = liste-
>debut; liste->debut = liste->debut->suivant; liste->fin->suivant = liste-
>debut; free (supp_element->donnee); free (supp_element); liste->taille--;
return 0; } /* suppression dans une liste avec un seul élément*/ int
supp_liste_circ_unique(Liste *liste){ if (liste->taille != 1) return -1;
Element *supp_element; supp_element = liste->debut; liste->debut = NULL;
liste->fin = NULL; free (supp_element->donnee); free (supp_element); liste-
>taille--; return 0; } /* affichage de la liste */ void affiche (Liste *
liste){ Element *courant; courant = liste->debut; int i; for(i=0;i<liste-
>taille;++i){ printf ("%p - %s\n", courant, courant->donnee); courant =
courant->suivant; } } /* parcourir la liste à l'infini*/ void affiche_infini
(Liste * liste){ Element *courant; courant = liste->debut; while (1){ printf
("%p - %s\n", courant, courant->donnee); courant = courant->suivant; } } /*
detruire la liste */ void detruire (Liste * liste){ while (liste->taille > 0){
if(liste->taille > 1) supp_liste_circ (liste); else
supp_liste_circ_unique(liste); } } int menu (Liste *liste){ int choix;
printf("********** MENU **********\n"); if (liste->taille == 0){ printf ("1.
Ajout du 1er element\n"); printf ("2. Quitter\n"); }else { printf ("1. Ajout
d'un élément\n"); printf ("2. Suppression au début (la liste doit avoir au
moins 2 éléments)\n"); printf ("3. Suppression dans une liste avec un seul
élément\n"); printf ("4. Affiche liste circulaire\n"); printf ("5. Affiche
liste circulaire [Ctrl-C] pour quitter le programme\n"); printf ("6. Détruire
la liste\n"); printf ("7. Quitter\n"); } printf ("\n\nFaites votre choix : ");
scanf ("%d", &choix); getchar(); if(liste->taille == 0 && choix == 2) choix =
7; return choix; } /* -------- FIN liste_circ_function --------- */
liste_circ.c