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
.1280135tf4)+2rFj3,sa-o! iug0è8àm1P6pNnMl7h.e=céy:v9D(wq;S/b_dk050%0M0c0o0t0I0n0s0O0I0o0n0n0N010c0t0E010406050n0u0A0A0o0i0Q040Z0q0I0u0|0q0G050!13151719110E041i1p051s0!1s1u1p110%0t0S0;0?0^0`0K0t0v0K0I1I0K0c0 050,0#0I0M1D0@0_011H1J1L1J0c1R1T1P0c0#0q0%191Q0i1q0c0K0;1c0n0E0o0G0`0h011V1F010d0.0M0G0o0A0M1P1`1|211X241T27290 0a0s0C0i0q0E0q0n0t1f0G0s0*1^0i0i0M0O2u1i2c0G1q0!1?2H0c1;1:1=0%2e0`1L0G262r1P1A1C0=1W2R0t2T0G1-1B1P0E2A1q2F2H2/121{2v2Z222(0i160I0 0s0B2E2?102=2d2^1X2`2|2~0h311|332F2Q01380o2}040s0l3c2G113f360`3i3k0s0e3o3e2?3g3u2~0b3y3q3A3s3h0q2{3j2~0D3F342@1E373K393l0J3P3r3S3t3U3M3l0y3Y3H3!3J3L3v0T3*353,3C040B0w3;3R2!3-3V0B301j323G3=3}3@0B3b423d443|2_3$3k0B3n4a3p3Q3B4f0 0B3x4j3z454e3.4o3E4r4c4m4v3^3O4y4l3I473X4E3Z464n3^3)4J3+4L4B0B3:4P4t3T4B0h3`4V4d4X3V0h412/4z4G4M0h494+4F3?4.4i4;4K4u4(4q4_4Q4{3%0h4x4~4W3#4Y4D544$564(4I594A4(4O5e4-4Y4U5i4?4B0l4!5m4R3V0l4*434=5s3%0l4:5w4`4%5z4^5C4 5E3k0l4}5H553~5z535N5a5P5K585S5f5z5d5X5j5t5h5#5n5t5l5)5y3k0e5q5-505/5v4b5x5?0 0e5B5_5D5b3%0e5G5 5I615/5M655O3@0e5R6a5T6c5W6f5Y5/5!6j5$625(3d1r2-1i2X2K0%2O3g0O1-2a1q6v1t6t2;4r056A0*2.66010(0 363y5`1X0W2~6S603h0O0 0H0-0I0I1g6X6N0~040R3F0s6;0s6T0`6P040*0d6+5O6V3l6}5T0d0A0 0$0$2$2t76713g6-0V7b3I0#6-0n0M0I6|6I6Y6-0m3y6?6Y0G0 0S3j0M0u0i7f3,7p7r6@3h0 131B1|0c7B3}0q0 0N7M220(6!040F1g0M7R1X6-0f6/4y6=7)7s6N7h7H7k7m2;6Y7O040L7Z3t7v7x7z7E7=7P7~6N7u047w1T7}7(7*6;7F7-047j7l7_017?7^7n827H0u7J0G7L4r7+5O7?7Q8r7F837I7w8p3F067)7F6_6{8g6 6?8k5O73750$0n2L7a8L5T7d8g8c8e7:327F7#7%4+898a6Y6_2A0c7z1h8w7t0#7H2L8g8V8T3g8X7/8g8i8g83857y7A8{3I7#8C8F6Q3S8I6W963?7U0j258_0 8%438E8+0 8H9f3}8J8g8N0476780c8S7;6,0 7e9s228}8f9G7!0 7q8;8l042,0M0A0t0M959C8t809K6^7U7W2T9k047$3{3g8J8)8g0n0%0 019@0s9R9T9V0s0M8Q0s1T9_2A9{0i0s160.6)2v1{a51T0X0u7k0s1g0s0o0O0O0x2x0za00oa00t8Q7Y4#3g9;2~8)7)0O0t0i0O0u0?aD0M8j5r22ay3laA6=0U1|0:a10O0@2w000u2T0s2g0M0m0;009~0ca01U0*0i0G9Ua5a76(ai0o0k0q1e0P0sap0?a#9jaw3IaNaA9@016:9/6Y9I8Z6r7 7@910 9`a=819Y048v2/8s6gbja3bl4y8D6=9a6`0Mbe2G7F9u9!3h0d0 a+0$0S0t0*9)9F9X5Tbd9)9+8889bz8-8/bmbS7i8~bG90bG83bk9Vb#3g0q6 atb/3I7T0 9%av4+bx8*6N8GbB9d70bG9w768Q0i9B8!7o9E8Wb%9JbR7c0 bV8(bbc00 0tbC70bccfcq7Fb*ch4GbJ8QbLbNb|cb9D040Vck9naPb 5O8,0+b!9O5O0n1 0401b{b9bW7*8x0 a@a9b@3,8uc(3}bTb)0 aKcE6bbt9SbvclbX7t0 0o0d240O0KcD3dbrb:9Zbq8x8?8d8^bG8`cx3?c#6%c%dccjc+227?0gdl1X0n0B0 000s0p020v0c0Y0s00bac`cn040W1H1Tdp7`04c$6*c.bhb+8m8o8qd7bg0rbp32d47gct8 c/bi9Qbub.dj6.dDaPc!04c}c d1dK8hd6dZd;d?0td0d22Gd!c)0 docQ6gd9c8bPd)dN8:de7Nd(dR8d8n8AdUc;8Udke7d504e6dV6NdrdtdvdxdzdBd/aAd;edd_c*eqcydMdhdOefdmeheN37dSeleCbyc{d=c~d d^eIe4bod_83d~e0eGe5e(e9dbeQ0`dden3Bdga8eMe@3Icwe|dfejdTbUeUcL5TcN8.a:e(c|eYe+bw9odF9re;01bFfi0GbI0426a$ebbGc-fi7De#46bJ0IembfcFcI4beD9p04cpd_fte egdQflcz9AbMbOd-cH9mfEcKe3c,d$dPc:fBc=d*c@d,eubndYd3d;6$e`eefL22e?f%bsfofzf3cYfF7,f!fie~f`e^f)a4d%fNf@eRf1eTfweOe%gf1XfKg5e}ePgbdLb-9WcJdEcMfy7j9)fV3pfXfY2_e_a^f?f/bgf.e2f:eLgFbDcccGd)7kfAgNcF9Nf,b$7.cggod`gaglf0gqg9f$gTf(8z7Kf~c_d:csgYcubgg+6Mf(g)f#d)g.8Bgi0`eHgWg6eFf cm5Ogkg,5Tg4hcg6g}h5gmghhif0h7b}ffgubAg^6Nfkg!fm9qbBb3fucdfsg2g!8$f4gB1X6_fIh28h6 2(gScrg1g@g*gQcAfRe1g{eocGfDgzfXd;gq0$hnd|gHfJhDg%fMg`h(d+grfWcKd;7k9S26hPhHh3d{gG9Ph)h+h:ggh=eWh0hPcvgni7gc9387g;g0hqhKhlfxg7a=h*gLe,bogIhQg|h@irf=hTeiibgxhGikgX8db(g3iehfeJhhh,6Nh4iPcM9$7XiFeVdF7kgwd-gy10gAhpf{i5isg~iCekg/hLiRi3ixf*c9i6iMe$i99PiDi-fOgdi:ijh9f60 bZf9hL83h|29h14;0!6K0M2H9R2H6E2I6x1i2L2K1,1.2K0o1Sji6u1B330!0*0,0.0n04.