Liste circulaire

Fermé
titi0006 Messages postés 157 Date d'inscription lundi 24 juin 2013 Statut Membre Dernière intervention 15 mars 2017 - 11 oct. 2015 à 11:19
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 11 oct. 2015 à 11:56
Bonjour,

J'ai programme qui s'occupe de liste circulaire avec la notion de généricité.
J'ai donc commencé à faire quelque chose mais je n'arrive pas à modifier les méthodes pour ajouter, supprimer, se déplacer
Voici le code:

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

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

//Creation d'une cellule contenant la valeur n et ayant comme cellule suivante la cellule c
CelluleEntierCirculaire(X n, CelluleEntierCirculaire<X> c){
this.valeur = n;
this.celluleSuivante = c;
}

//Renvoie la valeur contenue dans la cellule
public X valeur(){
return this.valeur;
}

//Renvoie la cellule suivante
public CelluleEntierCirculaire<X> celluleSuivante(){
if(this.celluleSuivante != null)
return this;
else
return this.celluleSuivante;
}
}


public class ListeDEntiersCirculaire<X>{
private CelluleEntierCirculaire<X> cellule;

//Liste vide
ListeDEntiersCirculaire(){
this.cellule = null;
}

//Liste d'un élément
ListeDEntiersCirculaire(X n){
this.cellule = new CelluleEntierCirculaire<X>(n);
}

//Construction d'une liste par ajout d'un élément en tête d'une liste
ListeDEntiersCirculaire(X n, ListeDEntiersCirculaire<X> l){
this.cellule = new CelluleEntierCirculaire<X>(n,l.cellule);
}

//Renvoie la valeur de la tête de la liste
public X tete(){
assert(this.cellule!=null);
return this.cellule.valeur();
}

//Supprime la premier valeur de la liste
public void queue(){
assert(this.cellule!=null);
this.cellule = this.cellule.celluleSuivante();
}

//Ajoute un entier en tête de liste
public void ajoute(X n){
this.cellule = new CelluleEntierCirculaire<X>(n, this.cellule);
}

//Indique si la liste est vide
public boolean estVide(){
return cellule==null;
}

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

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


Merci de votre aide

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
11 oct. 2015 à 11:44
Bonjour,

Je ne vais pas rentrer dans le détail du code, car à mon avis tu es parti du mauvais pied et qu'il va falloir retravailler en profondeur ton code :

Tu dis que ce sont des listes circulaires, mais je ne vois pas où est la circularité. Tes conditions d'arrêt sont celles d'une liste bidirectionnelle, c'est à dire que tu t'arrêtes quand tu arrives à un bout (valeur null). Or une liste circulaire n'a pas de bout, quand tu arrives au "dernier" élément, l'élément suivant existe et c'est le "premier" élément de la liste.
En conséquence une liste circulaire n'a ni queue ni tête, n'importe quel élément est à la fois le premier et le dernier élément de la liste.

A-B-C-D-E = B-C-D-E-A = C-D-E-A-B = D-E-A-B-C = E-A-B-C-D

Remarque : tu parles de généricité et tu as bien un paramètre <X> (en général on l'appelle plutôt <E>), mais pourtant tes classes s'appellent CelluleEntierCirculaire et ListeDEntiersCirculaire... c'est bizarre !
0
titi0006 Messages postés 157 Date d'inscription lundi 24 juin 2013 Statut Membre Dernière intervention 15 mars 2017
11 oct. 2015 à 11:49
Car avant c'était des entier mais il suffi juste que j'enlève le mot entier dans la signature des classes.
Et du coup je doit faire quoi exactement dans mes deux classes?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
11 oct. 2015 à 11:56
Voici un article sur les liste circulaires, le code est en C mais les schémas et les explications devraient te permettre de comprendre la notion de circularité.

https://forums.commentcamarche.net/forum/affich-37604404-listes-circulaires-ring-buffer
0