Aller au contenu

File avec une liste chainée circulaire⚓︎

On veut écrire une classe pour gérer une file à l'aide d'une liste chainée circulaire. On dispose d'une classe Maillon permettant la création d'un maillon de la chaine, celui-ci étant constitué d'une donnée valeur et d'une référence au maillon suivant de la chaine:

🐍 Script Python
class Maillon:
    def __init__(self, valeur, suivant):
        self.valeur = valeur
        self.suivant = suivant

Une liste chainée est une succession de maillons. On accède à la liste par le premier maillon. Chaque maillon permet d'accéder au maillon suivant.

représentation d'une liste chainée

L'accès direct au premier maillon permet de supprimer ce premier maillon ou d'ajouter un nouveau maillon qui devient le nouveau premier maillon, de manière efficace. Ceci est parfait pour implémenter une pile pour laquelle la suppresion et l'ajout d'un élément s'effectuent du même côté.

Pour implémenter une file, il est nécessaire de pouvoir accéder de manière efficace au premier maillon et au dernier maillon. Une solution est donc d'avoir deux accès à la liste.

représentation d'une file

Cette représentation est proposée dans l'exercice File à partir d'une liste chainée.

Une autre solution est d'utiliser une liste chainée circulaire obtenue à partie d'une liste chainee en ajoutant un lien entre le dernier maillon et le premier maillon.

représentation d'une liste circulaire

Le premier maillon de la liste auquel on accède est celui représentant le dernier élément entré dans la file. Ce maillon permet d'accéder directement au maillon contenant le premier élément entré dans la file. Par exemple, on suppose avoir enfilé dans l'ordre les éléments 1, 2, 3. On accède à la liste par le maillon contenant l'élément 3, qui permet d'accéder directement au maillon contenant l'élément 1:

une file

Pour enfiler un élément, si la file est vide il suffit de créer un maillon contenant l'élément et un lien vers lui-même.

Sinon, on crée un nouveau maillon avec un lien vers le maillon contenant le premier élément enfilé. Par exemple, pour enfiler l'élément 4 dans la file représentée précedemment, on crée un maillon contenant l'élement 4 avec un lien vers le maillon contenant l'élément 1:

défilement d'un élément

On modifie le lien du maillon par lequel on accède à la liste, celui contenant l'élément 3:

défilement d'un élément

On modifie le lien permettant d'accéder à un maillon de la liste afin d'accéder directement au maillon contenant le dernier élément enfilé.

défilement d'un élément

On obtient bien la liste souhaitée.

défilement d'un élément

On suppose avoir enfilé dans l'ordre les éléments 1, 2, 3, 4 comme dans la file précédente. Pour défiler un élément, on récupère l'élément stocké dans le premier maillon entré dans la file (1), qui est le maillon suivant celui par lequel on accède à la liste. On modifie ensuite le lien qui ne pointe plus vers le maillon à retirer mais pointe vers le maillon suivant.

défilement d'un élément

Compléter la classe File et vérifier votre travail sur les exemples. On vous donne la méthode __init__ qui initialise une file, la méthode __repr__ qui permet un affichage des éléments de la file, la méthode est_vide qui renvoie True si la file est vide et False sinon.

Exemples
>>> f = File()  # une file vide
>>> f.est_vide()
True
>>> f.enfile(1)
>>> print(f)
1 -> 1
>>> f.enfile(2)
>>> print(f)
2 -> 1 -> 2
>>> f.enfile(3)
>>> print(f)
3 -> 1 -> 2 -> 3
>>> f.defile()
1
>>> print(f)
3 -> 2 -> 3
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10
.128013beqn,4é9vèi+à3mo5_t;PhkMjlpwN!f(: cg.a=ry0FDS6-u/72)s18d050(0c0t0M0l0A0#0I0J0A0M0#0#0N010t0l0B010406050#0W0p0p0M0O0P040T0q0A0W0|0q0e050X13151719110B04051p1i1s0X1p110(0l0j0;0?0^0`0w0l0K0w0A1G0w0t0 050,0b0A0c1B0@0_011F1H1J1H0t1P1R1N0t0O1q0t0w0;1c0#0B0M0e0`0Z011T1D010F0.0c0e0M0p0c1N1:1=1`1V1}1R20220 0a0I0v0O0q0B0q0#0l1f0e0I0*1.0O0O0c0J2n1i250e1q0X1,2A1)1+1*1O0(270`1J0e1 2k1N1y1A0=1U2K0l2M0e0q2Q1N0B2t1q2y2A2(121;2o2S1{2X0O160A0 0I0$2x2,102+262.1V2:2=2@0Z2`1=2|2y2J01310M2?040I0o352z11382 0`3b3d0I0g3h372,393n2@0r3r3j3t3l3a0q2;3c2@0U3y2}2-1C303D323e0Y3I3k3L3m3N3F3e0%3R3A3T3C3E3o0i3Z2~3#3v040$0Q3*3K2T3$3O0$2_1j2{3z3+3?3-0$343{363}3=2/3V3d0$3g433i3J3u480 0$3q4c3s3~473%4h3x4k454f4o3.3H4r4e3B403Q4x3S3 4g3.3Y4C3!4E4u0$3)4I4m3M4u0Z3:4O464Q3O0Z3`2(4s4z4F0Z424!4y3,4%4b4*4D4n4X4j4/4J4;3W0Z4q4@4P3U4R4w4}4V4 4X4B524t4X4H574$4R4N5b4,4u0o4T5f4K3O0o4Z3|4+5l3W0o4)5p4:4W5s4.5v4^5x3d0o4?5A4~3@5s4|5G535I5D515L585s565Q5c5m5a5U5g5m5e5Y5r3d0g5j5$4_5(5o445q5,0 0g5u5/5w543W0g5z5^5B5`5(5F5~5H3-0g5K635M655P685R5(5T6c5V5{5X361t2$1i2Q2D0(1+2I3B0J2Y231q6o1r6m2*4k056u0*2%5 010x0 2 3r5:1V0C2@6M5_3a0J0 0y0-0A0A1g6R6H0~040H3y0I6+0I6N0`6J040*0F6#5H6P3e6@5M0F0p0 0s0s2V2m706{396%0G753B0b6%0#0c0A6?6C6S6%0f3r6-6S0e0 0j3c0c0W0O793#7j7l6.3a0 131z1=0t7v3?0q0 0N7G1{0x6U040D1g0c7L1V6%0!6)4r6,7Z7m6H7b7B7e7g2*6S7I040L7T3m7p7r7t7y7,7J7^6H7o047q1R7@7Y7!6+7z7%047d7f7:017-7/7h7|7B0W7D0e7F4k7#5H7-7K8l7z7}7C7q8j3y067Z7z6:6=8a6_6-8e5H6}6 0s0#1)748F5M778a86887*2{7z7V7X4!83846S6:2t0t7t1h8q7n0b7B1)8a8P8N398R7)8a8c8a7}7 7s7u8=3B7V8w8z6K3L8C6Q903,7O0R1~8:0 8X3|8y8#0 8B993?8D8a8H0470720t8M7+6$0 789m1{8@899A7U0 7k8+8f042#0c0p0l0c8 9w8n7`9E6/7O7Q2M9e047W3;398D8Z8a0#0(0 020d0W0q0t0u9.9:9=9@9;0u0I9L9N9P0I0c8K0I1R9}2t9 0O0I160.6Z2o1;a91R9/7e0I1g0I0M0J0J0k2q0na40Ma40l8K7S4U399+2@8Z7Z0J0l0O0J0W0?aG0c8d5k1{aB3eaD6,0S1=0:a50J0@2p02030o0i0u0W2M0I290c0f0;a#a%0ua20ta41S0*0O0e9Oa9ab6Yal0M0z0q1e0h0Ias0?a,9daz3BaQaD9`9_9/9{bh0u6*9)6S9C8T6k7_7.8{0 9~a~7{9S048p2(8m69bwa7by4r8x6,946;0cbr2z7z9o9U3a0F0 a@0s0j0l0*9Z9z9R5Mbq9Z9#8283bM8%8)bzb)7c8^bT8`bT7}bx9Pb=390q6_awb 3B7N0 9Xay4!bK8!6H8AbO976`bT9q708K0O9v8U7i9y8Qb@9Db(760 b,8Ybocd0 0lbP6`bpcscD7zb`cu4zbW8KbYb!c9co9x040Gcx9haScc5H8$0+b;9I5H0#1^04blc8blbnb.7n0 b0adc43#8oc^3?b*b_0 aNcR64bG9MbIcyc:9J0M0F1}0J0wcQ36bEc09TbD8r8-878/bT8;cK3,c=6Xc@docwc{1{7-0mdx1V0#0$9-a$a(0I0V020K9=0Ia;a(c/7!bM0C1F1RdB7;04c?6!c~bub{8g8i8kdjbt0EbC2{dg7acG8_c bv9KbHb~dv6(dQaD8r0 d9dbdddW8bdid/e004e20ldcde2zd:c_0 dAc%69dlclb$d^dZ8*dq7Hd@d%878h8ud*d18Odwekdh04ejd+6HdDdFa=dIdKdMdObmb-aSe9eqe5c`eDcLdYdtd!esdyeue$30d(eyd~bLc;eadaece4eXehbBe57}ebedeVeie`emdne)0`dpeA3udsace#f63BcJfbdrewd)b+e-cY5Mc!8(a|e`e1e;e}bJ9icAbNcH6SbSf3bUbW0ea-eobTc}fA7xe@3 bW0AezbscScV44d 9j04cCe5fHfeetd$fA7}bXbZb#d|cU9gfScXegc|d=d#d0fPd2d_d4d{eHbAd.dfe96Wf9erfZ1{f5f^bF047efObQcp9!fjdRcF7(ctg51Vfdg8f7f`a8d?f#gldX8t7Ee~e_fK9Bf=fAgngd9Jb}9QcWd7cZfM7d9Zf-3if/f:2/f8b1g4g0btf efg1e!gWgF5Hg7g(g9gb9Z9Hf}b?gjfx6HgE6Gf_gHgsf@g+gpgw8vd|0!ggfu5HfYgofce(gu7Agqd5hbg^e9h0gccEg@e7gX9JeUeRfT7$gChfhah8ffg{gAgmhmg!e/hpcah5fl9kcfbTfzhbfDhIfEf+crg=b+gP10hrgLfVcDgSgm6_2Xhjh!0`h7g~h9gthwfLgacNf)eeg_eBcTfRgQf/e9gH0shEe8gYfXhth/e%h.h,hxd`gIf.cXe97e9M1 h(cIhBhkg`ibi0g$g|d^hiirev8}81d6eSfUfWhzdXh i1hnf~gZimg9iEiqf?isexgxd|hUcbgRh)01h+h^eEg}iYeYhyg:eEiIiVc67P7Rh4e.fv7egNiRi/gKiKioiFi9f!i!hhiPh1i(h-i*h~i{iMgDhvi}gTfge,iNevithqczhXb:foiChcig22j25p0X6E0c2A9L2A6y2B6q1i2EjC0M1Qjv6n1z2|0X0*0,0.0#04.