Exercice n° 2: implanter les listes pointées par une structure de données récursive

squelette à compléter du code de ListeP_Rec :

ListeP_Rec
import java.util.*;
/**
 * Décrivez votre classe ListeP_Rec ici.
 * 
 * @author TD NFP121
 * @version v0.0
 */
public  class ListeP_Rec implements ListePointInterface
{    
        private int lg;
        private Maillon elem;
       
    /**
     * retourne la valeur du premier élément de la liste sans destruction
     * remarque :  on ne peut pas obtenir la tête d'une liste vide
     */ 
    public  Object car(){
        return elem.valeur();
    }
    
    /**
     * supprime la tete de la liste
     * remarque :  on ne peut pas supprimer la tête d'une liste vide
     */
    public  void cdr() {  
        elem=elem.suite();
        lg--;
    }
    /**
     * ajoute 'obj' au début de la liste;
     * la longueur de la liste est augmentée de 1
     */
    public  void cons(Object obj){
                /* 
                 *à compléter...
                 */
    }
    /**
     * ajoute en fin de liste la liste 'liste'
     */
    public  void conc(ListePointInterface liste ){
                /* 
                 *à compléter...
                 */
    }

    /**
     * retourne 'this'
     */
    public  void renverse()  {
                /* 
                 *à compléter...
                 */
    }
    
    /**
     *'objet' appartient-il à la liste ?
     */   
    public  boolean membre(Object objet){
                /* 
                 *à compléter...
                 */
                return false;
    }
    public  boolean listeVide(){
        return lg==0;
    }
    public  int longueur(){
        return lg;
    }
    
    public String toString(){
                /* 
                 *à compléter...
                 */
                return null;
    } 
    
     public boolean  equals(Object obj){
         if(!(obj instanceof ListePointInterface)) return false;
                /* 
                 *à compléter...
                 */
                return false;
     }

/*
 * on va avoir besoin d'énumérer les éléments d'une chaine de maillons
 * et on choisit pour cela un iterator implanté au moyen d'une classe anonyme
 * cf. ci dessous...
 */                      
        public Iterator<Object> iterator(){
        return new Iterator<Object>(){
            Maillon temp=elem;
            public boolean hasNext(){
                /* 
                 *à compléter...
                 */
                return false;
               }
               public Object next(){
                /* 
                 *à compléter...
                 */
                   return null;
               }
               public void remove(){
                   throw new UnsupportedOperationException();
               }
           };
       }
       /*
        * ...
        * 
        */
}

remarques et rappels :

  • car() et cdr() : l'application de ces méthodes sur une liste vide est une erreur il faudra donc prévoir de traiter cette erreur (crash du programme dans tous les cas et il faut cacher à l'utilisateur l'implémentation par un tableau..).
    • "à la main"
    • par une levée d'exception (cf. exercice 1 classe 'ListeVideException' extends Exception {...} )
    • par une instruction assert
  • structure de données récursive : classe Maillon  (cf. cours)
    sqel. classe Maillon
    /**
     * 
     * @author TD NFP121
     * @version v 0.007
     */
    
     class Maillon implements Iterable{
        private Object valeur;
        private Maillon suite;
        /**
         * création d'un nouveau maillon i.e. il est tout seul sans 'suite' (null)
         */
        public Maillon(Object valeur){
        this.valeur=valeur;
        this.suite=null;
        }
        /**
         * ajout d'un nouveau maillon devant une chaine existante par la
         * création d'un nouveau maillon qui est 'accroché' à la chaine existante...
         */
        public Maillon(Object valeur,Maillon suite){
            this.valeur=valeur;
            this.suite=suite;
        }
    
        public Object valeur(){
            return valeur;
        }
        public Maillon suite(){
            return suite;
        }
        public void modifSuite(Maillon m){
            suite=m;
        }
        
        public boolean equals(Object that){
            /* 
             * à compléter
             */
            return false;
         }
    
        public String toString(){
            /* 
             * à compléter
             */
            return "";
        }
    /*
     * on va avoir besoin d'énumérer les éléments d'une chaine de maillons
     * et on choisit pour cela un iterator implanté au moyen d'une classe anonyme
     * cf. ci dessous...
     */           
         public java.util.Iterator iterator(){
            return new java.util.Iterator(){            
                Maillon temp=new Maillon(valeur , suite);
                public boolean hasNext(){
                    /* 
                     *à compléter...
                     */
                    return false;
                   }
                   public Object next(){
                    /* 
                     *à compléter...
                     */
                       return null;
                   }
                   public void remove(){// non implémenté
                       throw new UnsupportedOperationException();
                   }
               };
           }
        }
    
  • ATTENTION aux parcours de la donnée récursive Maillon ATTENTION aux destructions...
  • pour membre et equals bien poser le problème et si il  est trop compliqué attendre les listes génériquespour une solution robuste.
  • enfin ajouter un "iterator" à la classe pour pouvoir énumérer les éléments de la liste. l'entête de la classe devient lors :
    public class ListeP_Rec implements ListePointInterface , Iterable
  • la classe Maillon peut être une classe interne de la classe ListeP_Rec. elle sera alors private...

tests :

developper avec Bluej une classe de tests (pertinents) couvrant tous les cas particuliers et généraux que vous "voyez"