Liste<T> (version générique)

La classe Liste<T> vue en classe (version générique) était essentiellement comme suit. Il se peut qu'il y ait de petites variations d'un groupe à l'autre :

using System;
using System.Collections.Generic;

namespace z
{
   class ListeVideException : Exception { }
   class Liste<T> where T : IComparable
   {
      class Noeud
      {
         public T Valeur { get; }
         public Noeud Succ { get; set; } = null; // successeur
         public Noeud(T valeur)
         {
            Valeur = valeur;
         }
      }
      private Noeud Tête { get; set; } = null;
      public bool EstVide { get => Tête == null; }
      private Noeud Dernier { get; set; } = null;
      public int Length { get; private set; } = 0;
      public Liste()
      {
      }
      public void Add(T valeur)
      {
         if (EstVide)
         {
            // Tête = Dernier = new Noeud(valeur);
            Tête = new Noeud(valeur);
            Dernier = Tête;
         }
         else
         {
            // Dernier = Dernier.Succ = new Noeud(valeur);
            Dernier.Succ = new Noeud(valeur);
            Dernier = Dernier.Succ;
         }
         ++Length;
      }
      public void RemoveFront()
      {
         if (EstVide) throw new ListeVideException();
         Tête = Tête.Succ;
         if (EstVide)
            Dernier = null;
         --Length;
      }
      public void Appliquer(Action<T> oper)
      {
         for (Noeud p = Tête; p != null; p = p.Succ)
            oper(p.Valeur);
      }
      public void Afficher() 
      {
         Appliquer(obj => Console.Write($"{obj} "));
      }
      public int Count(T valeur) -> CountIf(val => val.CompareTo(valeur) == 0);
      public bool Contains(T valeur)
      {
         for (Noeud p = Tête; p != null; p = p.Succ)
            if (valeur.CompareTo(p.Valeur) == 0)
               return true;
         return false;
      }
      public static Liste<T> Dupliquer(Liste<T> lst)
      {
         Liste<T> résultat = new Liste<T>();
         for (Noeud p = lst.Tête; p != null; p = p.Succ)
            résultat.Add(p.Valeur);
         return résultat;
      }
      public int CountIf(Func<T,bool> pred)
      {
         int n = 0;
         for (Noeud p = Tête; p != null; p = p.Succ)
            if (pred(p.Valeur))
               ++n;
         return n;
      }
   }
   class Program
   {
      static bool EstTiMot(string s) => s.Length <= 3;
      static void Main(string[] args)
      {
         Liste<string> lst = new Liste<string>();
         if (!lst.EstVide)
            Console.WriteLine("Oups!");
         string[] vals = new[] { "Yo", "man", "genre" };
         foreach (string s in vals)
            lst.Add(s);
         lst.Afficher();
         Console.WriteLine($" : {lst.Length} éléments");
         Console.WriteLine($"Il y a {lst.CountIf( s => s.Length >= 3 )} tits mots");
         Console.WriteLine($"Nombre d'occurrences de  \"man\" : {lst.Count("man")}");
         Liste<string> autre = Liste<string>.Dupliquer(lst);
         while(!lst.EstVide)
         {
            lst.RemoveFront();
            lst.Afficher();
            Console.WriteLine();
         }
         Console.Write("Ma copie de lst contient : ");
         autre.Afficher();
         Console.WriteLine();
      }
   }
}

Voilà!


Valid XHTML 1.0 Transitional

CSS Valide !