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 }
|