Partage

Implémentation d'une liste chaînée en Java

J'éssaye d'implémenter une liste chaînée en Java

Sujet résolu
Le 3 août 2011 à 14:34:41

Salut mes chers amis Zér0s ! :D

Dans ma quête de l'apprentissage de Java, j'ai éssayé d'implémenter une liste simplement chainée. Pour commencer, j'ai éssayé de faire l'insertion en début de liste et une méthode toString() pour voir si ça marchait... mais force est de croire que que ça ne marche pas vraiment comme prévu :-°
J'ai éssayé de raisonner comme je le ferai d'habitude en C++ (les pointeurs en moins :'( ), voici mon code:
GListerCell.java // la cellule
public class GListerCell
{

	protected Object obj;
	protected GListerCell next;

	protected GListerCell (Object o, GListerCell nxt)
	{
		this.obj = o;
		this.next = nxt;
	}

	protected boolean hasNext ()
	{
		return this.next != null;
	}
}


GLister.java // la liste chainée
public class GLister
{

	protected GListerCell head;

	public GLister ()
	{
		this.head = null;
	}

	public void add (Object o)
	{
		GListerCell cell = new GListerCell(o, this.head);
		this.head = cell;
	}

	@Override
	public String toString ()
	{
		if (this.head == null)
		{
			return "[ void ]";
		}
		else
		{
			String s = "";
			GListerCell it = this.head;
			while (it.hasNext())
			{
				s = s + " > " + it.obj.toString();
			}
			s = s + " > " + it.obj.toString();
			return s;
		}
	}
}


Le main: rien de particulier, j'ajoute des nombres en tête de liste en éspérant avoit cet affichage:
> 5 > 6 > 7 > 8 > 9
Mais en lancant, le programme semble être dans une boucle infinie ou se fige complétement (avec une augmentation de l'usage du CPU par java.exe)
public static void main (String[] args)
	{
		GLister l = new GLister();
		for (int i = 9; i > 4; i--)
		{
			l.add(new Integer(i));
		}
		System.out.println(l);
	}


J'utilise JDK 7 et NetBeans 7.0.1 sous Windows 7 32bits
Merci d'avance pout votre aide. :)
Publicité
Le 3 août 2011 à 14:34:41
Le 3 août 2011 à 15:27:04

Salut,

Le problème vient de ta fonction add de GLister.

Il y a un cas particulier quant la liste est vide.

Si tu veut pas la solution clic pas :p


//CODE FAUX 
/*
public void add (Object o)
	{
               if( this.head == null ) {

                    this.head = new GListerCell(o, null);
                }else {
		    GListerCell cell = new GListerCell(o, this.head);
		     this.head = cell;
               }
	}
*/


</span>

Edit j'avait dit n'importe quoi :p
Le 3 août 2011 à 16:01:08

Non, ce n'est pas la fonction add le problème.
Le problème c'est qu'il manque une fonction next().
Dans ta boucle dans la méthode toString, it est toujours le même élément, tu reste toujours sur le premier.
Le 3 août 2011 à 16:16:07

Oh oui, j'ai dit n’importe quoi ;'(
Le 3 août 2011 à 17:29:54

Citation : mac.aque

Non, ce n'est pas la fonction add le problème.
Le problème c'est qu'il manque une fonction next().
Dans ta boucle dans la méthode toString, it est toujours le même élément, tu reste toujours sur le premier.


Merci mac.aque :)

@Override
	public String toString ()
	{
		if (this.head == null)
		{
			return "[ void ]";
		}
		else
		{
			String s = "";
			GListerCell it = this.head;
			while (it.hasNext())
			{
				s = s + " > " + it.obj.toString();
				it = it.next; // où avais-je la tête en oubliant de mettre ça ? -_-"
			}
			s = s + " > " + it.obj.toString();
			return s;
		}
	}


Je suis trop géné d'avoir posé une question aussi bête :honte:
Je crois qu'il est temps pout moi de faire une petite pause :-°

Implémentation d'une liste chaînée en Java

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown