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
.128013wl7.;à,a/: +qDNr0èM!npmj3_6kséhf-45(vtb=ocgeS19)2iPd8uFy050!0S0M0i0Y0c0D0l0Q0c0i0D0D0O010M0Y0w010406050D0$0x0x0i0q0(040T0P0c0$0|0P0v050j13151719110w041i1p051s0j1s1u1p110!0Y0L0;0?0^0`0F0Y0R0F0c1I0F0M0 050,0N0c0S1D0@0_011H1J1L1J0M1R1T1P0M0N0P0!191Q0q1q0M0F0;1c0D0w0i0v0`0X011V1F010G0.0S0v0i0x0S1P1`1|211X241T27290 0a0l0Z0q0P0w0P0D0Y1f0v0l0*1^0q0q0S0Q2u1i2c0v1q0j1?2H0M1;1:1=0!2e0`1L0v262r1P1A1C0=1W2R0Y2T0v1-1B1P0w2A1q2F2H2/121{2v2Z222(0q160c0 0l0U2E2?102=2d2^1X2`2|2~0X311|332F2Q01380i2}040l0z3c2G113f360`3i3k0l0I3o3e2?3g3u2~0J3y3q3A3s3h0P2{3j2~0B3F342@1E373K393l0d3P3r3S3t3U3M3l0#3Y3H3!3J3L3v0V3*353,3C040U0r3;3R2!3-3V0U301j323G3=3}3@0U3b423d443|2_3$3k0U3n4a3p3Q3B4f0 0U3x4j3z454e3.4o3E4r4c4m4v3^3O4y4l3I473X4E3Z464n3^3)4J3+4L4B0U3:4P4t3T4B0X3`4V4d4X3V0X412/4z4G4M0X494+4F3?4.4i4;4K4u4(4q4_4Q4{3%0X4x4~4W3#4Y4D544$564(4I594A4(4O5e4-4Y4U5i4?4B0z4!5m4R3V0z4*434=5s3%0z4:5w4`4%5z4^5C4 5E3k0z4}5H553~5z535N5a5P5K585S5f5z5d5X5j5t5h5#5n5t5l5)5y3k0I5q5-505/5v4b5x5?0 0I5B5_5D5b3%0I5G5 5I615/5M655O3@0I5R6a5T6c5W6f5Y5/5!6j5$625(3d1r2-1i2X2K0!2O3g0Q1-2a1q6v1t6t2;4r056A0*2.66010C0 363y5`1X0b2~6S603h0Q0 0t0-0c0c1g6X6N0~040k3F0l6;0l6T0`6P040*0G6+5O6V3l6}5T0G0x0 0A0A2$2t76713g6-0K7b3I0N6-0D0S0c6|6I6Y6-0h3y6?6Y0v0 0L3j0S0$0q7f3,7p7r6@3h0 131B1|0M7B3}0P0 0O7M220C6!040p1g0S7R1X6-0W6/4y6=7)7s6N7h7H7k7m2;6Y7O040e7Z3t7v7x7z7E7=7P7~6N7u047w1T7}7(7*6;7F7-047j7l7_017?7^7n827H0$7J0v7L4r7+5O7?7Q8r7F837I7w8p3F067)7F6_6{8g6 6?8k5O73750A0D2L7a8L5T7d8g8c8e7:327F7#7%4+898a6Y6_2A0M7z1h8w7t0N7H2L8g8V8T3g8X7/8g8i8g83857y7A8{3I7#8C8F6Q3S8I6W963?7U0%258_0 8%438E8+0 8H9f3}8J8g8N0476780M8S7;6,0 7e9s228}8f9G7!0 7q8;8l042,0S0x0Y0S959C8t809K6^7U7W2T9k047$3{3g8J8)8g0D0!0 019@0l9R9T9V0l0S8Q0l1T9_2A9{0q0l160.6)2v1{a51T0n0$7k0l1g0l0i0Q0Q0s2x0ga00ia00Y8Q7Y4#3g9;2~8)7)0Q0Y0q0Q0$0?aD0S8j5r22ay3laA6=0o1|0:a10Q0@2w000$2T0l2g0S0h0;009~0Ma01U0*0q0v9Ua5a76(ai0i0y0P1e0E0lap0?a#9jaw3IaNaA9@016:9/6Y9I8Z6r7 7@910 9`a=819Y048v2/8s6gbja3bl4y8D6=9a6`0Sbe2G7F9u9!3h0G0 a+0A0L0Y0*9)9F9X5Tbd9)9+8889bz8-8/bmbS7i8~bG90bG83bk9Vb#3g0P6 atb/3I7T0 9%av4+bx8*6N8GbB9d70bG9w768Q0q9B8!7o9E8Wb%9JbR7c0 bV8(bbc00 0YbC70bccfcq7Fb*ch4GbJ8QbLbNb|cb9D040Kck9naPb 5O8,0+b!9O5O0D1 0401b{b9bW7*8x0 a@a9b@3,8uc(3}bTb)0 aKcE6bbt9SbvclbX7t0 0i0G240Q0FcD3dbrb:9Zbq8x8?8d8^bG8`cx3?c#6%c%dccjc+227?0mdl1X0D0U0 000l0H020R0M0f0l00bac`cn040b1H1Tdp7`04c$6*c.bhb+8m8o8qd7bg0ubp32d47gct8 c/bi9Qbub.dj6.dDaPc!04c}c d1dK8hd6dZd;d?0Yd0d22Gd!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;01bFfi0vbI0426a$ebbGc-fi7De#46bJ0cembfcFcI4beD9p04cpd_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;gq0Ahnd|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;0j6K0S2H9R2H6E2I6x1i2L2K1,1.2K0i1Sji6u1B330j0*0,0.0D04.