Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 07/03/2006, à 10:06

Premium

[Résolu]Liste chainée[JAVA]

Bonjour,

J'ai un problème dans mon code car lorsque je demande l'affichage de la liste et de sa taille ,j'ai ceci:

elements de la liste : quatre trois deux un
taille : 0

alors que lorsque je mets seulement affichage de la liste,j'ai

elements de la liste : quatre trois deux un

et seulement l'affichage de la taille:

taille : 4

Je voudrais savoir pourquoi lorsqu'après l'appel de la methode toString(),la liste est mise à null?

Merci d'avance

Le code :

import java.util.*;

    public class LinkedList{
	private Link head = null;
	
	class Link{
	    private Link next;
	    private String element;
	    
	    public Link(String element, Link next){
		this.element = element;
		this.next = next;
	    }
	}
	
	public void add(String text){
	    head = new Link(text,head);
	}
	
	public int size(){
	    int size = 0;
	    while(head!= null){
		size ++;
		head = head.next;
	    }
	    return size;
	}
	
	public String toString(){
	    StringBuilder sb = new StringBuilder();
	    sb.append("elements de la liste : ");
	    while(head != null){
		sb.append(head.element).append(" ");
		head = head.next;
	    }
	    return sb.toString();
	}
    }
public class Main{
    public static void main(String [] args){
	LinkedList list = new LinkedList();

	list.add("un");
	list.add("deux");
	list.add("trois");
	list.add("quatre");
	
	//System.out.println(list);
	System.out.println("taille : " + list.size());
    }	
	
}

Dernière modification par Premium (Le 07/03/2006, à 14:33)

Hors ligne

#2 Le 07/03/2006, à 12:06

Mathieu147

Re : [Résolu]Liste chainée[JAVA]

Si ça peut t'aider, voici la classe Node que j'ai dû faire pour un cours:

public class Node {
  private Object element;
  private Node next;
  /** 
   * Constructor (without arguments)
   */
  public Node(){
    this(null,null);
  }


  /** 
   * Constructor (with arguments)
   * @param e element to insert
   * @param n next node
   */
  public Node(Object e, Node n){
    element = e;
    next = n;
  }


  /**
   * Returns the element of the given node
   * @return the elements of the node
   */
  public Object getElement(){
    return element;
  }


  /**
   * Returns the next node
   * @return the next node
   */
  public Node getNext(){
    return next;
  }


  /**
   * Set an element in the node
   * @param e element to put in the node
   */
  public void setElement(Object e){
    element = e;
  }


  /**
   * Set the next node
   * @param n the next node
   */
  public void setNext(Node n){
    next = n;
  }
}

(désolé, les commentaires sont en anglais mais le prof nous oblige)

Ensuite, tu peux faire une classe LinkedList, dans laquelle tu incrémentes un compteur à chaque fois que tu rajoutes un noeud, et ta méthode size(), ce sera seulement

return numberOfElements

Pffff…

Hors ligne

#3 Le 07/03/2006, à 12:33

Eldime

Re : [Résolu]Liste chainée[JAVA]

Le plus simple est encore de garder une variable d'instance size que tu incrémentes à chaque ajout d'élément.

Essaie peut etre le code suivant :

 public void add(String text){
        Link tmp = new Link(text,head);
        head = tmp;
    }

Je sais que c identique mais on ne c jamais. Dernier petit conseil, essaie d'ajouter des méthodes dans ta classe Link style setNext, setText, ....

Hors ligne

#4 Le 07/03/2006, à 13:27

Premium

Re : [Résolu]Liste chainée[JAVA]

Mon problème est encore présent .
Lorsque je mets seulement affichage de la liste ,j'ai la liste qui s'affiche .
De meme lorsque je mets seulement l'affichage de la taille,j'ai la taille qui s'affiche 4
mais lorsque je combine les 2,j'ai la taille vaut 0 sad

Alors voici mais 3 classes après changement :

import java.util.*;

public class Link{
    private Link next;
    private final String element;
    
    public Link(String element, Link next){
	this.element = element;
	this.next = next;
    }
    
    public Link getNext(){
	return next;
    }
    
    public String getElement(){
	return element;
    }
}
import java.util.*;

    public class LinkedLink{
	private Link head = null;
	
	public void add(String text){
	    head = new Link(text,head);
	}
	
	public int size(){
	    int size = 0;
	    while(head != null){
		size ++;
		head = head.getNext();
	    }
	    return size;
	}
	
	public String toString(){
	    StringBuilder sb = new StringBuilder();
	    sb.append("elements de la liste : ");
	    while(head != null){
		sb.append(head.getElement()).append(" ");
		head = head.getNext();
	    }
	    return sb.toString();
	}
    }
public class Main{
    public static void main(String [] args){
	LinkedLink list = new LinkedLink();

	list.add("un");
	list.add("deux");
	list.add("trois");
	list.add("quatre");
	
	System.out.println(list);
	System.out.println("taille : " + list.size());
    }	
}

Hors ligne

#5 Le 07/03/2006, à 13:40

Mathieu147

Re : [Résolu]Liste chainée[JAVA]

Ta méthode size() n'est pas bonne puisqu'elle change ton pointeur head.  A la fin de l'exécution, head=null.

C'est exactementl amême chose avec ta méthode qui affiche la liste. C'est pour ça qu'à la fin de l'exécution d'une des méthodes, l'autre ne marche plus.

Incrémente plutôt un compteur à chaque fois que tu rajoutes un élément dans ta liste.

Ta méthode size(), pour l'instant, a un temp d'exécution qui varie linéairement avec le nombre d'éléments. Si tu as une liste d'un million d'éléments, ça va prendre plein de temps de calculer sa taille. Par contre, si tu incrémentes un compteur à chaque fois, ce sera rapide comme l'éclair...


Pffff…

Hors ligne

#6 Le 07/03/2006, à 14:26

Premium

Re : [Résolu]Liste chainée[JAVA]

Salut Mathieu147,

en suivant tes conseils,j'ai enfin ce que je veux cool
j'obtiens ceci :

~$ java Main
elements de la liste : quatre trois deux un
taille : 4

Je mets le code corrigé et qui fonctionne,ça peut toujours servir:

import java.util.*;

public class Link{
    private Link next;
    private final String element;
    
    public Link(String element, Link next){
	this.element = element;
	this.next = next;
    }
    
    public Link getNext(){
	return next;
    }
    
    public String getElement(){
	return element;
    }
}
import java.util.*;

    public class LinkedLink{
	private Link head = null;
	int size = 0;
	
	public void add(String text){
	    head = new Link(text,head);
	    size ++;
	}
	
	public int size(){
	    return size;
	}
	
	public String toString(){
	    Link tmp = head; 
	    StringBuilder sb = new StringBuilder();
	    sb.append("elements de la liste : ");
	    while(tmp != null){
		sb.append(tmp.getElement()).append(" ");
		tmp = tmp.getNext();
	    }
	    return sb.toString();
	}
    }
public class Main{
    public static void main(String [] args){
	LinkedLink list = new LinkedLink();

	list.add("un");
	list.add("deux");
	list.add("trois");
	list.add("quatre");
	
	System.out.println(list);
	System.out.println("taille : " + list.size());
    }	
}

Hors ligne

#7 Le 07/03/2006, à 14:59

Mathieu147

Re : [Résolu]Liste chainée[JAVA]

cool Well done soldier, that's why you're number one...


Pffff…

Hors ligne