Liste doublement chaîné

Fermé
titi0006 Messages postés 156 Date d'inscription lundi 24 juin 2013 Statut Membre Dernière intervention 15 mars 2017 - 17 oct. 2015 à 17:11
titi0006 Messages postés 156 Date d'inscription lundi 24 juin 2013 Statut Membre Dernière intervention 15 mars 2017 - 17 oct. 2015 à 20:08
Bonjour,

J'essaye de faire une liste doublement chaîné mais je bloque sur certain élément. Voici ce que j'ai fait:

public class CelluleCirculaire<X> {
private X valeur;
private CelluleCirculaire<X> celluleSuivante;
private CelluleCirculaire<X> cellulePrecedente;

//Creation d'une cellule contenant la valeur n
CelluleCirculaire(X n){
this.valeur = n;
this.celluleSuivante = null;
this.cellulePrecedente = null;
}

public X getValeur() {
return valeur;
}

public void setValeur(X valeur) {
this.valeur = valeur;
}

public CelluleCirculaire<X> getCelluleSuivante() {
return celluleSuivante;
}

public void setCelluleSuivante(CelluleCirculaire<X> celluleSuivante) {
this.celluleSuivante = celluleSuivante;
}

public CelluleCirculaire<X> getCellulePrecedente() {
return cellulePrecedente;
}

public void setCellulePrecedente(CelluleCirculaire<X> cellulePrecedente) {
this.cellulePrecedente = cellulePrecedente;
}
}


public class ListeCellulesCirculaire<X>{
private CelluleCirculaire<X> debut;
private CelluleCirculaire<X> fin;

//Liste vide
ListeCellulesCirculaire(){
this.debut = null;
this.fin = null;
}

public void ajouterDebut(CelluleCirculaire<X> cellule){
cellule.setCellulePrecedente(null); // au cas ou
cellule.setCelluleSuivante(this.debut);
if(this.debut == null)
this.fin = cellule;
else
this.debut.setCellulePrecedente(cellule);
this.debut = cellule;
}

public void ajouterFin(CelluleCirculaire<X> cellule){
cellule.setCelluleSuivante(null); // au cas ou
cellule.setCellulePrecedente(this.fin);
if (this.fin == null)
this.debut = cellule;
else
this.fin.setCelluleSuivante(cellule);
this.fin = cellule;
}

//Renvoie la longueur de la liste
public int longueur(){
int longueur = 0;
CelluleCirculaire<X> c = this.debut;
while (c!=null) {
longueur = longueur + 1;
c = c.getCelluleSuivante();
}
return longueur;
}

//Renvoie une chaîne de caractères représentant la liste
public String toString(){
String s = "[";
CelluleCirculaire<X> c = this.debut;
while (c!=null) {
s = s + c.getValeur();
c = c.getCelluleSuivante();
if (c!=null) s = s +"; ";
}
s = s + "]";
return s;
}

public CelluleCirculaire<X> getDebut() {
return debut;
}

public void setDebut(CelluleCirculaire<X> debut) {
this.debut = debut;
}

public CelluleCirculaire<X> getFin() {
return fin;
}

public void setFin(CelluleCirculaire<X> fin) {
this.fin = fin;
}
}


Je voudrais avoir ceci comme fonction:
- lire l'élément en cours
- se décaler sur l'élément suivant
- ajouter et supprimer un élément
- calculer la longueur de la liste
- rechercher un élément dans la liste

Merci de votre aide

1 réponse

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
17 oct. 2015 à 19:49
Bonjour,

J'ai regardé ton code vite fait, de toute façon tu l'a plus ou moins repris de ton code précédent sur les listes circulaires, mais dans la liste de tes "fonctions" (on appelle ça des méthodes en Java) il y a déjà plus ou moins tout de fait non ? Lire l'élément en cours c'est getValeur(), se décaler sur l'élément suivant c'est getCelluleSuivante(), calculer la longueur de la liste c'est longueur(), bref... quelle est ta question exactement ?

Remarque : pourquoi ne pas implémenter l'interface List<E> de Java qui te permettrait d'être compatible avec toutes les librairies de manipulations de Collection en Java ?

https://docs.oracle.com/javase/8/docs/api/java/util/List.html

NB. Ta "cellule" serait l'équivalent du ListIterator...
https://docs.oracle.com/javase/8/docs/api/java/util/ListIterator.html
0
titi0006 Messages postés 156 Date d'inscription lundi 24 juin 2013 Statut Membre Dernière intervention 15 mars 2017
17 oct. 2015 à 19:57
Ce que j'avais fait dans mon post précédent c'est pour des simples liste. Et là je suis pour des listes doublement chaînées, c'est-à-dire circulaire.
Ce que je voudrais savoir si les méthode que j'avais dans le post précédents sont réutilisables et si celles que j'ai faits la sont correctes.
Et dans le port précédent, je ne sais pas si les méthode pour supprimer sont aussi réutilisable telle quelle
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
17 oct. 2015 à 20:06
"mon post précédent c'est pour des simples liste. Et là je suis pour des listes doublement chaînées, c'est-à-dire circulaire."
Ton post précédent c'était pour faire des listes circulaires mais tu avais déjà un code de liste doublement chaînée (pas de liste simplement chaînée) c'est pour ça que je ne comprends pas ta question ici, vu que le code tu l'avais déjà la dernière fois...

Remarque : "listes doublement chaînées, c'est-à-dire circulaire", c'est faux, ces deux structures sont différentes, on ne peut pas dire que ce soit la même chose.
0
titi0006 Messages postés 156 Date d'inscription lundi 24 juin 2013 Statut Membre Dernière intervention 15 mars 2017
17 oct. 2015 à 20:08
Mais les méthodes d'ajout fonctionnaient pas pour les liste circulaire
0