{"id":341,"date":"2021-09-08T18:28:12","date_gmt":"2021-09-08T18:28:12","guid":{"rendered":"https:\/\/www.louismarchand.me\/?page_id=341"},"modified":"2022-09-23T13:49:54","modified_gmt":"2022-09-23T13:49:54","slug":"objet2-les-structures-de-donnees","status":"publish","type":"page","link":"https:\/\/www.louismarchand.me\/index.php\/objet2-les-structures-de-donnees\/","title":{"rendered":"Les structures de donn\u00e9es"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>Les structures de donn\u00e9es permettent de stocker des donn\u00e9es en m\u00e9moire de mani\u00e8re structur\u00e9e et organis\u00e9e ou bien d&rsquo;avoir acc\u00e8s \u00e0 des donn\u00e9es . L&rsquo;important dans le choix d&rsquo;une structure de donn\u00e9es, c&rsquo;est de s&rsquo;assurer d&rsquo;avoir les fonctionnalit\u00e9s n\u00e9cessaires, de mani\u00e8re efficace, mais sans laisser trop de libert\u00e9. En effet, plus on donne d&rsquo;acc\u00e8s lors de l&rsquo;utilisation d&rsquo;une structure de donn\u00e9es, plus le risque de probl\u00e9matique augmente.<\/p>\n<h2>Les diff\u00e9rentes structures abstraites et leurs impl\u00e9mentations<\/h2>\n<p>Une structure abstraite est une version logique d&rsquo;une structure de donn\u00e9es, sans prendre en compte l&rsquo;impl\u00e9mentation de cette derni\u00e8re.<\/p>\n<p>Une structure de donn\u00e9e (non abstraite) consiste en l&rsquo;impl\u00e9mentation de ces structures abstraites.<\/p>\n<h3>Les indexables<\/h3>\n<p>Une structure indexable est une structure abstraite de donn\u00e9es qui permette d&rsquo;acc\u00e9der \u00e0 une valeur en utilisant un index. L&rsquo;index peut \u00eatre num\u00e9rique (comme dans un tableau) ou autre (comme dans une table de hachage).<\/p>\n<p>Il est \u00e0 noter que le langage Java n&rsquo;a pas de classe abstraite repr\u00e9sentant ce type de structure (et c&rsquo;est malheureusement un manque dans la librairie Java).<\/p>\n<p>Le langage Eiffel contient une classe abstraite \u00ab\u00a0INDEXABLE\u00a0\u00bb repr\u00e9sentant ce type de structure. Vous pouvez voir la documentation <a href=\"https:\/\/www.eiffel.org\/files\/doc\/static\/22.05\/libraries\/base\/indexable_chart.html\" target=\"_blank\" rel=\"noopener\">ici<\/a>.<\/p>\n<p>Voici un exemple d&rsquo;utilisation un objet \u00ab\u00a0INDEXABLE\u00a0\u00bb en Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">print_from_indexable<\/span><span class=\"p\">(<\/span><span class=\"n\">a_indexable<\/span><span class=\"p\">:<\/span><span class=\"nc\">INDEXABLE<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">,<\/span> <span class=\"nc\">INTEGER<\/span><span class=\"o\">]<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"c1\">-- Affiche les \u00e9l\u00e9ments de `a_indexable'<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_index<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"kr\">from<\/span> <span class=\"n\">l_index<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_indexable<\/span><span class=\"p\">.<\/span><span class=\"n\">lower<\/span> <span class=\"kr\">until<\/span> <span class=\"n\">l_index<\/span> <span class=\"o\">&gt;<\/span> <span class=\"n\">a_indexable<\/span><span class=\"p\">.<\/span><span class=\"n\">upper<\/span> <span class=\"kr\">loop<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Valeur a l'index \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">l_index<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\": \"<\/span> <span class=\"o\">+<\/span> \r\n\t\t\t\t\t<span class=\"n\">a_indexable<\/span><span class=\"p\">.<\/span><span class=\"n\">at<\/span> <span class=\"p\">(<\/span><span class=\"n\">l_index<\/span><span class=\"p\">)<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">l_index<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">l_index<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Pour tester ce code, vous pouvez y envoyer n&rsquo;importe quelle variable ayant un type conforme \u00ab\u00a0INDEXABLE\u00a0\u00bb. Voici un exemple simple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t\t<span class=\"c1\">-- Ex\u00e9cute l'exemple<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">:<\/span><span class=\"nc\">ARRAYED_LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"kr\">create<\/span> <span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 1\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 2\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 3\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 4\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 5\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 6\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 7\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 8\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 9\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 10\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">print_from_indexable<\/span><span class=\"p\">(<\/span><span class=\"n\">l_liste<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<h3>Les it\u00e9rables<\/h3>\n<p>Un it\u00e9rable (parfois appel\u00e9 traversable) est une structure abstraite avec laquelle il est possible de visiter chaque \u00e9l\u00e9ment de la structure une unique fois.<\/p>\n<p>En pratique, dans les langages, ce type de structure retourne un it\u00e9rateur puisqu\u2019un it\u00e9rateur sert pr\u00e9cis\u00e9ment \u00e0 effectuer le travail indiqu\u00e9 plus haut. Vois le patron conceptuel \u00ab\u00a0iterateur\u00a0\u00bb dans la page de th\u00e9orie pr\u00e9c\u00e9dente.<\/p>\n<p>La documentation de l&rsquo;interface \u00ab\u00a0Iterable\u00a0\u00bb en Java est <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/lang\/Iterable.html\" target=\"_blank\" rel=\"noopener\">ici<\/a><\/p>\n<p>La documentation Eiffel de la classe \u00ab\u00a0ITERABLE\u00a0\u00bb est Eiffel est <a href=\"https:\/\/www.eiffel.org\/files\/doc\/static\/22.05\/libraries\/base\/iterable_chart.html\" target=\"_blank\" rel=\"noopener\">ici<\/a><\/p>\n<p>Voici un exemple d&rsquo;utilisation en Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Affiche les \u00e9l\u00e9ments d'un objet Iterable.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * @param aIterable L'objet contenant les \u00e9l\u00e9ments \u00e0 afficher.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">printIterable<\/span><span class=\"o\">(<\/span><span class=\"n\">Iterable<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aIterable<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"n\">Iterator<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lIterateur<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aIterable<\/span><span class=\"o\">.<\/span><span class=\"na\">iterator<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"k\">while<\/span><span class=\"o\">(<\/span><span class=\"n\">lIterateur<\/span><span class=\"o\">.<\/span><span class=\"na\">hasNext<\/span><span class=\"o\">()){<\/span>\r\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">lIterateur<\/span><span class=\"o\">.<\/span><span class=\"na\">next<\/span><span class=\"o\">());<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Pour tester ce code, vous pouvez y envoyer n&rsquo;importe quelle variable ayant un type conforme \u00e0 \u00ab\u00a0Iterable\u00a0\u00bb. Voici un exemple simple:<\/p>\n<div class=\"highlight\">\n<pre>    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Ex\u00e9cution de l'exemple.<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">execute<\/span><span class=\"o\">(){<\/span>\r\n        <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lListe<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;(<\/span><span class=\"mi\">10<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">lListe<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 1\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">lListe<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 2\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">lListe<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 3\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">lListe<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 4\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">lListe<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 5\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">lListe<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 6\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">lListe<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 7\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">lListe<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 8\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">lListe<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 9\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">lListe<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 10\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">printIterableFor<\/span><span class=\"o\">(<\/span><span class=\"n\">lListe<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Voici un exemple en Eiffel (noter qu&rsquo;en Eiffel, un it\u00e9rateur est appel\u00e9 curseur):<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">print_from_iterable<\/span><span class=\"p\">(<\/span><span class=\"n\">a_iterable<\/span><span class=\"p\">:<\/span><span class=\"nc\">ITERABLE<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"c1\">-- Affiche les \u00e9l\u00e9ments de `a_iterable'<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_iterateur<\/span><span class=\"p\">:<\/span><span class=\"nc\">ITERATION_CURSOR<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"n\">l_iterateur<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_iterable<\/span><span class=\"p\">.<\/span><span class=\"n\">new_cursor<\/span>\r\n\t\t<span class=\"kr\">from<\/span> <span class=\"kr\">until<\/span> <span class=\"n\">l_iterateur<\/span><span class=\"p\">.<\/span><span class=\"n\">after<\/span> <span class=\"kr\">loop<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">l_iterateur<\/span><span class=\"p\">.<\/span><span class=\"n\">item<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">l_iterateur<\/span><span class=\"p\">.<\/span><span class=\"n\">forth<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Pour tester ce code, vous pouvez y envoyer n&rsquo;importe quelle variable ayant comme type une classe impl\u00e9mentant \u00ab\u00a0ITERABLE\u00a0\u00bb. Voici un exemple simple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t\t<span class=\"c1\">-- Ex\u00e9cute l'exemple<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">:<\/span><span class=\"nc\">ARRAYED_LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"kr\">create<\/span> <span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 1\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 2\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 3\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 4\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 5\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 6\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 7\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 8\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 9\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 10\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">print_from_iterable<\/span><span class=\"p\">(<\/span><span class=\"n\">l_liste<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Il est \u00e9galement \u00e0 noter que, autant en Java qu&rsquo;en Eiffel, l&rsquo;objet \u00ab\u00a0Iterable\u00a0\u00bb est le type le plus abstrait pour lequel il est possible d&rsquo;utiliser dans une boucle \u00ab\u00a0for\u00a0\u00bb (ou \u00ab\u00a0across\u00a0\u00bb en Eiffel). Par exemple, voici un exemple en Java utilisant un \u00ab\u00a0for\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Affiche les \u00e9l\u00e9ments d'un objet Iterable en utilisant \"for\".<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * @param aIterable L'objet contenant les \u00e9l\u00e9ments \u00e0 afficher.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">printIterable<\/span><span class=\"o\">(<\/span><span class=\"n\">Iterable<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aIterable<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"k\">for<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span> <span class=\"n\">laElement<\/span><span class=\"o\">:<\/span><span class=\"n\">aIterable<\/span><span class=\"o\">){<\/span>\r\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">laElement<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Et voici un exemple en Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">print_from_iterable<\/span><span class=\"p\">(<\/span><span class=\"n\">a_iterable<\/span><span class=\"p\">:<\/span><span class=\"nc\">ITERABLE<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"c1\">-- Affiche les \u00e9l\u00e9ments de `a_iterable' avec une boucle \"across\"<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"kr\">across<\/span> <span class=\"n\">a_iterable<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_iterable<\/span> <span class=\"kr\">loop<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">la_iterable<\/span><span class=\"p\">.<\/span><span class=\"n\">item<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Les deux exemples (Java et Eiffel) peuvent utiliser le m\u00eame code d&rsquo;ex\u00e9cution que pr\u00e9sent\u00e9 plus haut (les exemples avec les it\u00e9rateurs).<\/p>\n<h3>Les tableaux<\/h3>\n<p>Un tableau (ou \u00ab\u00a0array\u00a0\u00bb) est une structure indexable et it\u00e9rable dont la taille est fixe. L&rsquo;index d&rsquo;un tableau doit \u00eatre num\u00e9rique et continue, entre deux bornes (index minimal et index maximal).<\/p>\n<p>Il est \u00e0 noter qu&rsquo;en Java, les tableaux (\u00ab\u00a0array\u00a0\u00bb) sont consid\u00e9r\u00e9s comme des types primitifs et ne sont donc pas des classes ou des interfaces. Il est donc \u00e0 d\u00e9duire que les tableaux en Java n&rsquo;impl\u00e9mentent pas \u00ab\u00a0Iterable\u00a0\u00bb et \u00ab\u00a0Indexable\u00a0\u00bb. Il n&rsquo;y a \u00e9galement aucune documentation pour les tableaux en Java. Le tutoriel d&rsquo;utilisation est <a href=\"https:\/\/docs.oracle.com\/javase\/tutorial\/java\/nutsandbolts\/arrays.html\" target=\"_blank\" rel=\"noopener\">ici<\/a>.<\/p>\n<p>La documentation de la classe \u00ab\u00a0ARRAY\u00a0\u00bb en Eiffel est <a href=\"https:\/\/www.eiffel.org\/files\/doc\/static\/22.05\/libraries\/base\/array_chart.html\" target=\"_blank\" rel=\"noopener\">ici<\/a>.<\/p>\n<p>Voici un exemple de tableau en Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Affiche les \u00e9l\u00e9ments d'un tableau.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * @param aTableau La structure contenant les \u00e9l\u00e9ments \u00e0 afficher.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">printTableau<\/span><span class=\"o\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">aTableau<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"k\">for<\/span><span class=\"o\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">i<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"o\">;<\/span> <span class=\"n\">i<\/span> <span class=\"o\">&lt;<\/span> <span class=\"n\">aTableau<\/span><span class=\"o\">.<\/span><span class=\"na\">length<\/span><span class=\"o\">;<\/span> <span class=\"n\">i<\/span> <span class=\"o\">=<\/span> <span class=\"n\">i<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"o\">){<\/span>\r\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">aTableau<\/span><span class=\"o\">[<\/span><span class=\"n\">i<\/span><span class=\"o\">]);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>On utilise cet exemple en envoyant un tableau de \u00ab\u00a0String\u00a0\u00bb \u00e0 la m\u00e9thode:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Ex\u00e9cution de l'exemple.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">execute<\/span><span class=\"o\">(){<\/span>\r\n    <span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">lTableau<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">String<\/span><span class=\"o\">[<\/span><span class=\"mi\">10<\/span><span class=\"o\">];<\/span>\r\n    <span class=\"n\">lTableau<\/span><span class=\"o\">[<\/span><span class=\"mi\">0<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"Element 1\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"n\">lTableau<\/span><span class=\"o\">[<\/span><span class=\"mi\">1<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"Element 2\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"n\">lTableau<\/span><span class=\"o\">[<\/span><span class=\"mi\">2<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"Element 3\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"n\">lTableau<\/span><span class=\"o\">[<\/span><span class=\"mi\">3<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"Element 4\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"n\">lTableau<\/span><span class=\"o\">[<\/span><span class=\"mi\">4<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"Element 5\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"n\">lTableau<\/span><span class=\"o\">[<\/span><span class=\"mi\">5<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"Element 6\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"n\">lTableau<\/span><span class=\"o\">[<\/span><span class=\"mi\">6<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"Element 7\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"n\">lTableau<\/span><span class=\"o\">[<\/span><span class=\"mi\">7<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"Element 8\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"n\">lTableau<\/span><span class=\"o\">[<\/span><span class=\"mi\">8<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"Element 9\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"n\">lTableau<\/span><span class=\"o\">[<\/span><span class=\"mi\">9<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"Element 10\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"n\">printTableau<\/span><span class=\"o\">(<\/span><span class=\"n\">lTableau<\/span><span class=\"o\">);<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Voici un exemple de \u00ab\u00a0ARRAY\u00a0\u00bb en Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">print_from_array<\/span><span class=\"p\">(<\/span><span class=\"n\">a_array<\/span><span class=\"p\">:<\/span><span class=\"nc\">ARRAY<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"c1\">-- Affiche les \u00e9l\u00e9ments de `a_array'\"<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_index<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"kr\">from<\/span> <span class=\"n\">l_index<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_array<\/span><span class=\"p\">.<\/span><span class=\"n\">lower<\/span> <span class=\"kr\">until<\/span> <span class=\"n\">l_index<\/span> <span class=\"o\">&gt;<\/span> <span class=\"n\">a_array<\/span><span class=\"p\">.<\/span><span class=\"n\">upper<\/span> <span class=\"kr\">loop<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Valeur a l'index \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">l_index<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\": \"<\/span> <span class=\"o\">+<\/span>\r\n\t\t\t\t\t<span class=\"n\">a_array<\/span><span class=\"p\">.<\/span><span class=\"n\">at<\/span> <span class=\"p\">(<\/span><span class=\"n\">l_index<\/span><span class=\"p\">)<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">l_index<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">l_index<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Pour utiliser cet exemple, envoyer une variable ayant un type conforme \u00e0 \u00ab\u00a0ARRAY\u00a0\u00bb en argument. Voici un exemple simple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t\t<span class=\"c1\">-- Ex\u00e9cute l'exemple<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_array<\/span><span class=\"p\">:<\/span><span class=\"nc\">ARRAY<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"kr\">create<\/span> <span class=\"n\">l_array<\/span><span class=\"p\">.<\/span><span class=\"n\">make_filled<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\"<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_array<\/span><span class=\"o\">[<\/span><span class=\"mi\">1<\/span><span class=\"o\">]<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"Element 1\"<\/span>\r\n\t\t<span class=\"n\">l_array<\/span><span class=\"o\">[<\/span><span class=\"mi\">2<\/span><span class=\"o\">]<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"Element 2\"<\/span>\r\n\t\t<span class=\"n\">l_array<\/span><span class=\"o\">[<\/span><span class=\"mi\">3<\/span><span class=\"o\">]<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"Element 3\"<\/span>\r\n\t\t<span class=\"n\">l_array<\/span><span class=\"o\">[<\/span><span class=\"mi\">4<\/span><span class=\"o\">]<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"Element 4\"<\/span>\r\n\t\t<span class=\"n\">l_array<\/span><span class=\"o\">[<\/span><span class=\"mi\">5<\/span><span class=\"o\">]<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"Element 5\"<\/span>\r\n\t\t<span class=\"n\">l_array<\/span><span class=\"o\">[<\/span><span class=\"mi\">6<\/span><span class=\"o\">]<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"Element 6\"<\/span>\r\n\t\t<span class=\"n\">l_array<\/span><span class=\"o\">[<\/span><span class=\"mi\">7<\/span><span class=\"o\">]<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"Element 7\"<\/span>\r\n\t\t<span class=\"n\">l_array<\/span><span class=\"o\">[<\/span><span class=\"mi\">8<\/span><span class=\"o\">]<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"Element 8\"<\/span>\r\n\t\t<span class=\"n\">l_array<\/span><span class=\"o\">[<\/span><span class=\"mi\">9<\/span><span class=\"o\">]<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"Element 9\"<\/span>\r\n\t\t<span class=\"n\">l_array<\/span><span class=\"o\">[<\/span><span class=\"mi\">10<\/span><span class=\"o\">]<\/span> <span class=\"o\">:=<\/span> <span class=\"s\">\"Element 10\"<\/span>\r\n\t\t<span class=\"n\">print_from_array<\/span><span class=\"p\">(<\/span><span class=\"n\">l_array<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<h3>Les listes<\/h3>\n<p>On appel liste, une structure abstraite indexable et it\u00e9rable ayant la possibilit\u00e9 de changer de taille. L&rsquo;index d&rsquo;une liste doit \u00eatre num\u00e9rique et continue, entre deux bornes (index minimal et index maximal).<\/p>\n<p>La documentation de l&rsquo;interface \u00ab\u00a0List\u00a0\u00bb de Java est <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/List.html\" target=\"_blank\" rel=\"noopener\">ici<\/a><\/p>\n<p>La documentation de la classe \u00ab\u00a0LIST\u00a0\u00bb de Eiffel est <a href=\"https:\/\/www.eiffel.org\/files\/doc\/static\/22.05\/libraries\/base\/list_chart.html\" target=\"_blank\" rel=\"noopener\">ici<\/a><\/p>\n<h4>Les listes tableau<\/h4>\n<p>Une liste tableau (ou \u00ab\u00a0Array List\u00a0\u00bb) est une liste impl\u00e9ment\u00e9e \u00e0 l&rsquo;aide d&rsquo;un tableau m\u00e9moire (\u00ab\u00a0Array\u00a0\u00bb). L&rsquo;avantage d&rsquo;une liste tableau est qu&rsquo;elle permet d&rsquo;acc\u00e9der tr\u00e8s rapidement \u00e0 n&rsquo;importe quel \u00e9l\u00e9ment de la liste (ordre de complexit\u00e9 O(1)).<\/p>\n<p>Le grand d\u00e9faut d&rsquo;une liste tableau, c&rsquo;est que, comme vu plus haut, un tableau m\u00e9moire est toujours de taille fixe. Donc, qu&rsquo;afin de pouvoir modifier la taille de la liste, le tableau au complet doit \u00eatre copi\u00e9 dans un nouveau tableau d&rsquo;une taille acceptable (ce qui est d&rsquo;ordre de complexit\u00e9 O(n)). Avec optimisation, il est possible de r\u00e9duire cette complexit\u00e9 \u00e0 O(logn).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10491\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/liste_tableau_insertion.png\" alt=\"\" width=\"613\" height=\"283\" \/><\/p>\n<p>Il est important de noter que le tableau n&rsquo;est pas n\u00e9cessairement de la m\u00eame taille que la liste. En effet, si on retire des \u00e9l\u00e9ments de la liste, la capacit\u00e9 du tableau n&rsquo;est pas n\u00e9cessairement r\u00e9duite et lorsqu&rsquo;on ajoute un \u00e9l\u00e9ment dans la liste, le tableau n&rsquo;est pas obligatoirement agrandit de 1 seul \u00e9l\u00e9ment.<\/p>\n<p>Nous obtenons donc que la liste a une taille (qui correspond au nombre d&rsquo;\u00e9l\u00e9ments r\u00e9ellement plac\u00e9 dans la liste) et une capacit\u00e9 (qui correspond \u00e0 au nombre d&rsquo;\u00e9l\u00e9ments que le tableau interne peut recevoir).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10582\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/liste_tableau_structure.png\" alt=\"\" width=\"563\" height=\"270\" \/><\/p>\n<p>Il est \u00e0 noter que, dans la majorit\u00e9 des langages, on peut donner une longueur initiale au constructeur des listes tableau afin de donner la capacit\u00e9 initiale du tableau afin d&rsquo;\u00e9viter que trop de copies soient effectu\u00e9es.<\/p>\n<p>En g\u00e9n\u00e9ral, on utilise une liste tableau dans le cas o\u00f9 nous savons la taille n\u00e9cessaire (ou g\u00e9n\u00e9ralement n\u00e9cessaire) au travail de la liste.<\/p>\n<p>La documentation Java de la classe \u00ab\u00a0ArrayList\u00a0\u00bb est <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/ArrayList.html\" target=\"_blank\" rel=\"noopener\">ici<\/a>.<\/p>\n<p>La documentation Eiffel de la classe \u00ab\u00a0ARRAYED_LIST\u00a0\u00bb est <a href=\"https:\/\/www.eiffel.org\/files\/doc\/static\/22.05\/libraries\/base\/arrayed_list_chart.html\" target=\"_blank\" rel=\"noopener\">ici<\/a><\/p>\n<p>Notez que vous pouvez voir plusieurs impl\u00e9mentations de Liste tableau dans les exemples ci-dessus.<\/p>\n<h4>Les listes li\u00e9es<\/h4>\n<p>Une liste li\u00e9e (ou \u00ab\u00a0Linked list\u00a0\u00bb) est une liste cr\u00e9\u00e9e \u00e0 partir de structures appel\u00e9es noeud li\u00e9es entre eux par des pointeurs.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-10584 size-full\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/liste_liee_structure.png\" alt=\"\" width=\"803\" height=\"310\" \/><\/p>\n<p>Les listes li\u00e9es ont beaucoup d&rsquo;inconv\u00e9nients par rapport aux listes tableau. En premier lieu, chaque \u00e9l\u00e9ment prend plus de place que dans le cas d&rsquo;une liste tableau (en plus de la valeur, il fait stocker les pointeurs dans chaque noeud). De mani\u00e8re encore plus importante, acc\u00e9der un \u00e9l\u00e9ment par index est tr\u00e8s peu performant puisque la liste doit traverser la liste (une complexit\u00e9 algorithmique de O(n)).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10492\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/liste_liee_index.png\" alt=\"\" width=\"677\" height=\"159\" \/><\/p>\n<p>L&rsquo;avantage majeur d&rsquo;une liste li\u00e9e est lorsque la taille maximale de la liste n&rsquo;est pas connue \u00e0 priori. L&rsquo;insertion et la suppression se font en temps constant (ordre de complexit\u00e9 d&rsquo;ordre O(1)).<\/p>\n<p>On utilise g\u00e9n\u00e9ralement une liste li\u00e9e lorsqu&rsquo;il est impossible de savoir la taille maximale que la liste aura lors de l&rsquo;ex\u00e9cution (ou lorsque la taille maximale est tr\u00e8s rarement atteinte et que la taille g\u00e9n\u00e9ralement utilis\u00e9e n&rsquo;est pas pr\u00e9visible).<\/p>\n<p>La documentation Java de la classe \u00ab\u00a0LinkedList\u00a0\u00bb est <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/LinkedList.html\" target=\"_blank\" rel=\"noopener\">ici<\/a>.<\/p>\n<p>La documentation Eiffel de la classe \u00ab\u00a0LINKED_LIST\u00a0\u00bb est <a href=\"https:\/\/www.eiffel.org\/files\/doc\/static\/22.05\/libraries\/base\/linked_list_chart.html\" target=\"_blank\" rel=\"noopener\">ici<\/a><\/p>\n<p>Puisque les listes li\u00e9es, tout comme les listes tableau, respectent l&rsquo;interface publique de la liste, vous pouvez voir un exemple d&rsquo;utilisation d&rsquo;une liste li\u00e9e en modifiant les listes tableaux dans les exemples ci-haut par des listes li\u00e9es.<\/p>\n<p>Par exemple, en Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Ex\u00e9cution de l'exemple.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">execute<\/span><span class=\"o\">(){<\/span>\r\n    <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lListe<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">LinkedList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;();<\/span>\r\n    <span class=\"n\">lListe<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 1\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">lListe<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 2\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">lListe<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 3\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">lListe<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 4\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">lListe<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 5\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">lListe<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 6\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">lListe<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 7\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">lListe<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 8\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">lListe<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 9\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">lListe<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 10\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">printListe<\/span><span class=\"o\">(<\/span><span class=\"n\">lListe<\/span><span class=\"o\">);<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Un exemple en Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t\t<span class=\"c1\">-- Ex\u00e9cute l'exemple<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">:<\/span><span class=\"nc\">LINKED_LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"kr\">create<\/span> <span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 1\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 2\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 3\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 4\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 5\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 6\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 7\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 8\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 9\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_liste<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 10\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">print_from_iterable<\/span><span class=\"p\">(<\/span><span class=\"n\">l_liste<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<h3>Les distributeurs<\/h3>\n<p>On appelle distributeur (ou \u00ab\u00a0dispenser\u00a0\u00bb) une structure abstraite permettant d&rsquo;y d\u00e9poser un \u00e9l\u00e9ment \u00e0 la fois et d&rsquo;avoir acc\u00e8s \u00e0 un \u00e9l\u00e9ment \u00e0 la fois (l&rsquo;\u00e9l\u00e9ment doit \u00eatre retir\u00e9 pour avoir acc\u00e8s \u00e0 un autre \u00e9l\u00e9ment).<\/p>\n<p>Les distributeurs sont parfois appel\u00e9s des sacs (ou \u00ab\u00a0bag\u00a0\u00bb) parce que leurs utilisations ressemblent un peu \u00e0 un sac de piges. On place des \u00e9l\u00e9ments dans le sac et on les retire les un apr\u00e8s les autres. Pour observer un \u00e9l\u00e9ment, il faut le retirer.<\/p>\n<p>L&rsquo;impl\u00e9mentation des distributeurs se fait g\u00e9n\u00e9ralement avec des structures li\u00e9es entre elles par des pointeurs (similaire aux listes li\u00e9es).<\/p>\n<p>Il est \u00e0 noter que le langage Java n&rsquo;a pas de classe abstraite repr\u00e9sentant ce type de structure.<\/p>\n<p>La documentation de la classe Eiffel \u00ab\u00a0DISPENSER\u00a0\u00bb est <a href=\"https:\/\/www.eiffel.org\/files\/doc\/static\/22.05\/libraries\/base\/dispenser_chart.html\" target=\"_blank\" rel=\"noopener\">ici<\/a><\/p>\n<p>Voici un exemple d&rsquo;utilisation de distributeur en Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">remplir_dispenser<\/span><span class=\"p\">(<\/span><span class=\"n\">a_dispenser<\/span><span class=\"p\">:<\/span><span class=\"nc\">DISPENSER<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"c1\">-- Ajoute des \u00e9l\u00e9ments dans `a_dispenser'<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"n\">a_dispenser<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 1\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">a_dispenser<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 2\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">a_dispenser<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 3\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">a_dispenser<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 4\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">a_dispenser<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 5\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">a_dispenser<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 6\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">a_dispenser<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 7\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">a_dispenser<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 8\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">a_dispenser<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 9\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">a_dispenser<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"s\">\"Element 10\"<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"n\">afficher_dispenser<\/span><span class=\"p\">(<\/span><span class=\"n\">a_dispenser<\/span><span class=\"p\">:<\/span><span class=\"nc\">DISPENSER<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"c1\">-- Affiche et vide les \u00e9l\u00e9ments de `a_dispenser'<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"kr\">from<\/span> <span class=\"kr\">until<\/span> <span class=\"n\">a_dispenser<\/span><span class=\"p\">.<\/span><span class=\"n\">is_empty<\/span> <span class=\"kr\">loop<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">a_dispenser<\/span><span class=\"p\">.<\/span><span class=\"n\">item<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">a_dispenser<\/span><span class=\"p\">.<\/span><span class=\"n\">remove<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Pour ex\u00e9cuter cet exemple, nous utiliserons les exemples de Pile et de File que nous verrons ensuite.<\/p>\n<h3>Les files<\/h3>\n<p>Une file (ou \u00ab\u00a0queue\u00a0\u00bb) est un distributeur utilisant un algorithme de type \u00ab\u00a0premier entr\u00e9, premier sorti\u00a0\u00bb (ou \u00ab\u00a0FIFO\u00a0\u00bb pour \u00ab\u00a0First In, First Out\u00a0\u00bb).<\/p>\n<p>Pour visualiser cet algorithme, on peut imaginer une file de personnes qui attendent \u00e0 une caisse. G\u00e9n\u00e9ralement, la premi\u00e8re personne \u00e0 \u00eatre arriv\u00e9 dans la file sera la premi\u00e8re personne \u00e0 passer \u00e0 la caisse (\u00e0 \u00eatre retir\u00e9 de la file).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10500\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/file.png\" alt=\"\" width=\"581\" height=\"474\" \/><\/p>\n<p>La documentation de \u00ab\u00a0Queue\u00a0\u00bb en Java est <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/Queue.html\" target=\"_blank\" rel=\"noopener\">ici<\/a><\/p>\n<p>La documentation de \u00ab\u00a0QUEUE\u00a0\u00bb en Eiffel est <a href=\"https:\/\/www.eiffel.org\/files\/doc\/static\/22.05\/libraries\/base\/queue_chart.html\" target=\"_blank\" rel=\"noopener\">ici<\/a><\/p>\n<p>Voici un exemple d&rsquo;utilisation de File en Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Ajoute des \u00e9l\u00e9ments \u00e0 une file.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * @param aFile La structure \u00e0 ajouter les \u00e9l\u00e9ments.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">remplirFile<\/span><span class=\"o\">(<\/span><span class=\"n\">Queue<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aFile<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"n\">aFile<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 1\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">aFile<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 2\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">aFile<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 3\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">aFile<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 4\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">aFile<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 5\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">aFile<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 6\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">aFile<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 7\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">aFile<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 8\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">aFile<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 9\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">aFile<\/span><span class=\"o\">.<\/span><span class=\"na\">add<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 10\"<\/span><span class=\"o\">);<\/span>\r\n<span class=\"o\">}<\/span>\r\n\r\n<span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Affiche et vide les \u00e9l\u00e9ments d'une file.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * @param aFile La structure \u00e0 afficher.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">afficherFile<\/span><span class=\"o\">(<\/span><span class=\"n\">Queue<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aFile<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"k\">while<\/span> <span class=\"o\">(<\/span><span class=\"n\">aFile<\/span><span class=\"o\">.<\/span><span class=\"na\">peek<\/span><span class=\"o\">()<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"o\">){<\/span>\r\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">aFile<\/span><span class=\"o\">.<\/span><span class=\"na\">element<\/span><span class=\"o\">());<\/span>\r\n        <span class=\"n\">aFile<\/span><span class=\"o\">.<\/span><span class=\"na\">remove<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Ex\u00e9cution de l'exemple.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">execute<\/span><span class=\"o\">(){<\/span>\r\n    <span class=\"n\">Queue<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lFile<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayDeque<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;();<\/span>\r\n    <span class=\"n\">remplirFile<\/span><span class=\"o\">(<\/span><span class=\"n\">lFile<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">afficherFile<\/span><span class=\"o\">(<\/span><span class=\"n\">lFile<\/span><span class=\"o\">);<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>L&rsquo;exemple d&rsquo;utilisation en Eiffel utilisera les m\u00e9thodes d\u00e9velopp\u00e9 dans la section \u00ab\u00a0distributeur\u00a0\u00bb (les m\u00e9thodes \u00ab\u00a0remplir_dispenser\u00a0\u00bb et \u00ab\u00a0afficher_dispenser\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t\t<span class=\"c1\">-- Ex\u00e9cute l'exemple<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_queue<\/span><span class=\"p\">:<\/span><span class=\"nc\">LINKED_QUEUE<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"kr\">create<\/span> <span class=\"n\">l_queue<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span>\r\n\t\t<span class=\"n\">remplir_dispenser<\/span><span class=\"p\">(<\/span><span class=\"n\">l_queue<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">afficher_dispenser<\/span><span class=\"p\">(<\/span><span class=\"n\">l_queue<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Le r\u00e9sultat des codes Java et Eiffel ci-dessus est:<\/p>\n<pre>Element 1\r\nElement 2\r\nElement 3\r\nElement 4\r\nElement 5\r\nElement 6\r\nElement 7\r\nElement 8\r\nElement 9\r\nElement 10<\/pre>\n<h3>Les piles<\/h3>\n<p>Une pile (ou \u00ab\u00a0stack\u00a0\u00bb) est un distributeur utilisant un algorithme de type \u00ab\u00a0dernier entr\u00e9, premier sorti\u00a0\u00bb (ou \u00ab\u00a0LIFO\u00a0\u00bb pour \u00ab\u00a0Last In, First Out\u00a0\u00bb).<\/p>\n<p>Pour visualiser cet algorithme, on peut imaginer une pile d&rsquo;assiettes. G\u00e9n\u00e9ralement, on prend l&rsquo;assiette qui est sur le dessus de la pile et lorsqu&rsquo;on d\u00e9pose une assiette, on la d\u00e9pose sur la pile.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-10499 size-full\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/pile.png\" alt=\"\" width=\"907\" height=\"343\" \/><\/p>\n<p>La documentation Java de \u00ab\u00a0Stack\u00a0\u00bb est <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/Stack.html\" target=\"_blank\" rel=\"noopener\">ici<\/a><\/p>\n<p>La documentation Eiffel de \u00ab\u00a0STACK\u00a0\u00bb est <a href=\"https:\/\/www.eiffel.org\/files\/doc\/static\/22.05\/libraries\/base\/stack_chart.html\" target=\"_blank\" rel=\"noopener\">ici<\/a><\/p>\n<p>Voici un exemple d&rsquo;utilisation d&rsquo;une pile en Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Ajoute des \u00e9l\u00e9ments \u00e0 une pile.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * @param aPile La structure \u00e0 ajouter les \u00e9l\u00e9ments.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">remplirPile<\/span><span class=\"o\">(<\/span><span class=\"n\">Stack<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aPile<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"n\">aPile<\/span><span class=\"o\">.<\/span><span class=\"na\">push<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 1\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">aPile<\/span><span class=\"o\">.<\/span><span class=\"na\">push<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 2\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">aPile<\/span><span class=\"o\">.<\/span><span class=\"na\">push<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 3\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">aPile<\/span><span class=\"o\">.<\/span><span class=\"na\">push<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 4\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">aPile<\/span><span class=\"o\">.<\/span><span class=\"na\">push<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 5\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">aPile<\/span><span class=\"o\">.<\/span><span class=\"na\">push<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 6\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">aPile<\/span><span class=\"o\">.<\/span><span class=\"na\">push<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 7\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">aPile<\/span><span class=\"o\">.<\/span><span class=\"na\">push<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 8\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">aPile<\/span><span class=\"o\">.<\/span><span class=\"na\">push<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 9\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">aPile<\/span><span class=\"o\">.<\/span><span class=\"na\">push<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Element 10\"<\/span><span class=\"o\">);<\/span>\r\n<span class=\"o\">}<\/span>\r\n\r\n<span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Affiche et vide les \u00e9l\u00e9ments d'une pile.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * @param aPile La structure \u00e0 afficher.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">afficherPile<\/span><span class=\"o\">(<\/span><span class=\"n\">Stack<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aPile<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"k\">while<\/span> <span class=\"o\">(!<\/span><span class=\"n\">aPile<\/span><span class=\"o\">.<\/span><span class=\"na\">empty<\/span><span class=\"o\">()){<\/span>\r\n        <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"n\">aPile<\/span><span class=\"o\">.<\/span><span class=\"na\">peek<\/span><span class=\"o\">());<\/span>\r\n        <span class=\"n\">aPile<\/span><span class=\"o\">.<\/span><span class=\"na\">pop<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n\r\n<span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Ex\u00e9cution de l'exemple.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">execute<\/span><span class=\"o\">(){<\/span>\r\n    <span class=\"n\">Stack<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lPile<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Stack<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;();<\/span>\r\n    <span class=\"n\">remplirPile<\/span><span class=\"o\">(<\/span><span class=\"n\">lPile<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">afficherPile<\/span><span class=\"o\">(<\/span><span class=\"n\">lPile<\/span><span class=\"o\">);<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>L&rsquo;exemple d&rsquo;utilisation en Eiffel utilisera les m\u00e9thodes d\u00e9velopp\u00e9es dans la section \u00ab\u00a0distributeur\u00a0\u00bb (les m\u00e9thodes \u00ab\u00a0remplir_dispenser\u00a0\u00bb et \u00ab\u00a0afficher_dispenser\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t\t<span class=\"c1\">-- Ex\u00e9cute l'exemple<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_stack<\/span><span class=\"p\">:<\/span><span class=\"nc\">LINKED_STACK<\/span><span class=\"o\">[<\/span><span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"kr\">create<\/span> <span class=\"n\">l_stack<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span>\r\n\t\t<span class=\"n\">remplir_dispenser<\/span><span class=\"p\">(<\/span><span class=\"n\">l_stack<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">afficher_dispenser<\/span><span class=\"p\">(<\/span><span class=\"n\">l_stack<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Le r\u00e9sultat des codes Java et Eiffel ci-dessus est:<\/p>\n<pre>Element 10\r\nElement 9\r\nElement 8\r\nElement 7\r\nElement 6\r\nElement 5\r\nElement 4\r\nElement 3\r\nElement 2\r\nElement 1<\/pre>\n<h3>Sac al\u00e9atoire<\/h3>\n<p>Un sac al\u00e9atoire (ou \u00ab\u00a0Random Bag\u00a0\u00bb ou \u00ab\u00a0Random Queue\u00a0\u00bb) est un distributeur dans lequel l&rsquo;\u00e9l\u00e9ment qui est lu et retir\u00e9 est choisi au hasard dans le distributeur.<\/p>\n<p>Il est important de comprendre que tant que l&rsquo;\u00e9l\u00e9ment n&rsquo;est pas retir\u00e9, l&rsquo;\u00e9l\u00e9ment lu ne doit pas changer. La seule fa\u00e7on de modifier l&rsquo;\u00e9l\u00e9ment \u00e0 lire est de retirer l&rsquo;\u00e9l\u00e9ment en question.<\/p>\n<p>L&rsquo;impl\u00e9mentation d&rsquo;un sac al\u00e9atoire n&rsquo;est pas incluse dans Java ni dans Eiffel. Son impl\u00e9mentation est laiss\u00e9e en exercice aux plus courageux.<\/p>\n<h3>Les \u00ab\u00a0buffers\u00a0\u00bb circulaires<\/h3>\n<p>Une file est une structure tr\u00e8s utile, mais dans certains contextes, elle peut \u00eatre lourde \u00e0 impl\u00e9menter. En effet, lorsqu&rsquo;un programme est fait dans un environnement bas niveau (langage C ou assembleur, programmation de microcontr\u00f4leur, etc.) ou lorsque la performance est un \u00e9l\u00e9ment cl\u00e9 du programme, on peut remplacer une file par un \u00ab\u00a0buffer\u00a0\u00bb circulaire.<\/p>\n<p>Le \u00ab\u00a0buffer\u00a0\u00bb se comporte normalement comme une file (algorithme FIFO). Par contre, contrairement \u00e0 une file, le \u00ab\u00a0buffer\u00a0\u00bb circulaire est limit\u00e9 en taille. Il s&rsquo;agit donc d&rsquo;une sorte de file pouvant contenir un nombre maximal d&rsquo;\u00e9l\u00e9ments.<\/p>\n<p>Voici comment on impl\u00e9mente un \u00ab\u00a0buffer\u00a0\u00bb circulaire:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Structure:\n<ul>\n<li>Les valeurs sont plac\u00e9es dans un tableau m\u00e9moire (\u00ab\u00a0Array\u00a0\u00bb);<\/li>\n<li>On utilise deux index:\n<ul>\n<li>T\u00eate: Corresponds \u00e0 l&rsquo;endroit o\u00f9 nous d\u00e9poserons nos valeurs;<\/li>\n<li>Queue: Corresponds \u00e0 l&rsquo;endroit o\u00f9 nous allons lire et retirer les valeurs;<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>Utilisation:\n<ul>\n<li>Initialement, la t\u00eate et la queue sont \u00e9gales;\n<ul>\n<li>Si \u00ab\u00a0T\u00eate\u00a0\u00bb = \u00ab\u00a0Queue\u00a0\u00bb, le \u00ab\u00a0buffer\u00a0\u00bb est vide.<\/li>\n<\/ul>\n<\/li>\n<li>Lorsqu&rsquo;une valeur est ajout\u00e9e dans le \u00ab\u00a0buffer\u00a0\u00bb, on place cette valeur \u00e0 l&rsquo;index \u00ab\u00a0T\u00eate\u00a0\u00bb dans le tableau et on incr\u00e9mente cet index;\n<ul>\n<li>Si \u00ab\u00a0T\u00eate\u00a0\u00bb + 1 = \u00ab\u00a0Queue\u00a0\u00bb, le \u00ab\u00a0buffer\u00a0\u00bb est plein.<\/li>\n<\/ul>\n<\/li>\n<li>Lorsqu&rsquo;une valeur est retir\u00e9e du \u00ab\u00a0buffer\u00a0\u00bb, on incr\u00e9mente l&rsquo;index \u00ab\u00a0Queue\u00a0\u00bb;<\/li>\n<li>Lorsqu&rsquo;un index sort du tableau, ce pointeur est redirig\u00e9 au d\u00e9but du tableau \u00e0 l&rsquo;aide d&rsquo;un modulo.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Voici un exemple d&rsquo;utilisation de \u00ab\u00a0buffer\u00a0\u00bb circulaire. Le tableau \u00e0 l&rsquo;int\u00e9rieur du \u00ab\u00a0buffer\u00a0\u00bb est de taille 7.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10557\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/buffer_circulaire_exemple01.png\" alt=\"\" width=\"447\" height=\"168\" \/><\/p>\n<p>On ajoute la valeur 5:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10558\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/buffer_circulaire_exemple02.png\" alt=\"\" width=\"425\" height=\"228\" \/><\/p>\n<p>On ajoute la valeur 9:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10559\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/buffer_circulaire_exemple03.png\" alt=\"\" width=\"425\" height=\"228\" \/><\/p>\n<p>On ajoute la valeur 4:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10560\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/buffer_circulaire_exemple04.png\" alt=\"\" width=\"425\" height=\"228\" \/><\/p>\n<p>On retire une valeur. \u00c7a nous retourne la valeur 5:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10561\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/buffer_circulaire_exemple05.png\" alt=\"\" width=\"423\" height=\"228\" \/><\/p>\n<p>On ajoute 3 valeurs (8, 6, et 1):<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10562\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/buffer_circulaire_exemple06.png\" alt=\"\" width=\"423\" height=\"196\" \/><\/p>\n<p>On ajoute la valeur 3. On remarque que l&rsquo;index \u00ab\u00a0T\u00eate\u00a0\u00bb est retourn\u00e9 au d\u00e9but du tableau:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10563\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/buffer_circulaire_exemple07.png\" alt=\"\" width=\"423\" height=\"228\" \/><\/p>\n<p>On essaie d&rsquo;ajouter une valeur (\u00e7a donne une erreur, car le \u00ab\u00a0buffer\u00a0\u00bb est plein):<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10564\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/buffer_circulaire_exemple07a.png\" alt=\"\" width=\"423\" height=\"212\" \/><\/p>\n<p>On retire une valeur. \u00c7a nous retourne la valeur 9:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10565\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/buffer_circulaire_exemple08.png\" alt=\"\" width=\"423\" height=\"228\" \/><\/p>\n<p>Maintenant que le \u00ab\u00a0buffer\u00a0\u00bb n&rsquo;est plus plein, on peut ajouter la valeur 7:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10566\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/buffer_circulaire_exemple09.png\" alt=\"\" width=\"423\" height=\"228\" \/><\/p>\n<p>On essaie d&rsquo;ajouter une valeur (\u00e7a donne une erreur, car le \u00ab\u00a0buffer\u00a0\u00bb est plein):<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10567\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/buffer_circulaire_exemple10.png\" alt=\"\" width=\"423\" height=\"212\" \/><\/p>\n<p>On retire 4 valeurs. \u00c7a nous retourne en ordre les valeurs 4, 8, 6 et 1:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10568\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/buffer_circulaire_exemple11.png\" alt=\"\" width=\"425\" height=\"196\" \/><\/p>\n<p>On retire de nouveau une valeur. \u00c7a nous retourne la valeur 3. De plus, on remarque que l&rsquo;index \u00ab\u00a0Queue\u00a0\u00bb est retourn\u00e9 au d\u00e9but:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10569\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/buffer_circulaire_exemple12.png\" alt=\"\" width=\"425\" height=\"228\" \/><\/p>\n<p>On ajoute les valeurs 19, 14, 18, 16 et 11:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-10589 size-full\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/buffer_circulaire_exemple13.png\" alt=\"\" width=\"425\" height=\"196\" \/><\/p>\n<p>On essaie d&rsquo;ajouter une valeur (\u00e7a donne une erreur, car le \u00ab\u00a0buffer\u00a0\u00bb est plein). En effet, m\u00eame si la \u00ab\u00a0T\u00eate\u00a0\u00bb est \u00e0 6 et la \u00ab\u00a0Queue\u00a0\u00bb est \u00e0 0, on a que \u00ab\u00a0T\u00eate\u00a0\u00bb + 1 = \u00ab\u00a0Queue\u00a0\u00bb si nous prenons en compte le modulo. Plus formellement: (\u00ab\u00a0T\u00eate\u00a0\u00bb + 1) modulo 7 = \u00ab\u00a0Queue\u00a0\u00bb.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10571\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/buffer_circulaire_exemple14.png\" alt=\"\" width=\"425\" height=\"212\" \/><\/p>\n<p>Pour terminer, si nous lisons les \u00e9l\u00e9ments 7, 19, 14, 18, 16 et 11 et ce, sans ajouter aucun \u00e9l\u00e9ment, nous nous retrouvons encore une fois avec \u00ab\u00a0T\u00eate = Queue\u00a0\u00bb, ce qui signifie que le \u00ab\u00a0buffer\u00a0\u00bb est maintenant vide.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10571\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/buffer_circulaire_exemple15.png\" alt=\"\" width=\"425\" height=\"212\" \/><\/p>\n<p>Voici un exemple dans le langage C:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * @author      : Louis Marchand (prog@tioui.com)<\/span>\r\n<span class=\"cm\"> * @created     : mardi sep 07, 2021 20:43:01 EDT<\/span>\r\n<span class=\"cm\"> * @license     : MIT<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"cp\">#include<\/span> <span class=\"cpf\">&lt;stdbool.h&gt;<\/span>\r\n<span class=\"cp\">#include<\/span> <span class=\"cpf\">&lt;stdlib.h&gt;<\/span>\r\n<span class=\"cp\">#include<\/span> <span class=\"cpf\">&lt;stdio.h&gt;<\/span>\r\n\r\n<span class=\"cp\">#define BUFFER_TAILLE 7<\/span>\r\n\r\n<span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Le buffer circulaire.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"k\">typedef<\/span> <span class=\"k\">struct<\/span> <span class=\"n\">Buffer<\/span> <span class=\"p\">{<\/span>\r\n\t<span class=\"kt\">int<\/span> <span class=\"n\">donnees<\/span><span class=\"p\">[<\/span><span class=\"n\">BUFFER_TAILLE<\/span><span class=\"p\">];<\/span>\r\n\t<span class=\"kt\">int<\/span> <span class=\"n\">tete<\/span><span class=\"p\">;<\/span>\r\n\t<span class=\"kt\">int<\/span> <span class=\"n\">queue<\/span><span class=\"p\">;<\/span>\r\n\t<span class=\"kt\">bool<\/span> <span class=\"n\">erreur<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span> <span class=\"n\">Buffer<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Retourne un nouveau buffer circulaire (on null si erreur).<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * @return Un nouveau buffer circulaire ou null.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"n\">Buffer<\/span><span class=\"o\">*<\/span> <span class=\"nf\">initialiser_buffer<\/span><span class=\"p\">()<\/span>\r\n<span class=\"p\">{<\/span>\r\n\t<span class=\"k\">return<\/span> <span class=\"n\">calloc<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"k\">sizeof<\/span><span class=\"p\">(<\/span><span class=\"n\">Buffer<\/span><span class=\"p\">));<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Retourne Vrai si une erreur est survenue; Faux sinon.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * @param a_buffer le buffer circulaire \u00e0 traiter.<\/span>\r\n<span class=\"cm\"> * @return Vrai si une erreur est survenue; Faux sinon.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kt\">bool<\/span> <span class=\"nf\">a_erreur<\/span><span class=\"p\">(<\/span><span class=\"n\">Buffer<\/span><span class=\"o\">*<\/span> <span class=\"n\">a_buffer<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">{<\/span>\r\n\t<span class=\"k\">return<\/span> <span class=\"n\">a_buffer<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">erreur<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Retourne Vrai si le buffer est vide; Faux sinon.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * @param a_buffer le buffer circulaire \u00e0 traiter.<\/span>\r\n<span class=\"cm\"> * @return Vrai si le buffer est vide; Faux sinon.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kt\">bool<\/span> <span class=\"nf\">est_vide<\/span><span class=\"p\">(<\/span><span class=\"n\">Buffer<\/span><span class=\"o\">*<\/span> <span class=\"n\">a_buffer<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">{<\/span>\r\n\t<span class=\"k\">return<\/span> <span class=\"n\">a_buffer<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">tete<\/span> <span class=\"o\">==<\/span> <span class=\"n\">a_buffer<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">queue<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Retourne Vrai si le buffer est plein; Faux sinon.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * @param a_buffer le buffer circulaire \u00e0 traiter.<\/span>\r\n<span class=\"cm\"> * @return Vrai si le buffer est plein; Faux sinon.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kt\">bool<\/span> <span class=\"nf\">est_plein<\/span><span class=\"p\">(<\/span><span class=\"n\">Buffer<\/span><span class=\"o\">*<\/span> <span class=\"n\">a_buffer<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">{<\/span>\r\n\t<span class=\"k\">return<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_buffer<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">tete<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span> <span class=\"o\">%<\/span> <span class=\"n\">BUFFER_TAILLE<\/span> <span class=\"o\">==<\/span> <span class=\"n\">a_buffer<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">queue<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Ajoute un \u00e9l\u00e9ment dans le buffer circulaire.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * @param a_buffer le buffer circulaire \u00e0 traiter.<\/span>\r\n<span class=\"cm\"> * @param a_element L'\u00e9l\u00e9ment \u00e0 placer dans le buffer circulaire.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kt\">void<\/span> <span class=\"nf\">ajouter_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">Buffer<\/span><span class=\"o\">*<\/span> <span class=\"n\">a_buffer<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">a_element<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">{<\/span>\r\n\t<span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"n\">est_plein<\/span><span class=\"p\">(<\/span><span class=\"n\">a_buffer<\/span><span class=\"p\">))<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"n\">a_buffer<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">donnees<\/span><span class=\"p\">[<\/span><span class=\"n\">a_buffer<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">tete<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"n\">a_element<\/span><span class=\"p\">;<\/span>\r\n\t\t<span class=\"n\">a_buffer<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">tete<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_buffer<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">tete<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span> <span class=\"o\">%<\/span> <span class=\"n\">BUFFER_TAILLE<\/span><span class=\"p\">;<\/span>\r\n\t\t<span class=\"n\">a_buffer<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">erreur<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span><span class=\"p\">;<\/span>\r\n\t<span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"n\">a_buffer<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">erreur<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">true<\/span><span class=\"p\">;<\/span>\r\n\t<span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Retourne le prochain \u00e9l\u00e9ment \u00e0 traiter dans le buffer circulaire.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * @param a_buffer le buffer circulaire \u00e0 traiter.<\/span>\r\n<span class=\"cm\"> * @return L'\u00e9l\u00e9ment \u00e0 traiter dans le buffer circulaire.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kt\">int<\/span> <span class=\"nf\">element_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">Buffer<\/span><span class=\"o\">*<\/span> <span class=\"n\">a_buffer<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">{<\/span>\r\n\t<span class=\"kt\">int<\/span> <span class=\"n\">resultat<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span>\r\n\t<span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"n\">est_vide<\/span><span class=\"p\">(<\/span><span class=\"n\">a_buffer<\/span><span class=\"p\">))<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"n\">resultat<\/span> <span class=\"o\">=<\/span> <span class=\"n\">a_buffer<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">donnees<\/span><span class=\"p\">[<\/span><span class=\"n\">a_buffer<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">queue<\/span><span class=\"p\">];<\/span>\r\n\t\t<span class=\"n\">a_buffer<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">erreur<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span><span class=\"p\">;<\/span>\r\n\t<span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"n\">a_buffer<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">erreur<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">true<\/span><span class=\"p\">;<\/span>\r\n\t<span class=\"p\">}<\/span>\r\n\t<span class=\"k\">return<\/span> <span class=\"n\">resultat<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Retire le prochain \u00e9l\u00e9ment \u00e0 traiter dans le buffer circulaire.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * @param a_buffer le buffer circulaire \u00e0 traiter.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kt\">void<\/span> <span class=\"nf\">retirer_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">Buffer<\/span><span class=\"o\">*<\/span> <span class=\"n\">a_buffer<\/span><span class=\"p\">)<\/span>\r\n<span class=\"p\">{<\/span>\r\n\t<span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"n\">est_vide<\/span><span class=\"p\">(<\/span><span class=\"n\">a_buffer<\/span><span class=\"p\">))<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"n\">a_buffer<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">queue<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_buffer<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">queue<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span> <span class=\"o\">%<\/span> <span class=\"n\">BUFFER_TAILLE<\/span><span class=\"p\">;<\/span>\r\n\t\t<span class=\"n\">a_buffer<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">erreur<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">false<\/span><span class=\"p\">;<\/span>\r\n\t<span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"n\">a_buffer<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">erreur<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">true<\/span><span class=\"p\">;<\/span>\r\n\t<span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Programme principal.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kt\">int<\/span> <span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">argc<\/span><span class=\"p\">,<\/span> <span class=\"kt\">char<\/span> <span class=\"o\">*<\/span><span class=\"n\">argv<\/span><span class=\"p\">[])<\/span>\r\n<span class=\"p\">{<\/span>\r\n\t<span class=\"n\">Buffer<\/span><span class=\"o\">*<\/span> <span class=\"n\">l_buffer<\/span> <span class=\"o\">=<\/span> <span class=\"n\">initialiser_buffer<\/span><span class=\"p\">();<\/span>\r\n\t<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span> <span class=\"o\">!=<\/span> <span class=\"nb\">NULL<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"n\">ajouter_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">ajouter_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">,<\/span> <span class=\"mi\">9<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">ajouter_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Valeur 1 = %d<\/span><span class=\"se\">\\n<\/span><span class=\"s\">\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">element_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">));<\/span>\r\n\t\t<span class=\"n\">retirer_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">ajouter_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">,<\/span> <span class=\"mi\">8<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">ajouter_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">,<\/span> <span class=\"mi\">6<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">ajouter_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">ajouter_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">ajouter_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_erreur<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">))<\/span> <span class=\"p\">{<\/span>\r\n\t\t\t<span class=\"n\">printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Ne peut ajouter un element; le buffer est plein.<\/span><span class=\"se\">\\n<\/span><span class=\"s\">\"<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"p\">}<\/span>\r\n\t\t<span class=\"n\">printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Valeur 1 = %d<\/span><span class=\"se\">\\n<\/span><span class=\"s\">\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">element_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">));<\/span>\r\n\t\t<span class=\"n\">retirer_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">ajouter_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">,<\/span> <span class=\"mi\">7<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">ajouter_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">,<\/span> <span class=\"mi\">5<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_erreur<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">))<\/span> <span class=\"p\">{<\/span>\r\n\t\t\t<span class=\"n\">printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Ne peut ajouter un element; le buffer est plein.<\/span><span class=\"se\">\\n<\/span><span class=\"s\">\"<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"p\">}<\/span>\r\n\t\t<span class=\"n\">printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Valeur 1 = %d<\/span><span class=\"se\">\\n<\/span><span class=\"s\">\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">element_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">));<\/span>\r\n\t\t<span class=\"n\">retirer_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Valeur 1 = %d<\/span><span class=\"se\">\\n<\/span><span class=\"s\">\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">element_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">));<\/span>\r\n\t\t<span class=\"n\">retirer_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Valeur 1 = %d<\/span><span class=\"se\">\\n<\/span><span class=\"s\">\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">element_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">));<\/span>\r\n\t\t<span class=\"n\">retirer_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Valeur 1 = %d<\/span><span class=\"se\">\\n<\/span><span class=\"s\">\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">element_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">));<\/span>\r\n\t\t<span class=\"n\">retirer_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Valeur 1 = %d<\/span><span class=\"se\">\\n<\/span><span class=\"s\">\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">element_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">));<\/span>\r\n\t\t<span class=\"n\">retirer_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">ajouter_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">,<\/span> <span class=\"mi\">19<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">ajouter_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">,<\/span> <span class=\"mi\">14<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">ajouter_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">,<\/span> <span class=\"mi\">18<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">ajouter_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">,<\/span> <span class=\"mi\">16<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">ajouter_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">,<\/span> <span class=\"mi\">11<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Valeur 1 = %d<\/span><span class=\"se\">\\n<\/span><span class=\"s\">\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">element_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">));<\/span>\r\n\t\t<span class=\"n\">retirer_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Valeur 1 = %d<\/span><span class=\"se\">\\n<\/span><span class=\"s\">\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">element_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">));<\/span>\r\n\t\t<span class=\"n\">retirer_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Valeur 1 = %d<\/span><span class=\"se\">\\n<\/span><span class=\"s\">\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">element_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">));<\/span>\r\n\t\t<span class=\"n\">retirer_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Valeur 1 = %d<\/span><span class=\"se\">\\n<\/span><span class=\"s\">\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">element_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">));<\/span>\r\n\t\t<span class=\"n\">retirer_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Valeur 1 = %d<\/span><span class=\"se\">\\n<\/span><span class=\"s\">\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">element_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">));<\/span>\r\n\t\t<span class=\"n\">retirer_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Valeur 1 = %d<\/span><span class=\"se\">\\n<\/span><span class=\"s\">\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">element_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">));<\/span>\r\n\t\t<span class=\"n\">retirer_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"n\">element_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_erreur<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">))<\/span> <span class=\"p\">{<\/span>\r\n\t\t\t<span class=\"n\">printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Ne peut pas voir l'element; le buffer est vide.<\/span><span class=\"se\">\\n<\/span><span class=\"s\">\"<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"p\">}<\/span>\r\n\t\t<span class=\"n\">retirer_buffer<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_erreur<\/span><span class=\"p\">(<\/span><span class=\"n\">l_buffer<\/span><span class=\"p\">))<\/span> <span class=\"p\">{<\/span>\r\n\t\t\t<span class=\"n\">printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Ne peut retirer l'element; le buffer est vide.<\/span><span class=\"se\">\\n<\/span><span class=\"s\">\"<\/span><span class=\"p\">);<\/span>\r\n\t\t<span class=\"p\">}<\/span>\r\n\t<span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"n\">printf<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Erreur, ne peut cr\u00e9er le buffer.<\/span><span class=\"se\">\\n<\/span><span class=\"s\">\"<\/span><span class=\"p\">);<\/span>\r\n\t<span class=\"p\">}<\/span>\r\n\r\n\t<span class=\"k\">return<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<h3>Les graphes<\/h3>\n<p>Un graphe consiste en des noeuds reli\u00e9s entre eux par des arr\u00eates.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-10503 size-full\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/graphe.png\" alt=\"\" width=\"223\" height=\"223\" \/><\/p>\n<p>Ici, les noeuds sont repr\u00e9sent\u00e9s par des ronds bleus et les arr\u00eates sont repr\u00e9sent\u00e9es par les lignes rouges.<\/p>\n<h4>Les graphes \u00e9valu\u00e9s<\/h4>\n<p>Les noeuds (ou les arr\u00eates) peuvent contenir des valeurs. Dans ce cas, on consid\u00e8re le graphe comme \u00e9tant \u00e9valu\u00e9.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10505\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/graphe_evalue.png\" alt=\"\" width=\"413\" height=\"221\" \/><\/p>\n<h4>Les graphes orient\u00e9s<\/h4>\n<p>On dit qu&rsquo;un graphe est orient\u00e9 lorsque chaque arr\u00eates contient une direction.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-10514 size-full\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/graphe_oriente.png\" alt=\"\" width=\"214\" height=\"164\" \/><\/p>\n<h4>Les graphes cycliques et acycliques<\/h4>\n<p>On appel <strong>cycle<\/strong> lorsqu&rsquo;il est possible de repasser par le m\u00eame noeud plusieurs fois en suivant les arr\u00eates, sans emprunter plus d&rsquo;une fois une arr\u00eate.<\/p>\n<p>On dit qu&rsquo;un graphe est cyclique lorsqu&rsquo;il poss\u00e8de un ou plusieurs cycles.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10509\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/cyclique1.png\" alt=\"\" width=\"163\" height=\"124\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-10586 size-full\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/cyclique2.png\" alt=\"\" width=\"143\" height=\"144\" \/><\/p>\n<p>Les exemples pr\u00e9c\u00e9dents sont des graphes cycliques.<\/p>\n<p>De la m\u00eame mani\u00e8re, on appelle graphe acyclique un graphe ne poss\u00e9dant pas de cycle.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10512\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/acyclique1.png\" alt=\"\" width=\"163\" height=\"124\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10513\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/acyclique2.png\" alt=\"\" width=\"143\" height=\"144\" \/><\/p>\n<p>Les exemples pr\u00e9c\u00e9dents sont des graphes acycliques.<\/p>\n<p>Remarquez que dans le second exemple, le graphe semble avoir un cycle, mais il n&rsquo;en a pas puisque pour suivre une arr\u00eate, il faut respecter sa direction.<\/p>\n<h4>Les tenants<\/h4>\n<p>On appel tenant un sous-ensemble d&rsquo;un graphe qui n&rsquo;est reli\u00e9 au reste du graphe par aucune arr\u00eate.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10508\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/tenants.png\" alt=\"\" width=\"193\" height=\"174\" \/><\/p>\n<p>Dans cet exemple, le graphe contient 3 tenants.<\/p>\n<h4>Les graphes connexes<\/h4>\n<p>On dit qu&rsquo;un graphe est connexe lorsqu&rsquo;il contient seulement un seul tenant.<\/p>\n<h4>Impl\u00e9mentation d&rsquo;un graphe<\/h4>\n<p>L&rsquo;impl\u00e9mentation d&rsquo;un graphe peut varier en fonction du type de graphe utilis\u00e9, mais il s&rsquo;agit g\u00e9n\u00e9ralement d&rsquo;une liste de noeuds reli\u00e9s entre eux par des pointeurs repr\u00e9sentant les arr\u00eates.<\/p>\n<p>Puisque, contrairement aux diff\u00e9rentes structures vues plus haut, les graphes ne sont pas toujours accessibles via des librairies, je vais donner deux exemples d&rsquo;impl\u00e9mentation de graphe. Les deux exemples cr\u00e9\u00e9s le graphe ci-dessous:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10519\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/exemple_graphe.png\" alt=\"\" width=\"193\" height=\"204\" \/><\/p>\n<p>Voici l&rsquo;exemple Java (n\u00e9cessite trois (3) fichiers):<\/p>\n<p>Java: Fichier \u00ab\u00a0Noeud.java\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kn\">import<\/span> <span class=\"nn\">java.util.ArrayList<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.LinkedList<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.List<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Repr\u00e9sente un \u00e9l\u00e9ment d'un graphe<\/span>\r\n<span class=\"cm\"> * @author Louis Marchand<\/span>\r\n<span class=\"cm\"> * @version %I%, %G%<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Noeud<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Initialisation du Noeud<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @param aValeur La valeur associ\u00e9 au Noeud<\/span>\r\n<span class=\"cm\">     * @see #valeur<\/span>\r\n<span class=\"cm\">     * @see #getValeur<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Noeud<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aValeur<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"kd\">super<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">valeur<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aValeur<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"n\">voisins<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">LinkedList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Noeud<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * La valeur associ\u00e9e au Noeud<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">valeur<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Assigne la valeur associ\u00e9e au Noeud<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @param aValeur La valeur \u00e0 associer<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setValeur<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aValeur<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">valeur<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aValeur<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Retourne la valeur associ\u00e9e au Noeud<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @return La valeur;<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">getValeur<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">valeur<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Les diff\u00e9rents Noeuds reli\u00e9s au Noeud par une arr\u00eate<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">LinkedList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Noeud<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">voisins<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Retourne les diff\u00e9rents Noeuds reli\u00e9s au Noeud par une arr\u00eate<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @return Les Noeuds voisins<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Noeud<\/span><span class=\"o\">&gt;<\/span> <span class=\"nf\">getVoisins<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Noeud<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">(<\/span><span class=\"n\">voisins<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Ajoute un Noeud \u00e0 la liste des voisins du Noeud<\/span>\r\n<span class=\"cm\">     * @param aVoisin Le Noeud \u00e0 ajouter<\/span>\r\n<span class=\"cm\">     * @see #voisin<\/span>\r\n<span class=\"cm\">     * @see #getVoisin<\/span>\r\n<span class=\"cm\">     * @see #retirerVoisin<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">protected<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">ajouterVoisin<\/span><span class=\"p\">(<\/span><span class=\"n\">Noeud<\/span> <span class=\"n\">aVoisin<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">voisins<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">aVoisin<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Retire un Noeud \u00e0 la liste des voisins du Noeud<\/span>\r\n<span class=\"cm\">     * @param aVoisin Le Noeud \u00e0 retirer<\/span>\r\n<span class=\"cm\">     * @see #voisin<\/span>\r\n<span class=\"cm\">     * @see #getVoisin<\/span>\r\n<span class=\"cm\">     * @see #ajouterVoisin<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">protected<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">retirerVoisin<\/span><span class=\"p\">(<\/span><span class=\"n\">Noeud<\/span> <span class=\"n\">aVoisin<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">voisins<\/span><span class=\"p\">.<\/span><span class=\"na\">remove<\/span><span class=\"p\">(<\/span><span class=\"n\">aVoisin<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Fichier \u00ab\u00a0Graphe.java\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kn\">import<\/span> <span class=\"nn\">java.util.ArrayList<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.LinkedList<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.List<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * En ensemble de Noeuds reli\u00e9s par des arr\u00eates<\/span>\r\n<span class=\"cm\"> * @author Louis Marchand<\/span>\r\n<span class=\"cm\"> * @version %I%, %G%<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Graphe<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Initialisation du Graphe<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Graphe<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"kd\">super<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">noeuds<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">LinkedList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Noeud<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Tous les Noeuds du Graphe<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">LinkedList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Noeud<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">noeuds<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Retourne tous les Noeuds du Graphe<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @return Les Noeuds du Graphe<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Noeud<\/span><span class=\"o\">&gt;<\/span> <span class=\"nf\">getNoeuds<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Noeud<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"n\">noeuds<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Ajoute un nouveau Noeud dans le Graphe<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * Ajoute un nouveau Noeud dans les noeuds du Graphe et permet d'acc\u00e9der<\/span>\r\n<span class=\"cm\">     * \u00e0 ce Noeud par getDernierNoeudAjoute;<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @param aValeur La valeur du nouveau Noeud<\/span>\r\n<span class=\"cm\">     * @see #getDernierNoeudAjoute<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">ajouterNoeud<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aValeur<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">Noeud<\/span> <span class=\"n\">lNoeud<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"n\">lNoeud<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Noeud<\/span><span class=\"p\">(<\/span><span class=\"n\">aValeur<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">noeuds<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">lNoeud<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">dernierNoeudAjoute<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lNoeud<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Le dernier Noeud ajout\u00e9 au Graphe par le m\u00e9thode ajouterNoeud.<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @see #ajouterNoeud<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">Noeud<\/span> <span class=\"n\">dernierNoeudAjoute<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Retourne le dernier Noeud ajout\u00e9 au Graphe par la m\u00e9thode ajouterNoeud.<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @return Le Noeud ajout\u00e9<\/span>\r\n<span class=\"cm\">     * @see #ajouterNoeud<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">Noeud<\/span> <span class=\"nf\">getDernierNoeudAjoute<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">dernierNoeudAjoute<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Ajoute une arr\u00eate entre deux noeuds.<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @param aNoeud1 Le premier Noeud<\/span>\r\n<span class=\"cm\">     * @param aNoeud2 Le second Noeud<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">creerArrete<\/span><span class=\"p\">(<\/span><span class=\"n\">Noeud<\/span> <span class=\"n\">aNoeud1<\/span><span class=\"p\">,<\/span> <span class=\"n\">Noeud<\/span> <span class=\"n\">aNoeud2<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">aNoeud1<\/span><span class=\"p\">.<\/span><span class=\"na\">ajouterVoisin<\/span><span class=\"p\">(<\/span><span class=\"n\">aNoeud2<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">aNoeud2<\/span><span class=\"p\">.<\/span><span class=\"na\">ajouterVoisin<\/span><span class=\"p\">(<\/span><span class=\"n\">aNoeud1<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Retire une arr\u00eate entre deux noeuds.<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @param aNoeud1 Le premier Noeud<\/span>\r\n<span class=\"cm\">     * @param aNoeud2 Le second Noeud<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">retirerArrete<\/span><span class=\"p\">(<\/span><span class=\"n\">Noeud<\/span> <span class=\"n\">aNoeud1<\/span><span class=\"p\">,<\/span> <span class=\"n\">Noeud<\/span> <span class=\"n\">aNoeud2<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">aNoeud1<\/span><span class=\"p\">.<\/span><span class=\"na\">retirerVoisin<\/span><span class=\"p\">(<\/span><span class=\"n\">aNoeud2<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">aNoeud2<\/span><span class=\"p\">.<\/span><span class=\"na\">retirerVoisin<\/span><span class=\"p\">(<\/span><span class=\"n\">aNoeud1<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Fichier \u00ab\u00a0Programme.java\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Exemple de programme utilisant des graphes.<\/span>\r\n<span class=\"cm\"> * @author Louis Marchand<\/span>\r\n<span class=\"cm\"> * @version %I%, %G%<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Programme<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Ex\u00e9cution du Programme principal.<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @param aArguments Les arguments qui on \u00e9t\u00e9 pass\u00e9 au Programme.<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">aArguments<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">Graphe<\/span> <span class=\"n\">lGraphe<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Graphe<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">Noeud<\/span> <span class=\"n\">lNoeud1<\/span><span class=\"p\">,<\/span> <span class=\"n\">lNoeud2<\/span><span class=\"p\">,<\/span> <span class=\"n\">lNoeud3<\/span><span class=\"p\">,<\/span> <span class=\"n\">lNoeud4<\/span><span class=\"p\">,<\/span> <span class=\"n\">lNoeud5<\/span><span class=\"p\">,<\/span> <span class=\"n\">lNoeud6<\/span><span class=\"p\">;<\/span>\r\n\r\n        <span class=\"n\">lGraphe<\/span><span class=\"p\">.<\/span><span class=\"na\">ajouterNoeud<\/span><span class=\"p\">(<\/span><span class=\"mi\">4<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">lNoeud1<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lGraphe<\/span><span class=\"p\">.<\/span><span class=\"na\">getDernierNoeudAjoute<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">lGraphe<\/span><span class=\"p\">.<\/span><span class=\"na\">ajouterNoeud<\/span><span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">lNoeud2<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lGraphe<\/span><span class=\"p\">.<\/span><span class=\"na\">getDernierNoeudAjoute<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">lGraphe<\/span><span class=\"p\">.<\/span><span class=\"na\">creerArrete<\/span><span class=\"p\">(<\/span><span class=\"n\">lNoeud1<\/span><span class=\"p\">,<\/span> <span class=\"n\">lNoeud2<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">lGraphe<\/span><span class=\"p\">.<\/span><span class=\"na\">ajouterNoeud<\/span><span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">lNoeud3<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lGraphe<\/span><span class=\"p\">.<\/span><span class=\"na\">getDernierNoeudAjoute<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">lGraphe<\/span><span class=\"p\">.<\/span><span class=\"na\">creerArrete<\/span><span class=\"p\">(<\/span><span class=\"n\">lNoeud1<\/span><span class=\"p\">,<\/span> <span class=\"n\">lNoeud3<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">lGraphe<\/span><span class=\"p\">.<\/span><span class=\"na\">ajouterNoeud<\/span><span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">lNoeud4<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lGraphe<\/span><span class=\"p\">.<\/span><span class=\"na\">getDernierNoeudAjoute<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">lGraphe<\/span><span class=\"p\">.<\/span><span class=\"na\">creerArrete<\/span><span class=\"p\">(<\/span><span class=\"n\">lNoeud3<\/span><span class=\"p\">,<\/span> <span class=\"n\">lNoeud4<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">lGraphe<\/span><span class=\"p\">.<\/span><span class=\"na\">ajouterNoeud<\/span><span class=\"p\">(<\/span><span class=\"mi\">6<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">lNoeud5<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lGraphe<\/span><span class=\"p\">.<\/span><span class=\"na\">getDernierNoeudAjoute<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">lGraphe<\/span><span class=\"p\">.<\/span><span class=\"na\">creerArrete<\/span><span class=\"p\">(<\/span><span class=\"n\">lNoeud4<\/span><span class=\"p\">,<\/span> <span class=\"n\">lNoeud5<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">lGraphe<\/span><span class=\"p\">.<\/span><span class=\"na\">ajouterNoeud<\/span><span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">lNoeud6<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lGraphe<\/span><span class=\"p\">.<\/span><span class=\"na\">getDernierNoeudAjoute<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">lGraphe<\/span><span class=\"p\">.<\/span><span class=\"na\">creerArrete<\/span><span class=\"p\">(<\/span><span class=\"n\">lNoeud3<\/span><span class=\"p\">,<\/span> <span class=\"n\">lNoeud6<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">lGraphe<\/span><span class=\"p\">.<\/span><span class=\"na\">creerArrete<\/span><span class=\"p\">(<\/span><span class=\"n\">lNoeud4<\/span><span class=\"p\">,<\/span> <span class=\"n\">lNoeud6<\/span><span class=\"p\">);<\/span>\r\n\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Voici le m\u00eame exemple en Eiffel (toujours trois fichiers n\u00e9cessaires):<\/p>\n<p>Fichier \u00ab\u00a0noeud.e\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">note<\/span>\r\n\t<span class=\"n\">description<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"Repr\u00e9sente un \u00e9l\u00e9ment d'un graphe\"<\/span>\r\n\t<span class=\"n\">auteur<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"Louis Marchand\"<\/span>\r\n\t<span class=\"n\">date<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"Mon, 28 Sep 2020 20:27:40 +0000\"<\/span>\r\n\t<span class=\"n\">revision<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"0.1\"<\/span>\r\n\r\n<span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">NOEUD<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"n\">a_valeur<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"c1\">-- Initialisation de `Current'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">valeur<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_valeur<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">LINKED_LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">NOEUD<\/span><span class=\"o\">]<\/span><span class=\"p\">}<\/span> <span class=\"n\">voisins_interne<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">valeur<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span> <span class=\"kr\">assign<\/span> <span class=\"n\">set_valeur<\/span>\r\n\t\t\t<span class=\"c1\">-- La valeur associ\u00e9e \u00e0 `Current'<\/span>\r\n\r\n\t<span class=\"n\">set_valeur<\/span><span class=\"p\">(<\/span><span class=\"n\">a_valeur<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"c1\">-- Assigne `valeur' avec `a_valeur'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">valeur<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_valeur<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">voisins<\/span><span class=\"p\">:<\/span><span class=\"nc\">LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">NOEUD<\/span><span class=\"o\">]<\/span>\r\n\t\t\t<span class=\"c1\">-- Les diff\u00e9rents {NOEUD} reli\u00e9s \u00e0 `Current' par une arr\u00eate<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kc\">Result<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">voisins_interne<\/span><span class=\"p\">.<\/span><span class=\"n\">twin<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"nc\">GRAPHE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Impl\u00e9mentation<\/span>\r\n\r\n\t<span class=\"n\">ajouter_voisin<\/span><span class=\"p\">(<\/span><span class=\"n\">a_voisin<\/span><span class=\"p\">:<\/span><span class=\"nc\">NOEUD<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"c1\">-- Ajoute `a_voisin' dans la liste de `voisins'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">voisins_interne<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_voisin<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">retirer_voisin<\/span><span class=\"p\">(<\/span><span class=\"n\">a_voisin<\/span><span class=\"p\">:<\/span><span class=\"nc\">NOEUD<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"c1\">-- Enl\u00e8ve `a_voisin' de la liste de `voisins'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">voisins_interne<\/span><span class=\"p\">.<\/span><span class=\"n\">prune_all<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_voisin<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Impl\u00e9mentation<\/span>\r\n\r\n\t<span class=\"n\">voisins_interne<\/span><span class=\"p\">:<\/span><span class=\"nc\">LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">NOEUD<\/span><span class=\"o\">]<\/span>\r\n\t\t\t<span class=\"c1\">-- Repr\u00e9sentation interne de `voisin'<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Fichier \u00ab\u00a0graphe.e\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">note<\/span>\r\n\t<span class=\"n\">description<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"En ensemble de {NOEUD} reli\u00e9s par des arr\u00eates\"<\/span>\r\n\t<span class=\"n\">auteur<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"Louis Marchand\"<\/span>\r\n\t<span class=\"n\">date<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"Mon, 28 Sep 2020 20:27:40 +0000\"<\/span>\r\n\t<span class=\"n\">revision<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"0.1\"<\/span>\r\n\r\n<span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">GRAPHE<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"c1\">-- Initalisation de `Current'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">LINKED_LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">NOEUD<\/span><span class=\"o\">]<\/span><span class=\"p\">}<\/span><span class=\"n\">noeuds_interne<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">-- Access<\/span>\r\n\r\n\t<span class=\"n\">noeuds<\/span><span class=\"p\">:<\/span><span class=\"nc\">LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">NOEUD<\/span><span class=\"o\">]<\/span>\r\n\t\t\t<span class=\"c1\">-- La liste des {NOEUD} de `Current'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kc\">Result<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">noeuds_interne<\/span><span class=\"p\">.<\/span><span class=\"n\">twin<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">ajouter_noeud<\/span><span class=\"p\">(<\/span><span class=\"n\">a_valeur<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"c1\">-- Ajoute un nouveau {NOEUD} en utilisant `a_valeur' comme `valeur'<\/span>\r\n\t\t<span class=\"kr\">local<\/span>\r\n\t\t\t<span class=\"n\">l_noeud<\/span><span class=\"p\">:<\/span><span class=\"nc\">NOEUD<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">l_noeud<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_valeur<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">dernier_noeud_ajoute<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">l_noeud<\/span>\r\n\t\t\t<span class=\"n\">noeuds_interne<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"n\">l_noeud<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">dernier_noeud_ajoute<\/span><span class=\"p\">:<\/span><span class=\"kr\">detachable<\/span> <span class=\"nc\">NOEUD<\/span>\r\n\t\t\t<span class=\"c1\">-- Le dernier {NOEUD} qui a \u00e9t\u00e9 ajout\u00e9 par `ajouter_noeud'<\/span>\r\n\r\n\t<span class=\"n\">creer_arrete<\/span><span class=\"p\">(<\/span><span class=\"n\">a_noeud1<\/span><span class=\"p\">,<\/span> <span class=\"n\">a_noeud_2<\/span><span class=\"p\">:<\/span><span class=\"nc\">NOEUD<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"c1\">-- Ajoute un arr\u00eate entre `a_noeud_1' et `a_noeud_2'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">a_noeud1<\/span><span class=\"p\">.<\/span><span class=\"n\">ajouter_voisin<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_noeud_2<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">a_noeud_2<\/span><span class=\"p\">.<\/span><span class=\"n\">ajouter_voisin<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_noeud1<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">retirer_arrete<\/span><span class=\"p\">(<\/span><span class=\"n\">a_noeud1<\/span><span class=\"p\">,<\/span> <span class=\"n\">a_noeud_2<\/span><span class=\"p\">:<\/span><span class=\"nc\">NOEUD<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"c1\">-- Retire un arr\u00eate entre `a_noeud_1' et `a_noeud_2'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">a_noeud1<\/span><span class=\"p\">.<\/span><span class=\"n\">retirer_voisin<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_noeud_2<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">a_noeud_2<\/span><span class=\"p\">.<\/span><span class=\"n\">retirer_voisin<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_noeud1<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Impl\u00e9mentation<\/span>\r\n\r\n\t<span class=\"n\">noeuds_interne<\/span><span class=\"p\">:<\/span><span class=\"nc\">LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">NOEUD<\/span><span class=\"o\">]<\/span>\r\n\t\t\t<span class=\"c1\">-- Repr\u00e9sentation interne de `noeuds'<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Fichier \u00ab\u00a0application.e\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">note<\/span>\r\n\t<span class=\"n\">description<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"Application exemple pour d\u00e9montrer l'impl\u00e9mentation des graphes\"<\/span>\r\n\t<span class=\"n\">auteur<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"Louis Marchand\"<\/span>\r\n\t<span class=\"n\">date<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"Mon, 28 Sep 2020 20:27:40 +0000\"<\/span>\r\n\t<span class=\"n\">revision<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"0.1\"<\/span>\r\n\r\n<span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">APPLICATION<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialization<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"c1\">-- Ex\u00e9cute l'application.<\/span>\r\n\t\t<span class=\"kr\">local<\/span>\r\n\t\t\t<span class=\"n\">l_graphe<\/span><span class=\"p\">:<\/span><span class=\"nc\">GRAPHE<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">l_graphe<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"n\">l_graphe<\/span><span class=\"p\">.<\/span><span class=\"n\">ajouter_noeud<\/span> <span class=\"p\">(<\/span><span class=\"mi\">4<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"kr\">if<\/span> <span class=\"kr\">attached<\/span> <span class=\"n\">l_graphe<\/span><span class=\"p\">.<\/span><span class=\"n\">dernier_noeud_ajoute<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_noeud_1<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t\t<span class=\"n\">l_graphe<\/span><span class=\"p\">.<\/span><span class=\"n\">ajouter_noeud<\/span> <span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t<span class=\"kr\">if<\/span> <span class=\"kr\">attached<\/span> <span class=\"n\">l_graphe<\/span><span class=\"p\">.<\/span><span class=\"n\">dernier_noeud_ajoute<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_noeud_2<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t\t\t<span class=\"n\">l_graphe<\/span><span class=\"p\">.<\/span><span class=\"n\">creer_arrete<\/span> <span class=\"p\">(<\/span><span class=\"n\">la_noeud_1<\/span><span class=\"p\">,<\/span> <span class=\"n\">la_noeud_2<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t<span class=\"kr\">end<\/span>\r\n\t\t\t\t<span class=\"n\">l_graphe<\/span><span class=\"p\">.<\/span><span class=\"n\">ajouter_noeud<\/span> <span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t<span class=\"kr\">if<\/span> <span class=\"kr\">attached<\/span> <span class=\"n\">l_graphe<\/span><span class=\"p\">.<\/span><span class=\"n\">dernier_noeud_ajoute<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_noeud_3<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t\t\t<span class=\"n\">l_graphe<\/span><span class=\"p\">.<\/span><span class=\"n\">creer_arrete<\/span> <span class=\"p\">(<\/span><span class=\"n\">la_noeud_1<\/span><span class=\"p\">,<\/span> <span class=\"n\">la_noeud_3<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t\t<span class=\"n\">l_graphe<\/span><span class=\"p\">.<\/span><span class=\"n\">ajouter_noeud<\/span> <span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t\t<span class=\"kr\">if<\/span> <span class=\"kr\">attached<\/span> <span class=\"n\">l_graphe<\/span><span class=\"p\">.<\/span><span class=\"n\">dernier_noeud_ajoute<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_noeud_4<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t\t\t\t<span class=\"n\">l_graphe<\/span><span class=\"p\">.<\/span><span class=\"n\">creer_arrete<\/span> <span class=\"p\">(<\/span><span class=\"n\">la_noeud_3<\/span><span class=\"p\">,<\/span> <span class=\"n\">la_noeud_4<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t\t\t<span class=\"n\">l_graphe<\/span><span class=\"p\">.<\/span><span class=\"n\">ajouter_noeud<\/span> <span class=\"p\">(<\/span><span class=\"mi\">6<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t\t\t<span class=\"kr\">if<\/span> <span class=\"kr\">attached<\/span> <span class=\"n\">l_graphe<\/span><span class=\"p\">.<\/span><span class=\"n\">dernier_noeud_ajoute<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_noeud_5<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t\t\t\t\t<span class=\"n\">l_graphe<\/span><span class=\"p\">.<\/span><span class=\"n\">creer_arrete<\/span> <span class=\"p\">(<\/span><span class=\"n\">la_noeud_4<\/span><span class=\"p\">,<\/span> <span class=\"n\">la_noeud_5<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t\t\t<span class=\"kr\">end<\/span>\r\n\t\t\t\t\t\t<span class=\"n\">l_graphe<\/span><span class=\"p\">.<\/span><span class=\"n\">ajouter_noeud<\/span> <span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t\t\t<span class=\"kr\">if<\/span> <span class=\"kr\">attached<\/span> <span class=\"n\">l_graphe<\/span><span class=\"p\">.<\/span><span class=\"n\">dernier_noeud_ajoute<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_noeud_6<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t\t\t\t\t<span class=\"n\">l_graphe<\/span><span class=\"p\">.<\/span><span class=\"n\">creer_arrete<\/span> <span class=\"p\">(<\/span><span class=\"n\">la_noeud_3<\/span><span class=\"p\">,<\/span> <span class=\"n\">la_noeud_6<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t\t\t\t<span class=\"n\">l_graphe<\/span><span class=\"p\">.<\/span><span class=\"n\">creer_arrete<\/span> <span class=\"p\">(<\/span><span class=\"n\">la_noeud_4<\/span><span class=\"p\">,<\/span> <span class=\"n\">la_noeud_6<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t\t\t<span class=\"kr\">end<\/span>\r\n\t\t\t\t\t<span class=\"kr\">end<\/span>\r\n\t\t\t\t<span class=\"kr\">end<\/span>\r\n\t\t\t<span class=\"kr\">end<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<h4>Parcourir un graphe<\/h4>\n<p>Puisqu&rsquo;un graphe peut avoir plusieurs tenants et peut \u00e9galement avoir un des cycles, le parcourir d&rsquo;un graphe peut-\u00eatre tr\u00e8s difficile \u00e0 impl\u00e9menter. Voici donc un exemple de parcourt de graphe. Cette fonction prend en argument un noeud et une valeur et doit retourner vrai dans le cas o\u00f9 la valeur peut \u00eatre trouv\u00e9e dans un noeud accessible \u00e0 partir du noeud re\u00e7u en argument.<\/p>\n<p>Exemple en Java:<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Indique si la valeur est accessible dans le graphe.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * @param aGraphe Le Graphe dans lequel on recherche.<\/span>\r\n<span class=\"cm\"> * @param aValeur La valeur \u00e0 rechercher<\/span>\r\n<span class=\"cm\"> * @return Vrai si la valeur a \u00e9t\u00e9 trouv\u00e9, non sinon.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">trouverValeur<\/span><span class=\"p\">(<\/span><span class=\"n\">Graphe<\/span> <span class=\"n\">aGraphe<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">aValeur<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kt\">boolean<\/span> <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"n\">Noeud<\/span> <span class=\"n\">lNoeud<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Noeud<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lTraite<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">LinkedList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Noeud<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"n\">Iterator<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Noeud<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lNoeudsIterator<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aGraphe<\/span><span class=\"p\">.<\/span><span class=\"na\">getNoeuds<\/span><span class=\"p\">().<\/span><span class=\"na\">iterator<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"k\">while<\/span> <span class=\"p\">(<\/span><span class=\"n\">lNoeudsIterator<\/span><span class=\"p\">.<\/span><span class=\"na\">hasNext<\/span><span class=\"p\">()<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"o\">!<\/span><span class=\"n\">lResultat<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">lNoeud<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lNoeudsIterator<\/span><span class=\"p\">.<\/span><span class=\"na\">next<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"n\">lTraite<\/span><span class=\"p\">.<\/span><span class=\"na\">contains<\/span><span class=\"p\">(<\/span><span class=\"n\">lNoeud<\/span><span class=\"p\">))<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"n\">trouverValeurIteration<\/span><span class=\"p\">(<\/span><span class=\"n\">lNoeud<\/span><span class=\"p\">,<\/span> <span class=\"n\">aValeur<\/span><span class=\"p\">,<\/span> <span class=\"n\">lTraite<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">lResultat<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Indique si la valeur est accessible dans un noeud \u00e0 partir d&#39;un noeud.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * Noter qu&#39;une liste des noeuds d\u00e9j\u00e0 trait\u00e9s est fourni et<\/span>\r\n<span class=\"cm\"> * que cette m\u00e9thode a un effet de bord sur cette liste.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * @param aNoeud Le Noeud dans lequel d\u00e9buter la recherche.<\/span>\r\n<span class=\"cm\"> * @param aValeur La valeur \u00e0 rechercher<\/span>\r\n<span class=\"cm\"> * @param aTraite Les noeuds d\u00e9j\u00e0 trait\u00e9s<\/span>\r\n<span class=\"cm\"> * @return Vrai si la valeur a \u00e9t\u00e9 trouv\u00e9, non sinon.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kd\">private<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">trouverValeurIteration<\/span><span class=\"p\">(<\/span>\r\n        <span class=\"n\">Noeud<\/span> <span class=\"n\">aNoeud<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">aValeur<\/span><span class=\"p\">,<\/span> <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Noeud<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">aTraite<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">Iterator<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Noeud<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lVoisinsIterator<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"n\">Noeud<\/span> <span class=\"n\">lVoisin<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"kt\">boolean<\/span> <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"n\">aTraite<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">aNoeud<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">aNoeud<\/span><span class=\"p\">.<\/span><span class=\"na\">getValeur<\/span><span class=\"p\">()<\/span> <span class=\"o\">==<\/span> <span class=\"n\">aValeur<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">lVoisinsIterator<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aNoeud<\/span><span class=\"p\">.<\/span><span class=\"na\">getVoisins<\/span><span class=\"p\">().<\/span><span class=\"na\">iterator<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"k\">while<\/span> <span class=\"p\">(<\/span><span class=\"n\">lVoisinsIterator<\/span><span class=\"p\">.<\/span><span class=\"na\">hasNext<\/span><span class=\"p\">()<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"o\">!<\/span><span class=\"n\">lResultat<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">lVoisin<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lVoisinsIterator<\/span><span class=\"p\">.<\/span><span class=\"na\">next<\/span><span class=\"p\">();<\/span>\r\n            <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"n\">aTraite<\/span><span class=\"p\">.<\/span><span class=\"na\">contains<\/span><span class=\"p\">(<\/span><span class=\"n\">lVoisin<\/span><span class=\"p\">))<\/span> <span class=\"p\">{<\/span>\r\n                <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"n\">trouverValeurIteration<\/span><span class=\"p\">(<\/span><span class=\"n\">lVoisin<\/span><span class=\"p\">,<\/span> <span class=\"n\">aValeur<\/span><span class=\"p\">,<\/span> <span class=\"n\">aTraite<\/span><span class=\"p\">);<\/span>\r\n            <span class=\"p\">}<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">lResultat<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Exemple en Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"n\">trouver_valeur<\/span><span class=\"p\">(<\/span><span class=\"n\">a_graphe<\/span><span class=\"p\">:<\/span><span class=\"nc\">GRAPHE<\/span><span class=\"p\">;<\/span><span class=\"w\"> <\/span><span class=\"n\">a_valeur<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">):<\/span><span class=\"nc\">BOOLEAN<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t<\/span><span class=\"c1\">-- Indique si la valeur est accessible dans `a_graphe&#39;<\/span><span class=\"w\"><\/span>\r\n<span class=\"kr\">local<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t<\/span><span class=\"n\">l_noeuds_curseur<\/span><span class=\"p\">:<\/span><span class=\"nc\">ITERATION_CURSOR<\/span><span class=\"o\">[<\/span><span class=\"nc\">NOEUD<\/span><span class=\"o\">]<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t<\/span><span class=\"n\">l_traite<\/span><span class=\"p\">:<\/span><span class=\"nc\">LINKED_LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">NOEUD<\/span><span class=\"o\">]<\/span><span class=\"w\"><\/span>\r\n<span class=\"kr\">do<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t<\/span><span class=\"kr\">create<\/span><span class=\"w\"> <\/span><span class=\"n\">l_traite<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t<\/span><span class=\"kr\">from<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"kc\">Result<\/span><span class=\"w\"> <\/span><span class=\"o\">:=<\/span><span class=\"w\"> <\/span><span class=\"kc\">False<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"n\">l_noeuds_curseur<\/span><span class=\"w\"> <\/span><span class=\"o\">:=<\/span><span class=\"w\"> <\/span><span class=\"n\">a_graphe<\/span><span class=\"p\">.<\/span><span class=\"n\">noeuds<\/span><span class=\"p\">.<\/span><span class=\"n\">new_cursor<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t<\/span><span class=\"kr\">until<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"n\">l_noeuds_curseur<\/span><span class=\"p\">.<\/span><span class=\"n\">after<\/span><span class=\"w\"> <\/span><span class=\"ow\">or<\/span><span class=\"w\"> <\/span><span class=\"kc\">Result<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t<\/span><span class=\"kr\">loop<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"kc\">Result<\/span><span class=\"w\"> <\/span><span class=\"o\">:=<\/span><span class=\"w\"> <\/span><span class=\"n\">trouver_valeur_iteration<\/span><span class=\"p\">(<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t\t<\/span><span class=\"n\">l_noeuds_curseur<\/span><span class=\"p\">.<\/span><span class=\"n\">item<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">a_valeur<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">l_traite<\/span><span class=\"p\">)<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"n\">l_noeuds_curseur<\/span><span class=\"p\">.<\/span><span class=\"n\">forth<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t<\/span><span class=\"kr\">end<\/span><span class=\"w\"><\/span>\r\n\r\n<span class=\"kr\">end<\/span><span class=\"w\"><\/span>\r\n\r\n<span class=\"n\">trouver_valeur_iteration<\/span><span class=\"p\">(<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t<\/span><span class=\"n\">a_noeud<\/span><span class=\"p\">:<\/span><span class=\"nc\">NOEUD<\/span><span class=\"p\">;<\/span><span class=\"w\"> <\/span><span class=\"n\">a_valeur<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">;<\/span><span class=\"w\"> <\/span><span class=\"n\">a_traite<\/span><span class=\"p\">:<\/span><span class=\"nc\">LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">NOEUD<\/span><span class=\"o\">]<\/span><span class=\"p\">):<\/span><span class=\"nc\">BOOLEAN<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t<\/span><span class=\"c1\">-- Indique si la valeur est accessible dans un {NOEUD} \u00e0 partir de `a_noeud&#39;<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t<\/span><span class=\"c1\">-- consid\u00e9rant que les {NOEUD} de `a_traite&#39; on d\u00e9j\u00e0 \u00e9t\u00e9 trait\u00e9s.<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t<\/span><span class=\"c1\">-- Noter que la fonction a un effet de bord sur `a_traite&#39;.<\/span><span class=\"w\"><\/span>\r\n<span class=\"kr\">local<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t<\/span><span class=\"n\">l_voisins_curseur<\/span><span class=\"p\">:<\/span><span class=\"nc\">ITERATION_CURSOR<\/span><span class=\"o\">[<\/span><span class=\"nc\">NOEUD<\/span><span class=\"o\">]<\/span><span class=\"w\"><\/span>\r\n<span class=\"kr\">do<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t<\/span><span class=\"n\">a_traite<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"n\">a_noeud<\/span><span class=\"p\">)<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t<\/span><span class=\"kc\">Result<\/span><span class=\"w\"> <\/span><span class=\"o\">:=<\/span><span class=\"w\"> <\/span><span class=\"kc\">False<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t<\/span><span class=\"kr\">if<\/span><span class=\"w\"> <\/span><span class=\"n\">a_noeud<\/span><span class=\"p\">.<\/span><span class=\"n\">valeur<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">a_valeur<\/span><span class=\"w\"> <\/span><span class=\"kr\">then<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"kc\">Result<\/span><span class=\"w\"> <\/span><span class=\"o\">:=<\/span><span class=\"w\"> <\/span><span class=\"kc\">True<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t<\/span><span class=\"kr\">else<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"kr\">from<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t<\/span><span class=\"n\">l_voisins_curseur<\/span><span class=\"w\"> <\/span><span class=\"o\">:=<\/span><span class=\"w\"> <\/span><span class=\"n\">a_noeud<\/span><span class=\"p\">.<\/span><span class=\"n\">voisins<\/span><span class=\"p\">.<\/span><span class=\"n\">new_cursor<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"kr\">until<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t<\/span><span class=\"n\">l_voisins_curseur<\/span><span class=\"p\">.<\/span><span class=\"n\">after<\/span><span class=\"w\"> <\/span><span class=\"ow\">or<\/span><span class=\"w\"> <\/span><span class=\"kc\">Result<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"kr\">loop<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t<\/span><span class=\"kr\">if<\/span><span class=\"w\"> <\/span><span class=\"ow\">not<\/span><span class=\"w\"> <\/span><span class=\"n\">a_traite<\/span><span class=\"p\">.<\/span><span class=\"n\">has<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"n\">l_voisins_curseur<\/span><span class=\"p\">.<\/span><span class=\"n\">item<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"kr\">then<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t\t<\/span><span class=\"kc\">Result<\/span><span class=\"w\"> <\/span><span class=\"o\">:=<\/span><span class=\"w\"> <\/span><span class=\"n\">trouver_valeur_iteration<\/span><span class=\"p\">(<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t\t\t\t\t<\/span><span class=\"n\">l_voisins_curseur<\/span><span class=\"p\">.<\/span><span class=\"n\">item<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">a_valeur<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">a_traite<\/span><span class=\"p\">)<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t<\/span><span class=\"kr\">end<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t\t<\/span><span class=\"n\">l_voisins_curseur<\/span><span class=\"p\">.<\/span><span class=\"n\">forth<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t\t<\/span><span class=\"kr\">end<\/span><span class=\"w\"><\/span>\r\n<span class=\"w\">\t<\/span><span class=\"kr\">end<\/span><span class=\"w\"><\/span>\r\n<span class=\"kr\">end<\/span><span class=\"w\"><\/span>\r\n<\/pre>\n<\/div>\n<p>Remarquez que j&rsquo;en ai \u00e9galement profit\u00e9 pour vous montrer l&rsquo;utilisation des it\u00e9rateurs (\u00ab\u00a0ITERATION_CURSOR\u00a0\u00bb en Eiffel). \u00c7a permet de ne pas avoir \u00e0 garder une copie de la liste en variable. Tout ce dont on a besoin, c&rsquo;est un it\u00e9rateur qui parcourra la liste en question. \u00c7a \u00e9vite d&rsquo;effectuer des manipulations non souhaitables \u00e0 la liste.<\/p>\n<h3>Les arbres<\/h3>\n<p>Un arbre est un graphe connexe, acyclique et orient\u00e9. Un arbre peut \u00eatre \u00e9valu\u00e9 ou non.<\/p>\n<p>Lorsqu&rsquo;on a un arbre non vide, on appel racine le seul noeud n&rsquo;\u00e9tant la destination d&rsquo;aucune arr\u00eate.<\/p>\n<p>On appel feuille tous les noeuds n&rsquo;\u00e9tant la source d&rsquo;aucune arr\u00eate.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10517\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/arbre.png\" alt=\"\" width=\"320\" height=\"150\" \/><\/p>\n<p>Les restrictions impos\u00e9es aux arbres font de ces derniers de tr\u00e8s bonnes structures pour repr\u00e9senter une structure parent\/enfant (o\u00f9 chaque noeud \u00e0 0, 1 ou plusieurs enfants et chaque noeud sauf la racine \u00e0 un seul parent).<\/p>\n<p>Il est \u00e0 noter que tous les noeuds sont en soi la racine d&rsquo;un sous-arbre. La r\u00e9cursion est donc une m\u00e9thode importante dans l&rsquo;utilisation des arbres.<\/p>\n<p>Malgr\u00e9 que l&rsquo;impl\u00e9mentation d&rsquo;un arbre est plus simple que pour le graphe, il n&rsquo;en demeure pas moins qu&rsquo;il s&rsquo;agit d&rsquo;une structure qu&rsquo;il est souvent n\u00e9cessaire d&rsquo;impl\u00e9menter soi-m\u00eame. De plus, tout comme le graphe, en fonction du type d&rsquo;arbre que nous d\u00e9sirons utiliser, l&rsquo;impl\u00e9mentation devra \u00eatre adapt\u00e9e. Voici donc un exemple d&rsquo;impl\u00e9mentation d&rsquo;arbre. L&rsquo;arbre produit par les programmes sera le suivant:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10523\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/exemple_arbre.png\" alt=\"\" width=\"124\" height=\"153\" \/><\/p>\n<p>Exemple en Java (deux fichiers n\u00e9cessaires):<\/p>\n<p>Fichier \u00ab\u00a0Arbre.java\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kn\">import<\/span> <span class=\"nn\">java.util.ArrayList<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.LinkedList<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.List<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Structure de graphe connexe, acyclique et orient\u00e9.<\/span>\r\n<span class=\"cm\"> * @author Louis Marchand<\/span>\r\n<span class=\"cm\"> * @version %I%, %G%<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Arbre<\/span> <span class=\"p\">{<\/span>\r\n    \r\n    \r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Initialisation de l'Arbre.<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @param aValeur La valeur assign\u00e9 \u00e0 la racine<\/span>\r\n<span class=\"cm\">     * @see #valeur<\/span>\r\n<span class=\"cm\">     * @see #getValeur<\/span>\r\n<span class=\"cm\">     * @see #setValeur<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nf\">Arbre<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aValeur<\/span><span class=\"p\">){<\/span>\r\n        <span class=\"n\">valeur<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aValeur<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"n\">enfants<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">LinkedList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Arbre<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * La valeur \u00e0 la racine de l'Arbre.<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">valeur<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Retourne la valeur de la racine de l'Arbre.<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @return La valeur de la racine de l'Arbre.<\/span>\r\n<span class=\"cm\">     * @see #setValeur<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">int<\/span> <span class=\"nf\">getValeur<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">valeur<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Assigne la valeur \u00e0 la racine de l'Arbre.<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @param aValeur La valeur \u00e0 assign\u00e9e.<\/span>\r\n<span class=\"cm\">     * @see #getValeur<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setValeur<\/span><span class=\"p\">(<\/span><span class=\"kt\">int<\/span> <span class=\"n\">aValeur<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">valeur<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aValeur<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Les sous-arbres de l'Arbre.<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">LinkedList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Arbre<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">enfants<\/span><span class=\"p\">;<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Retourne les sous-arbres de l'Arbre.<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @return Les sous-arbres de l'Arbre<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Arbre<\/span><span class=\"o\">&gt;<\/span> <span class=\"nf\">getEnfants<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Arbre<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"n\">enfants<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Ajoute un sous-arbre \u00e0 l'Arbre.<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @param aEnfant Le sous-arbre \u00e0 ajouter<\/span>\r\n<span class=\"cm\">     * @see #getEnfants<\/span>\r\n<span class=\"cm\">     * @see #retirerEnfant<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">ajouterEnfant<\/span><span class=\"p\">(<\/span><span class=\"n\">Arbre<\/span> <span class=\"n\">aEnfant<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">enfants<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">aEnfant<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Retire un sous-arbre de l'Arbre.<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @param aEnfant le sous-arbre \u00e0 retirer<\/span>\r\n<span class=\"cm\">     * @see #getEnfants<\/span>\r\n<span class=\"cm\">     * @see #ajouterEnfant<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">retirerEnfant<\/span><span class=\"p\">(<\/span><span class=\"n\">Arbre<\/span> <span class=\"n\">aEnfant<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">enfants<\/span><span class=\"p\">.<\/span><span class=\"na\">remove<\/span><span class=\"p\">(<\/span><span class=\"n\">aEnfant<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Fichier \u00ab\u00a0Programme.java\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kn\">import<\/span> <span class=\"nn\">java.util.Iterator<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.LinkedList<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">java.util.Queue<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Exemple de programme utilisant des arbres.<\/span>\r\n<span class=\"cm\"> * @author Louis Marchand<\/span>\r\n<span class=\"cm\"> * @version %I%, %G%<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Programme<\/span> <span class=\"p\">{<\/span>\r\n\r\n    <span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\">     * Ex\u00e9cution du Programme principal.<\/span>\r\n<span class=\"cm\">     *<\/span>\r\n<span class=\"cm\">     * @param aArguments Les arguments qui on \u00e9t\u00e9 pass\u00e9 au Programme.<\/span>\r\n<span class=\"cm\">     *\/<\/span>\r\n    <span class=\"kd\">static<\/span> <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">aArguments<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">Arbre<\/span> <span class=\"n\">lArbre<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Arbre<\/span><span class=\"p\">(<\/span><span class=\"mi\">4<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">lArbre<\/span><span class=\"p\">.<\/span><span class=\"na\">ajouterEnfant<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Arbre<\/span><span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"n\">lArbre<\/span><span class=\"p\">.<\/span><span class=\"na\">ajouterEnfant<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Arbre<\/span><span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"n\">lArbre<\/span><span class=\"p\">.<\/span><span class=\"na\">ajouterEnfant<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Arbre<\/span><span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"n\">lArbre<\/span><span class=\"p\">.<\/span><span class=\"na\">getEnfants<\/span><span class=\"p\">().<\/span><span class=\"na\">get<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">).<\/span><span class=\"na\">ajouterEnfant<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Arbre<\/span><span class=\"p\">(<\/span><span class=\"mi\">6<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"n\">lArbre<\/span><span class=\"p\">.<\/span><span class=\"na\">getEnfants<\/span><span class=\"p\">().<\/span><span class=\"na\">get<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">).<\/span><span class=\"na\">ajouterEnfant<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Arbre<\/span><span class=\"p\">(<\/span><span class=\"mi\">9<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"n\">lArbre<\/span><span class=\"p\">.<\/span><span class=\"na\">getEnfants<\/span><span class=\"p\">().<\/span><span class=\"na\">get<\/span><span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">).<\/span><span class=\"na\">ajouterEnfant<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Arbre<\/span><span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">));<\/span>\r\n        <span class=\"n\">lArbre<\/span><span class=\"p\">.<\/span><span class=\"na\">getEnfants<\/span><span class=\"p\">().<\/span><span class=\"na\">get<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">).<\/span><span class=\"na\">getEnfants<\/span><span class=\"p\">().<\/span><span class=\"na\">get<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">).<\/span><span class=\"na\">ajouterEnfant<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"n\">Arbre<\/span><span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">));<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Exemple en Eiffel (deux fichiers n\u00e9cessaires):<\/p>\n<p>Fichier \u00ab\u00a0arbre.e\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">note<\/span>\r\n\t<span class=\"n\">description<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"Structure de graphe connexe, acyclique et orient\u00e9\"<\/span>\r\n\t<span class=\"n\">author<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"Louis Marchand\"<\/span>\r\n\t<span class=\"n\">date<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"Mon, 28 Sep 2020 20:27:40 +0000\"<\/span>\r\n\t<span class=\"n\">revision<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"0.1\"<\/span>\r\n\r\n<span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">ARBRE<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialisation<\/span>\r\n\r\n\t<span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"n\">a_valeur<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"c1\">-- Initialisation de `Current' assignant `a_valeur' comme `valeur'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">valeur<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_Valeur<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">LINKED_LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">ARBRE<\/span><span class=\"o\">]<\/span><span class=\"p\">}<\/span> <span class=\"n\">enfants_interne<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"c1\">--Acc\u00e8s<\/span>\r\n\r\n\t<span class=\"n\">valeur<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span>\r\n\t\t\t<span class=\"c1\">-- La valeur \u00e0 la racine de `Current'<\/span>\r\n\r\n\t<span class=\"n\">set_valeur<\/span><span class=\"p\">(<\/span><span class=\"n\">a_valeur<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"c1\">-- Assigne `valeur' avec `a_valeur'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">valeur<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">a_valeur<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">enfants<\/span><span class=\"p\">:<\/span><span class=\"nc\">LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">ARBRE<\/span><span class=\"o\">]<\/span>\r\n\t\t\t<span class=\"c1\">-- Les sous-arbres de `Current'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kc\">Result<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">enfants_interne<\/span><span class=\"p\">.<\/span><span class=\"n\">twin<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">ajouter_enfant<\/span><span class=\"p\">(<\/span><span class=\"n\">a_arbre<\/span><span class=\"p\">:<\/span><span class=\"nc\">ARBRE<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"c1\">-- Ajoute `a_arbre' \u00e0 la liste des `enfants'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">enfants_interne<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_arbre<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n\t<span class=\"n\">retirer_enfant<\/span><span class=\"p\">(<\/span><span class=\"n\">a_arbre<\/span><span class=\"p\">:<\/span><span class=\"nc\">ARBRE<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"c1\">-- retire `a_arbre' de la liste des `enfants'<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"n\">enfants_interne<\/span><span class=\"p\">.<\/span><span class=\"n\">prune_all<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_arbre<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Impl\u00e9mentation<\/span>\r\n\r\n\t<span class=\"n\">enfants_interne<\/span><span class=\"p\">:<\/span><span class=\"nc\">LIST<\/span><span class=\"o\">[<\/span><span class=\"nc\">ARBRE<\/span><span class=\"o\">]<\/span>\r\n\t\t\t<span class=\"c1\">-- Repr\u00e9sentation interne de `enfants'<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p>Fichier \u00ab\u00a0application.e\u00a0\u00bb:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kr\">note<\/span>\r\n\t<span class=\"n\">description<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"Application exemple pour d\u00e9montrer l'impl\u00e9mentation des arbres\"<\/span>\r\n\t<span class=\"n\">auteur<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"Louis Marchand\"<\/span>\r\n\t<span class=\"n\">date<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"Mon, 28 Sep 2020 20:27:40 +0000\"<\/span>\r\n\t<span class=\"n\">revision<\/span><span class=\"p\">:<\/span> <span class=\"s\">\"0.1\"<\/span>\r\n\r\n<span class=\"kr\">class<\/span>\r\n\t<span class=\"nc\">APPLICATION<\/span>\r\n\r\n<span class=\"kr\">create<\/span>\r\n\t<span class=\"n\">make<\/span>\r\n\r\n<span class=\"kr\">feature<\/span> <span class=\"p\">{<\/span><span class=\"kr\">NONE<\/span><span class=\"p\">}<\/span> <span class=\"c1\">-- Initialization<\/span>\r\n\r\n\t<span class=\"n\">make<\/span>\r\n\t\t\t<span class=\"c1\">-- Ex\u00e9cute l'application<\/span>\r\n\t\t<span class=\"kr\">local<\/span>\r\n\t\t\t<span class=\"n\">l_arbre<\/span><span class=\"p\">:<\/span><span class=\"nc\">ARBRE<\/span>\r\n\t\t<span class=\"kr\">do<\/span>\r\n\t\t\t<span class=\"kr\">create<\/span> <span class=\"n\">l_arbre<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"mi\">4<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">l_arbre<\/span><span class=\"p\">.<\/span><span class=\"n\">ajouter_enfant<\/span> <span class=\"p\">(<\/span><span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">ARBRE<\/span><span class=\"p\">}.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">))<\/span>\r\n\t\t\t<span class=\"n\">l_arbre<\/span><span class=\"p\">.<\/span><span class=\"n\">ajouter_enfant<\/span> <span class=\"p\">(<\/span><span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">ARBRE<\/span><span class=\"p\">}.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"p\">))<\/span>\r\n\t\t\t<span class=\"n\">l_arbre<\/span><span class=\"p\">.<\/span><span class=\"n\">ajouter_enfant<\/span> <span class=\"p\">(<\/span><span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">ARBRE<\/span><span class=\"p\">}.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">))<\/span>\r\n\t\t\t<span class=\"n\">l_arbre<\/span><span class=\"p\">.<\/span><span class=\"n\">enfants<\/span><span class=\"o\">[<\/span><span class=\"mi\">1<\/span><span class=\"o\">]<\/span><span class=\"p\">.<\/span><span class=\"n\">ajouter_enfant<\/span> <span class=\"p\">(<\/span><span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">ARBRE<\/span><span class=\"p\">}.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"mi\">6<\/span><span class=\"p\">))<\/span>\r\n\t\t\t<span class=\"n\">l_arbre<\/span><span class=\"p\">.<\/span><span class=\"n\">enfants<\/span><span class=\"o\">[<\/span><span class=\"mi\">1<\/span><span class=\"o\">]<\/span><span class=\"p\">.<\/span><span class=\"n\">ajouter_enfant<\/span> <span class=\"p\">(<\/span><span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">ARBRE<\/span><span class=\"p\">}.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"mi\">9<\/span><span class=\"p\">))<\/span>\r\n\t\t\t<span class=\"n\">l_arbre<\/span><span class=\"p\">.<\/span><span class=\"n\">enfants<\/span><span class=\"o\">[<\/span><span class=\"mi\">3<\/span><span class=\"o\">]<\/span><span class=\"p\">.<\/span><span class=\"n\">ajouter_enfant<\/span> <span class=\"p\">(<\/span><span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">ARBRE<\/span><span class=\"p\">}.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">))<\/span>\r\n\t\t\t<span class=\"n\">l_arbre<\/span><span class=\"p\">.<\/span><span class=\"n\">enfants<\/span><span class=\"o\">[<\/span><span class=\"mi\">1<\/span><span class=\"o\">]<\/span><span class=\"p\">.<\/span><span class=\"n\">enfants<\/span><span class=\"o\">[<\/span><span class=\"mi\">2<\/span><span class=\"o\">]<\/span><span class=\"p\">.<\/span><span class=\"n\">ajouter_enfant<\/span> <span class=\"p\">(<\/span><span class=\"kr\">create<\/span> <span class=\"p\">{<\/span><span class=\"nc\">ARBRE<\/span><span class=\"p\">}.<\/span><span class=\"n\">make<\/span> <span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">))<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<h4>Parcours d&rsquo;un arbre<\/h4>\n<p>Il y a deux mani\u00e8res classiques de parcourir un arbre: le parcours en profondeur et le parcours en largeur. L&rsquo;utilisation d&rsquo;une ou l&rsquo;autre des techniques d\u00e9pends en grande partit de votre pr\u00e9f\u00e9rence ainsi que des contraintes du code dans lequel vous travaillez.<\/p>\n<h4>Parcours en profondeur<\/h4>\n<p>Le parcours en profondeur descend \u00e0 travers toutes les branches de l&rsquo;arbre, les unes \u00e0 la suite des autres de mani\u00e8re r\u00e9cursive. L&rsquo;algorithme se rend jusqu&rsquo;aux feuilles d&rsquo;une branche avant de se rendre \u00e0 la prochaine branche. Voici le d\u00e9placement qu&rsquo;effectue le parcours en profondeur. La ligne rouge repr\u00e9sente l&rsquo;ordre de traitement des noeuds.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10532\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/arbre_profondeur.png\" alt=\"\" width=\"350\" height=\"175\" \/><\/p>\n<p>Voici un exemple en Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Effectue une recherche de valeur dans un Arbre.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * @param aArbre L'arbre dans lequel chercher.<\/span>\r\n<span class=\"cm\"> * @param aValeur La valeur \u00e0 rechercher dans l'arbre.<\/span>\r\n<span class=\"cm\"> * @return true si la valeur est trouv\u00e9e dans l'arbre. false sinon.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">rechercheProfondeur<\/span><span class=\"p\">(<\/span><span class=\"n\">Arbre<\/span> <span class=\"n\">aArbre<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">aValeur<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kt\">boolean<\/span> <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"n\">Iterator<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Arbre<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lEnfantsIterator<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">aArbre<\/span><span class=\"p\">.<\/span><span class=\"na\">getValeur<\/span><span class=\"p\">()<\/span> <span class=\"o\">==<\/span> <span class=\"n\">aValeur<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">lEnfantsIterator<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aArbre<\/span><span class=\"p\">.<\/span><span class=\"na\">getEnfants<\/span><span class=\"p\">().<\/span><span class=\"na\">iterator<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"k\">while<\/span> <span class=\"p\">(<\/span><span class=\"n\">lEnfantsIterator<\/span><span class=\"p\">.<\/span><span class=\"na\">hasNext<\/span><span class=\"p\">()<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"o\">!<\/span><span class=\"n\">lResultat<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"n\">rechercheProfondeur<\/span><span class=\"p\">(<\/span><span class=\"n\">lEnfantsIterator<\/span><span class=\"p\">.<\/span><span class=\"na\">next<\/span><span class=\"p\">(),<\/span> <span class=\"n\">aValeur<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">lResultat<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<\/pre>\n<\/div>\n<p>Voici le m\u00eame exemple en Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">recherche_profondeur<\/span><span class=\"p\">(<\/span><span class=\"n\">a_arbre<\/span><span class=\"p\">:<\/span><span class=\"nc\">ARBRE<\/span><span class=\"p\">;<\/span> <span class=\"n\">a_valeur<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">):<\/span><span class=\"nc\">BOOLEAN<\/span>\r\n\t\t<span class=\"c1\">-- Retourne `True' si `a_arbre' contient `a_valeur'<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"kr\">if<\/span> <span class=\"n\">a_arbre<\/span><span class=\"p\">.<\/span><span class=\"n\">valeur<\/span> <span class=\"o\">=<\/span> <span class=\"n\">a_valeur<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t<span class=\"kc\">Result<\/span> <span class=\"o\">:=<\/span> <span class=\"kc\">True<\/span>\r\n\t\t<span class=\"kr\">else<\/span>\r\n\t\t\t<span class=\"kc\">Result<\/span> <span class=\"o\">:=<\/span> <span class=\"kr\">across<\/span> <span class=\"n\">a_arbre<\/span><span class=\"p\">.<\/span><span class=\"n\">enfants<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_enfants<\/span> <span class=\"kr\">some<\/span>\r\n\t\t\t\t\t\t\t<span class=\"n\">recherche_profondeur<\/span><span class=\"p\">(<\/span><span class=\"n\">la_enfants<\/span><span class=\"p\">.<\/span><span class=\"n\">item<\/span><span class=\"p\">,<\/span> <span class=\"n\">a_valeur<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t\t\t<span class=\"kr\">end<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n\r\n<\/pre>\n<\/div>\n<h4>Parcours en largeur<\/h4>\n<p>Le parcours en largeur traite les noeuds \u00e9tages par \u00e9gage. Il s&rsquo;agit d&rsquo;un algorithme qui n&rsquo;est pas r\u00e9cursif et qui n\u00e9cessite l&rsquo;utilisation d&rsquo;une file (\u00ab\u00a0queue\u00a0\u00bb). Voici le d\u00e9placement qu\u2019effectue le parcours en profondeur. La ligne rouge repr\u00e9sente l\u2019ordre de traitement des noeuds.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10538\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/arbre_largeur.png\" alt=\"\" width=\"350\" height=\"150\" \/><\/p>\n<p>Voici un exemple en Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Effectue une recherche de valeur dans un Arbre.<\/span>\r\n<span class=\"cm\"> *<\/span>\r\n<span class=\"cm\"> * @param aArbre L'arbre dans lequel chercher.<\/span>\r\n<span class=\"cm\"> * @param aValeur La valeur \u00e0 rechercher dans l'arbre.<\/span>\r\n<span class=\"cm\"> * @return true si la valeur est trouv\u00e9e dans l'arbre. false sinon.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">rechercheLargeur<\/span><span class=\"p\">(<\/span><span class=\"n\">Arbre<\/span> <span class=\"n\">aArbre<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">aValeur<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kt\">boolean<\/span> <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"n\">Arbre<\/span> <span class=\"n\">lArbre<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"n\">Queue<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Arbre<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lFile<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">LinkedList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Arbre<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"n\">lFile<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">aArbre<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"k\">while<\/span> <span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"n\">lFile<\/span><span class=\"p\">.<\/span><span class=\"na\">isEmpty<\/span><span class=\"p\">()<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"o\">!<\/span><span class=\"n\">lResultat<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">lArbre<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lFile<\/span><span class=\"p\">.<\/span><span class=\"na\">element<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"n\">lFile<\/span><span class=\"p\">.<\/span><span class=\"na\">remove<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">lArbre<\/span><span class=\"p\">.<\/span><span class=\"na\">getValeur<\/span><span class=\"p\">()<\/span> <span class=\"o\">==<\/span> <span class=\"n\">aValeur<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">lResultat<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"n\">lFile<\/span><span class=\"p\">.<\/span><span class=\"na\">addAll<\/span><span class=\"p\">(<\/span><span class=\"n\">lArbre<\/span><span class=\"p\">.<\/span><span class=\"na\">getEnfants<\/span><span class=\"p\">());<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">lResultat<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<\/pre>\n<\/div>\n<p>Voici le m\u00eame exemple en Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">recherche_largeur<\/span><span class=\"p\">(<\/span><span class=\"n\">a_arbre<\/span><span class=\"p\">:<\/span><span class=\"nc\">ARBRE<\/span><span class=\"p\">;<\/span> <span class=\"n\">a_valeur<\/span><span class=\"p\">:<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">):<\/span><span class=\"nc\">BOOLEAN<\/span>\r\n\t\t<span class=\"c1\">-- Retourne `True' si `a_arbre' contient `a_valeur'<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_file<\/span><span class=\"p\">:<\/span><span class=\"nc\">LINKED_QUEUE<\/span><span class=\"o\">[<\/span><span class=\"nc\">ARBRE<\/span><span class=\"o\">]<\/span>\r\n\t\t<span class=\"n\">l_arbre<\/span><span class=\"p\">:<\/span><span class=\"nc\">ARBRE<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"kr\">create<\/span> <span class=\"n\">l_file<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span>\r\n\t\t<span class=\"kr\">from<\/span>\r\n\t\t\t<span class=\"n\">l_file<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_arbre<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"kc\">Result<\/span> <span class=\"o\">:=<\/span> <span class=\"kc\">False<\/span>\r\n\t\t<span class=\"kr\">until<\/span>\r\n\t\t\t<span class=\"n\">l_file<\/span><span class=\"p\">.<\/span><span class=\"n\">is_empty<\/span> <span class=\"ow\">or<\/span> <span class=\"kc\">Result<\/span>\r\n\t\t<span class=\"kr\">loop<\/span>\r\n\t\t\t<span class=\"n\">l_arbre<\/span> <span class=\"o\">:=<\/span> <span class=\"n\">l_file<\/span><span class=\"p\">.<\/span><span class=\"n\">item<\/span>\r\n\t\t\t<span class=\"n\">l_file<\/span><span class=\"p\">.<\/span><span class=\"n\">remove<\/span>\r\n\t\t\t<span class=\"kr\">if<\/span> <span class=\"n\">l_arbre<\/span><span class=\"p\">.<\/span><span class=\"n\">valeur<\/span> <span class=\"o\">=<\/span> <span class=\"n\">a_valeur<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t\t<span class=\"kc\">Result<\/span> <span class=\"o\">:=<\/span> <span class=\"kc\">True<\/span>\r\n\t\t\t<span class=\"kr\">else<\/span>\r\n\t\t\t\t<span class=\"n\">l_file<\/span><span class=\"p\">.<\/span><span class=\"n\">append<\/span> <span class=\"p\">(<\/span><span class=\"n\">l_arbre<\/span><span class=\"p\">.<\/span><span class=\"n\">enfants<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"kr\">end<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<h3>Les tables de hachage<\/h3>\n<p>Une table est une structure indexable, mais contrairement aux listes, l&rsquo;index (ici appel\u00e9 <strong>cl\u00e9<\/strong>) peut \u00eatre n&rsquo;importe quelle valeur ou type.<\/p>\n<p>Par exemple, voir le code Java suivant:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kt\">int<\/span><span class=\"o\">[]<\/span> <span class=\"n\">tableau<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"kt\">int<\/span><span class=\"o\">[<\/span><span class=\"mi\">10<\/span><span class=\"o\">]<\/span><span class=\"p\">;<\/span>\r\n<span class=\"n\">tableau<\/span><span class=\"o\">[<\/span><span class=\"mi\">0<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span>         <span class=\"c1\">\/\/ OK<\/span>\r\n<span class=\"n\">tableau<\/span><span class=\"o\">[<\/span><span class=\"mi\">9<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">9<\/span><span class=\"p\">;<\/span>         <span class=\"c1\">\/\/ OK<\/span>\r\n<span class=\"n\">tableau<\/span><span class=\"o\">[<\/span><span class=\"mi\">10<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">10<\/span><span class=\"p\">;<\/span>       <span class=\"c1\">\/\/ Erreur<\/span>\r\n<span class=\"n\">tableau<\/span><span class=\"o\">[<\/span><span class=\"mi\">19283<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">19283<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ Erreur<\/span>\r\n<\/pre>\n<\/div>\n<p>L&rsquo;objectif d&rsquo;une table de hachage est de pouvoir utiliser un code comme ceci:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">tableau<\/span><span class=\"o\">[<\/span><span class=\"mi\">0<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span>         <span class=\"c1\">\/\/ OK<\/span>\r\n<span class=\"n\">tableau<\/span><span class=\"o\">[<\/span><span class=\"mi\">9<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">9<\/span><span class=\"p\">;<\/span>         <span class=\"c1\">\/\/ OK<\/span>\r\n<span class=\"n\">tableau<\/span><span class=\"o\">[<\/span><span class=\"mi\">10<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">10<\/span><span class=\"p\">;<\/span>       <span class=\"c1\">\/\/ OK<\/span>\r\n<span class=\"n\">tableau<\/span><span class=\"o\">[<\/span><span class=\"mi\">19283<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">19283<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ OK<\/span>\r\n<\/pre>\n<\/div>\n<p>Ou m\u00eame ceci:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">tableau<\/span><span class=\"o\">[<\/span><span class=\"mi\">0<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span>             <span class=\"c1\">\/\/ OK<\/span>\r\n<span class=\"n\">tableau<\/span><span class=\"o\">[<\/span><span class=\"mi\">9<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">9<\/span><span class=\"p\">;<\/span>             <span class=\"c1\">\/\/ OK<\/span>\r\n<span class=\"n\">tableau<\/span><span class=\"o\">[<\/span><span class=\"mi\">10<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">10<\/span><span class=\"p\">;<\/span>           <span class=\"c1\">\/\/ OK<\/span>\r\n<span class=\"n\">tableau<\/span><span class=\"o\">[<\/span><span class=\"s\">\"Bonjour\"<\/span><span class=\"o\">]<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">19283<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ OK<\/span>\r\n<\/pre>\n<\/div>\n<h4>La fonction de hachage<\/h4>\n<p>Afin de pouvoir fonctionner, une table de hachage transf\u00e8re une valeur quelconque (potentiellement infini et de type quelconque) vers un r\u00e9sultat fini et born\u00e9 (avec une borne inf\u00e9rieure et sup\u00e9rieure).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10548\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/fonction_hachage.png\" alt=\"\" width=\"1048\" height=\"282\" \/><\/p>\n<p>Par exemple, nous pourrions utiliser le restant de la division enti\u00e8re (modulo) comme fonction de hachage.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10549\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/fonction_hachage_modulo.png\" alt=\"\" width=\"1028\" height=\"433\" \/><\/p>\n<p>De cette mani\u00e8re, nous pourrions remplacer n&rsquo;importe quelle cl\u00e9 enti\u00e8re en index entre 0 et 9.<\/p>\n<p>Pour r\u00e9ussir \u00e0 utiliser comme cl\u00e9 des objets de type autre qu&rsquo;entier, il faut trouver une mani\u00e8re de transformer cet objet en nombre entier. Par exemple, pour une cha\u00eene de caract\u00e8re, on pourrait utiliser le code (ASCII, Unicode, etc.) de chaque caract\u00e8re afin de trouver un nombre entier qui repr\u00e9sente la cha\u00eene.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10550\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/fonction_hachage_chaine.png\" alt=\"\" width=\"1077\" height=\"489\" \/><\/p>\n<h4>Structure d&rsquo;une table de hachage<\/h4>\n<p>Une fois qu&rsquo;on a la fonction de hachage, la table utilise un tableau de taille \u00e9quivalent \u00e0 l&rsquo;image (dans le sens <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Image_(math%C3%A9matiques)\">math\u00e9matique<\/a>) de la fonction de hachage (par exemple, pour la fonction de hachage \u00ab\u00a0modulo 10\u00a0\u00bb, nous aurons un tableau de taille 10).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10553\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/structure_table_hachage_sans_conflit.png\" alt=\"\" width=\"438\" height=\"417\" \/><\/p>\n<p>Le probl\u00e8me ici, c&rsquo;est qu&rsquo;il est possible que la fonction de hachage donne le m\u00eame r\u00e9sultat pour deux valeurs d&rsquo;entr\u00e9es diff\u00e9rentes. Dans ce cas, nous avons un conflit puisque deux cl\u00e9s g\u00e9n\u00e8rent le m\u00eame index. Par exemple:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10554\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/fonction_hachage_conflit.png\" alt=\"\" width=\"958\" height=\"354\" \/><\/p>\n<p>Pour g\u00e9rer ces conflits, au lieu de placer directement le r\u00e9sultat dans le tableau, le tableau contiendra une liste li\u00e9e dans chacune de ses cellules pour y stocker l&rsquo;information.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10555\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/09\/structure_table_hachage.png\" alt=\"\" width=\"742\" height=\"417\" \/><\/p>\n<h4>Taille du tableau<\/h4>\n<p>Dans la plupart des langages, le constructeur de la table de hachage prend en argument la taille du tableau \u00e0 utiliser. Cette valeur est tr\u00e8s importante, car elle permet d&rsquo;optimisation l&rsquo;utilisation de la table de hachage.<\/p>\n<p>En effet, si nous prenons une taille trop grande, la table peut trouver l&rsquo;\u00e9l\u00e9ment associ\u00e9 \u00e0 une cl\u00e9 en temps constant (complexit\u00e9 O(1)), mais de l&rsquo;espace m\u00e9moire est gaspill\u00e9. Inversement, si nous prenons une taille trop petite, la table ne gaspille pas d&rsquo;espace m\u00e9moire, mais a la m\u00eame performance qu&rsquo;une liste li\u00e9e (dans le pire cas, on a une complexit\u00e9 de O(n)).<\/p>\n<p>Afin de trouver la meilleure taille de tableau, il est n\u00e9cessaire d&rsquo;approximer le nombre d&rsquo;\u00e9l\u00e9ments qui sera plac\u00e9 dans la table lors de l&rsquo;ex\u00e9cution du programme. Ce que nous cherchons, c&rsquo;est l&rsquo;ordre de grandeur. Par exemple, si nous r\u00e9servons 1000 espaces dans le tableau et que le programme place 10 \u00e9l\u00e9ments dans la table, la taille est mal choisie, car 10 et 1000 ne sont pas dans le m\u00eame ordre de grandeur. Par contre, si on r\u00e9serve 1000 espaces dans le tableau et que le programme place 2000 \u00e9l\u00e9ments dans la table, la taille est bien choisie, car 1000 et 2000 sont dans le m\u00eame ordre de grandeur.<\/p>\n<p>Il est toute foi \u00e0 noter que, peu importe le nombre d&rsquo;espaces de tableau r\u00e9serv\u00e9s lors de la cr\u00e9ation de la table et peu importe le nombre d&rsquo;\u00e9l\u00e9ments que le programme placera dans la table, la structure fonctionnera quand m\u00eame. Une bonne valeur de taille de tableau est une optimisation; rien de plus.<\/p>\n<h4>Impl\u00e9mentation<\/h4>\n<p>La documentation Java de la classe \u00ab\u00a0Hashtable\u00a0\u00bb est <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/Hashtable.html\" target=\"_blank\" rel=\"noopener\">ici<\/a>.<\/p>\n<p>La documentation Eiffel de la classe \u00ab\u00a0TABLE\u00a0\u00bb est <a href=\"https:\/\/www.eiffel.org\/files\/doc\/static\/22.05\/libraries\/base\/hash_table_chart.html\" target=\"_blank\" rel=\"noopener\">ici<\/a>.<\/p>\n<p>Voici un exemple d&rsquo;utilisation d&rsquo;une table de hachage en Java:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"cm\">\/**<\/span>\r\n<span class=\"cm\"> * Ex\u00e9cution de l'exemple.<\/span>\r\n<span class=\"cm\"> *\/<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">execute<\/span><span class=\"o\">(){<\/span>\r\n    <span class=\"n\">Hashtable<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">,<\/span> <span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lTable<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Hashtable<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">,<\/span> <span class=\"n\">Integer<\/span><span class=\"o\">&gt;(<\/span><span class=\"mi\">10<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">lTable<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Un\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">Integer<\/span><span class=\"o\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"o\">(<\/span><span class=\"mi\">1<\/span><span class=\"o\">));<\/span>\r\n    <span class=\"n\">lTable<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Deux\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">Integer<\/span><span class=\"o\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"o\">(<\/span><span class=\"mi\">2<\/span><span class=\"o\">));<\/span>\r\n    <span class=\"n\">lTable<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Trois\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">Integer<\/span><span class=\"o\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"o\">(<\/span><span class=\"mi\">3<\/span><span class=\"o\">));<\/span>\r\n    <span class=\"n\">lTable<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Quatre\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">Integer<\/span><span class=\"o\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"o\">(<\/span><span class=\"mi\">4<\/span><span class=\"o\">));<\/span>\r\n    <span class=\"n\">lTable<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Cinq\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">Integer<\/span><span class=\"o\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"o\">(<\/span><span class=\"mi\">5<\/span><span class=\"o\">));<\/span>\r\n    <span class=\"n\">lTable<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Six\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">Integer<\/span><span class=\"o\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"o\">(<\/span><span class=\"mi\">6<\/span><span class=\"o\">));<\/span>\r\n    <span class=\"n\">lTable<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Sept\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">Integer<\/span><span class=\"o\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"o\">(<\/span><span class=\"mi\">7<\/span><span class=\"o\">));<\/span>\r\n    <span class=\"n\">lTable<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Huit\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">Integer<\/span><span class=\"o\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"o\">(<\/span><span class=\"mi\">8<\/span><span class=\"o\">));<\/span>\r\n    <span class=\"n\">lTable<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Neuf\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">Integer<\/span><span class=\"o\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"o\">(<\/span><span class=\"mi\">9<\/span><span class=\"o\">));<\/span>\r\n    <span class=\"n\">lTable<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Dix\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">Integer<\/span><span class=\"o\">.<\/span><span class=\"na\">valueOf<\/span><span class=\"o\">(<\/span><span class=\"mi\">10<\/span><span class=\"o\">));<\/span>\r\n    <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Valeur de Un: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lTable<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Un\"<\/span><span class=\"o\">).<\/span><span class=\"na\">toString<\/span><span class=\"o\">());<\/span>\r\n    <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Valeur de Deux: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lTable<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Deux\"<\/span><span class=\"o\">).<\/span><span class=\"na\">toString<\/span><span class=\"o\">());<\/span>\r\n    <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Valeur de Trois: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lTable<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Trois\"<\/span><span class=\"o\">).<\/span><span class=\"na\">toString<\/span><span class=\"o\">());<\/span>\r\n    <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Valeur de Quatre: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lTable<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Quatre\"<\/span><span class=\"o\">).<\/span><span class=\"na\">toString<\/span><span class=\"o\">());<\/span>\r\n    <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Valeur de Cinq: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lTable<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Cinq\"<\/span><span class=\"o\">).<\/span><span class=\"na\">toString<\/span><span class=\"o\">());<\/span>\r\n    <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Valeur de Six: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lTable<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Six\"<\/span><span class=\"o\">).<\/span><span class=\"na\">toString<\/span><span class=\"o\">());<\/span>\r\n    <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Valeur de Sept: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lTable<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Sept\"<\/span><span class=\"o\">).<\/span><span class=\"na\">toString<\/span><span class=\"o\">());<\/span>\r\n    <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Valeur de Huit: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lTable<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Huit\"<\/span><span class=\"o\">).<\/span><span class=\"na\">toString<\/span><span class=\"o\">());<\/span>\r\n    <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Valeur de Neuf: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lTable<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Neuf\"<\/span><span class=\"o\">).<\/span><span class=\"na\">toString<\/span><span class=\"o\">());<\/span>\r\n    <span class=\"n\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Valeur de Dix: \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">lTable<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Dix\"<\/span><span class=\"o\">).<\/span><span class=\"na\">toString<\/span><span class=\"o\">());<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Voici un exemple d&rsquo;utilisation d&rsquo;une table de hachage en Eiffel:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"n\">make<\/span>\r\n\t\t<span class=\"c1\">-- Ex\u00e9cute l'exemple<\/span>\r\n\t<span class=\"kr\">local<\/span>\r\n\t\t<span class=\"n\">l_table<\/span><span class=\"p\">:<\/span><span class=\"nc\">HASH_TABLE<\/span><span class=\"o\">[<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">,<\/span> <span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"kr\">create<\/span> <span class=\"n\">l_table<\/span><span class=\"p\">.<\/span><span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_table<\/span><span class=\"p\">.<\/span><span class=\"n\">put<\/span> <span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Un\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_table<\/span><span class=\"p\">.<\/span><span class=\"n\">put<\/span> <span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Deux\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_table<\/span><span class=\"p\">.<\/span><span class=\"n\">put<\/span> <span class=\"p\">(<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Trois\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_table<\/span><span class=\"p\">.<\/span><span class=\"n\">put<\/span> <span class=\"p\">(<\/span><span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Quatre\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_table<\/span><span class=\"p\">.<\/span><span class=\"n\">put<\/span> <span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Cinq\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_table<\/span><span class=\"p\">.<\/span><span class=\"n\">put<\/span> <span class=\"p\">(<\/span><span class=\"mi\">6<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Six\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_table<\/span><span class=\"p\">.<\/span><span class=\"n\">put<\/span> <span class=\"p\">(<\/span><span class=\"mi\">7<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Sept\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_table<\/span><span class=\"p\">.<\/span><span class=\"n\">put<\/span> <span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Huit\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_table<\/span><span class=\"p\">.<\/span><span class=\"n\">put<\/span> <span class=\"p\">(<\/span><span class=\"mi\">9<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Neuf\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">l_table<\/span><span class=\"p\">.<\/span><span class=\"n\">put<\/span> <span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Dix\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">afficher_element_table<\/span><span class=\"p\">(<\/span><span class=\"n\">l_table<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Un\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">afficher_element_table<\/span><span class=\"p\">(<\/span><span class=\"n\">l_table<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Deux\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">afficher_element_table<\/span><span class=\"p\">(<\/span><span class=\"n\">l_table<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Trois\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">afficher_element_table<\/span><span class=\"p\">(<\/span><span class=\"n\">l_table<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Quatre\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">afficher_element_table<\/span><span class=\"p\">(<\/span><span class=\"n\">l_table<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Cinq\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">afficher_element_table<\/span><span class=\"p\">(<\/span><span class=\"n\">l_table<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Six\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">afficher_element_table<\/span><span class=\"p\">(<\/span><span class=\"n\">l_table<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Sept\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">afficher_element_table<\/span><span class=\"p\">(<\/span><span class=\"n\">l_table<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Huit\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">afficher_element_table<\/span><span class=\"p\">(<\/span><span class=\"n\">l_table<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Neuf\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"n\">afficher_element_table<\/span><span class=\"p\">(<\/span><span class=\"n\">l_table<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Dix\"<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n\r\n<span class=\"n\">afficher_element_table<\/span><span class=\"p\">(<\/span><span class=\"n\">a_table<\/span><span class=\"p\">:<\/span><span class=\"nc\">HASH_TABLE<\/span><span class=\"o\">[<\/span><span class=\"nc\">INTEGER<\/span><span class=\"p\">,<\/span> <span class=\"nc\">STRING<\/span><span class=\"o\">]<\/span><span class=\"p\">;<\/span> <span class=\"n\">a_cle<\/span><span class=\"p\">:<\/span><span class=\"nc\">STRING<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"c1\">-- Afficher l'\u00e9l\u00e9ment index\u00e9 par `a_cle' dans la table `a_table'<\/span>\r\n\t\t<span class=\"c1\">-- si ce dernier existe.<\/span>\r\n\t<span class=\"kr\">do<\/span>\r\n\t\t<span class=\"kr\">if<\/span> <span class=\"kr\">attached<\/span> <span class=\"n\">a_table<\/span><span class=\"p\">.<\/span><span class=\"n\">at<\/span> <span class=\"p\">(<\/span><span class=\"n\">a_cle<\/span><span class=\"p\">)<\/span> <span class=\"kr\">as<\/span> <span class=\"n\">la_element<\/span> <span class=\"kr\">then<\/span>\r\n\t\t\t<span class=\"n\">print<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Valeur de \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">a_cle<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\": \"<\/span> <span class=\"o\">+<\/span> <span class=\"n\">la_element<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"s\">\"%N\"<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"kr\">end<\/span>\r\n\t<span class=\"kr\">end<\/span>\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.louismarchand.me\/index.php\/les-cours\/programmation-orientee-objet-2\/\">Retour<\/a><\/p>\n<hr \/>\n<p>Auteur: Louis Marchand<br \/>\n<a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/deed.fr\" target=\"_blank\" rel=\"license noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/i.creativecommons.org\/l\/by\/4.0\/80x15.png\" alt=\"Creative Commons License\" \/><\/a><br \/>\nSauf pour les sections sp\u00e9cifi\u00e9es autrement, ce travail est sous licence <a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/deed.fr\" target=\"_blank\" rel=\"license noopener noreferrer\">Creative Commons Attribution 4.0 International<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Les structures de donn\u00e9es permettent de stocker des donn\u00e9es en m\u00e9moire de mani\u00e8re structur\u00e9e et organis\u00e9e ou bien d&rsquo;avoir acc\u00e8s \u00e0 des donn\u00e9es . L&rsquo;important dans le choix d&rsquo;une structure de donn\u00e9es, c&rsquo;est de s&rsquo;assurer d&rsquo;avoir les fonctionnalit\u00e9s n\u00e9cessaires, de mani\u00e8re efficace, mais sans laisser trop de libert\u00e9. En effet, plus on donne d&rsquo;acc\u00e8s&hellip; <a class=\"more-link\" href=\"https:\/\/www.louismarchand.me\/index.php\/objet2-les-structures-de-donnees\/\">Continue reading <span class=\"screen-reader-text\">Les structures de donn\u00e9es<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-341","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/341","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/comments?post=341"}],"version-history":[{"count":19,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/341\/revisions"}],"predecessor-version":[{"id":697,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/341\/revisions\/697"}],"wp:attachment":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/media?parent=341"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}