ListeChainee.java
001 package fr.isae.lists;
002 
003 /**
004  <code>ListeChainee</code> est une <code>Liste</code> representee sous la forme
005  * d'une liste de cellules chainees.
006  *
007  @author <a href="mailto:garion@isae.fr">Christophe Garion</a>
008  @version 1.0
009  */
010 public class ListeChainee implements Liste, Agregat {
011 
012     private Cellule premiere;
013 
014     /**
015      * Creer une liste chainee vide.
016      */
017     public ListeChainee() {
018         this.premiere = null;
019     }
020 
021     @Override public int getNbElements() {
022         if (premiere == null) {
023             return 0;
024         }
025 
026         int nb = 1;
027         Cellule suivante = premiere;
028 
029         while ((suivante = suivante.getSuivante()) != null) {
030             nb++;
031         }
032 
033         return nb;
034     }
035 
036     /**
037      * Renvoie la premiere cellule.
038      *
039      @return une instance de <code>Cellule</code> qui est la premiere cellule
040      */
041     public Cellule getPremiereCellule() {
042         return this.premiere;
043     }
044 
045     @Override public double getElement(int pos) {
046         return (this.trouverCellule(pos)).getElement();
047     }
048 
049     @Override public void remplacer(int pos, double elt) {
050         (this.trouverCellule(pos)).setElement(elt);
051     }
052 
053     @Override public void ajouter(int pos, double elt) {
054         Cellule ajout = new Cellule(elt);
055 
056         if (premiere == null) {
057             premiere = ajout;
058         else {
059             Cellule courante = this.trouverCellule(pos);
060 
061             if (pos == 0) {
062                 premiere = ajout;
063             else {
064                 (this.trouverCellule(pos - 1)).setSuivante(ajout);
065             }
066 
067             ajout.setSuivante(courante);
068         }
069     }
070 
071     @Override public void supprimer(int pos) {
072         if (pos == 0) {
073             if (premiere.getSuivante() == null) {
074                 premiere = null;
075             else {
076                 premiere = premiere.getSuivante();
077             }
078         else {
079             Cellule avant = this.trouverCellule(pos - 1);
080             Cellule aEnlever = avant.getSuivante();
081 
082             avant.setSuivante(aEnlever.getSuivante());
083 
084             aEnlever.setSuivante(null);
085         }
086     }
087 
088     @Override public Iterateur creeIterateur() {
089         return new IterateurListeChainee(this);
090     }
091 
092     private Cellule trouverCellule(int pos) {
093         int compteur = 0;
094         Cellule courante = premiere;
095 
096         while (compteur != pos) {
097             courante = courante.getSuivante();
098             compteur++;
099         }
100 
101         return courante;
102     }
103 }