ALGORITHME ET STRUCTURES DE DONNÉES II LES LISTES Dr. Jihène Tounsi ISG de Sousse Site web http://www.jihenetounsi.com Email: [email protected] Sommaire Liste simplement chaînée Liste doublement chaînée Liste circulaire Liste simplement chaînée Le nombre d’élément n’est pas connu à la création de la liste Une structure regroupant de données de même type Les données sont chaînées entre eux par des pointeurs. Un élément de la liste pointe sur l’élément suivant Le dernier élément ne pointe sur rien (Pointeur Null) Une liste est accessible seulement par sa tête Cours développé par Dr. Jihène Tounsi Structure Déclaration d’un enregistrement représentant l’élément de la liste avec les attributs Nom_Pointeur:^Type_élément Données:Type Un Type Liste qui est un pointeur sur le premier élément de la liste Liste:^Type_élément Cours développé par Dr. Jihène Tounsi Structure Suivant = pointeur stockant l’@ de l’élément suivant de la liste Donnée Suivant Donnée Suivant Donnée Suivant Donnée Suivant @ du 1er élément de la liste Liste (ou p comme le cours)= pointeur sur le premier élément de la liste Cours développé par Dr. Jihène Tounsi Exemple 1 Algorithme Exemple_Liste_Chaînée; Type //Le nœud de la liste element = enregistrement Donnée:entier //l’information à enregistrer Suivant:^element //pointeur vers l’élément suivant Fin enregistrement Liste=^element Variables L:Liste //équivalent à p du cours C’est le pointeur vers le premier noeud Debut …. Fin. Les opérations sur les listes chaînées Opérations de création de liste Création Liste vide Opérations d’accessibilité Afficher la longueur de la liste Afficher si Liste vide ou non Retourner Tête de la liste Retourner fin de la liste Les opérations sur les listes chaînées Opérations de modification Ajout début de liste Ajout Fin de la liste Insertion à un rang donné … Opérations d’affichage Recherche d’un élément Affichage de tous les éléments Dans ce qui suit des exemples d’implémentation de quelques fonctions Fonction CréerListeVide() :Liste Algorithme Exemple_Liste_Chaînée; Type Element = enregistrement Donnée:entier Suivant:^element Fin enregistrement Liste=^element Fonction CréerListeVide():Liste Debut Retourner Null Fin fonction. Variables L:Liste Debut //Utilisation de la fonction dans le programme principal ou affecter null au pointeur tête de liste LCréerListeVide(); //Lnull Fin. Fonction EstVide(l:Liste) :Booléen Algorithme Exemple_Liste_Chaînée; Type Element = enregistrement Donnée:entier Suivant:^element Fin enregistrement Liste=^element Fonction EstVide(l:Liste):Booléen Debut Si (l ==null) alors Retourner Vrai Sinon Retourner Faux Fin fonction. Variables L:Liste Debut … Fin. Fonction longueur(l:Liste) :entier Algorithme Exemple_Liste_Chaînée; Type Element = enregistrement Donnée:entier Suivant:^element Fin enregistrement Liste=^element Fonction longueur(l:Liste):entier //Retourner le nbr d’éléments N:entier P:Liste Debut Pl Si (Non(EstVide(l))) alors N1 Tant que (P^.suivant <>null) NN+1 PP^.suivant Fin Tant que Sinon N0 Fin Si Retourner(N) Fin fonction. …. Fonction Accès(l:Liste, r:entier) :Liste Algorithme Exemple_Liste_Chaînée; …. Fonction Accès(l:Liste, r: entier):Liste //Retourner une sous liste à partir d’un rang donné N:entier P:Liste Debut //l e rang est correcte Si (1<=r et r<= longueur(l)) alors //Obtenir 1er élément de la liste. N servira à compter le nombre d’éléments parcourus jusqu’à arriver au rang recherché N1 //Pour ne pas perdre la tête de la liste créer un pointeur intermédiaire pour se déplacer Pl //faire le parcours jusqu’à N arrive au rang escompté Tant que (N<R) //Accéder à l’élément suivant NN+1 PP^.suivant Fin Tant que Sinon Ecrire(« rang incorrecte ») PNull Fin Si Retourner(P) Fin fonction. Autres Fonctions d’accès Accès Premier élément Algorithme Exemple_Liste_Chaînée; …. Fonction Accès_PremierElement(l:Liste):Liste Debut Retourner(Accès(l,1)) Fin fonction. Accès dernier élément Algorithme Exemple_Liste_Chaînée; …. Fonction Accès_DernierElement(l:Liste):Liste Debut Retourner(Accès(l,longueur(l))) Fin fonction. Procédure ajouterTêteListe(l:liste,e:entier) Procédure ajouterTêteListe(l:Liste, e:entier) N:entier NC:Liste Debut //Allouer Dynamiquement une nouvelle cellule Nouveau(NC) Si (NC) alors NC^.donnéee Si (Estvide(l)) alors //Créer le premier élément de la liste NC^.suivantNull lNC Sinon //Créer le premier élément de la liste et le chaîner aux restes des éléments NC^.suivantl lNC Fin si Sinon Ecrire(« Mémoire Insuffisante ») Fin si Fin fonction. Procédure ajouterFinListe(l:liste,e:entier) Procédure ajouterfinListe(l:Liste par adresse, e:entier) N:entier P,NC:Liste Debut Si (Estvide(l)) alors // le premier élément et aussi le dernier de la liste ajouterTêteListe(l,e) Sinon //Allouer Dynamiquement une nouvelle cellule Nouveau(NC) Si (NC) alors NC^.donnéee //accéder au dernier élément Paccès(l,longueur(l)) //le dernier élément de la liste doit pointer sur NC P^.suivantNC //NC est maintenant le dernier élément donc il n’a pas de suivant NC^.suivantnull Sinon Ecrire(« Mémoire Insuffisante ») Fin si Fin Si Fin fonction. Procédure Insérer(l:liste,e:entier,r: entier) Procédure Insérer(l:Liste, e:entier,r: entier) N:entier P,NC:Liste Debut Si (1<=r et r<= longueur(l)+1) alors Si (r==1) alors //ajout début de la liste ajouterTêteListe(l,e) Sinon Si (r== longueur(l)+1) alors //ajout Fin de la liste ajouterfinListe(l,e) Sinon //ajout au sein de la liste donc accéder au rang-1 Paccès(l,r-1) //Allouer Dynamiquement une nouvelle cellule Nouveau(NC) //L’allocation ne peut avoir lieu que s’il y a de l’espace Mémoire suffisant sinon Nouveau retourne NULL Si(NC) alors NC^.donnéee NC^.suivantP^.suivant P^.suivantNC Sinon Ecrire(« Mémoire Insuffisante ») Fin si Fin Si Fin Si Sinon Ecrire(« rang incorrecte ») Fin Si Fin fonction. Sommaire Liste simplement chaînée Liste doublement chaînée Liste circulaire Liste doublement chaînée C’est une variante de la liste simplement chaînée Les données sont chaînées entre eux par deux pointeurs. Un élément de la liste pointe sur l’élément suivant et sur l’élément précédent Le dernier élément pointe seulement sur son prédécesseur Le premier élément pointe seulement sur son successeur Une liste est accessible par sa tête. Le pointeur pointe toujours sur le premier élément. Cours développé par Dr. Jihène Tounsi Structure Suivant = pointeur stockant l’@ de l’élément suivant de la liste prec Donnée Suiv prec Donnée Suiv prec Donnée Suiv Suivant = pointeur stockant l’@ de l’élément précédent de la liste @ du 1er élément de la liste Liste = pointeur sur le premier élément de la liste Cours développé par Dr. Jihène Tounsi Exemple 1 Algorithme Exemple_Liste_Chaînée; Type Element = enregistrement Donnée:entier Suiv:^element Prec:Liste //equivalent à ^element Fin enregistrement Liste=^element Variables L:Liste Debut …. Fin. Sommaire Liste simplement chaînée Liste doublement chaînée Liste circulaire Liste circulaire Même chose que la liste doublement chaînée Les données sont chaînées entre eux par deux pointeurs. Un élément de la liste pointe sur l’élément suivant et l’élément précédent Le dernier élément pointe sur son prédécesseur mais aussi sur le premier élément de la liste Le premier élément peut pointer soit: Seulement sur son successeur (structure circulaire uni-sens) Ou sur son successeur et son prédécesseur (dernier élément de la liste) (structure circulaire double sens). Cours développé par Dr. Jihène Tounsi Structure circulaire uni-sens Suivant = pointeur stockant l’@ de l’élément suivant de la liste prec Donnée Suiv prec Donnée prec Suiv Donnée Suiv Suivant = pointeur stockant l’@ de l’élément précédent de la liste @ du 1er élément de la liste Liste = pointeur sur le premier élément de la liste Cours développé par Dr. Jihène Tounsi Structure circulaire double sens prec Donnée Suiv prec Donnée Suiv prec Donnée Suiv Cours développé par Dr. Jihène Tounsi Application Écrire une procédure qui permet d’afficher la liste simplement chaînée de personnes. Une personne est défini par son nom, son CIN et son genre (F ou M). Même chose pour une liste doublement chaînée Même chose pour une liste circulaire Que peut on conclure?? Fin chapitre 2….