Partage
  • Partager sur Facebook
  • Partager sur Twitter

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
    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. :)
    • Partager sur Facebook
    • Partager sur Twitter
      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
      • Partager sur Facebook
      • Partager sur Twitter
        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.
        • Partager sur Facebook
        • Partager sur Twitter
          3 août 2011 à 16:16:07

          Oh oui, j'ai dit n’importe quoi ;'(
          • Partager sur Facebook
          • Partager sur Twitter
            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 :-°
            • Partager sur Facebook
            • Partager sur Twitter

            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é.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown