IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

petite erreur d'implémentation dans une liste simplement chaînée


Sujet :

avec Java

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 207
    Points : 114
    Points
    114
    Par défaut petite erreur d'implémentation dans une liste simplement chaînée
    Bonjour,

    J'ai écrit une liste simplement chaînée mais ma fonction de suppression du dernier élément ne fonctionne pas. Pourtant, tout a l'air correct.

    Je déclare le premier maillon comme étant le maillon courant, et de 0 à taille-1, je déplace le maillon courant.
    Puis je déclare que le suivant de courant est null et je décrémente la taille. Voyez-vous où se trouve l'erreur?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    public class ListeSimple {
    	private Maillon premierElt;
    	private Maillon dernierElt;
    	private int taille;
     
    	public ListeSimple ()
    	{
    		this.premierElt = null;
    		this.dernierElt = null;
    		this.taille = 0;
    	}
     
    	public int getTaille()
    	{
    		return this.taille;
    	}
     
    	public boolean estVide()
    	{
    		return (this.taille == 0);
    	}
     
    	public void viderListe()
    	{
    		this.premierElt = null;
    		this.dernierElt = null;
    		this.taille = 0;
    	}
     
    	public Caractere get(int index)
    	{
    		Maillon pointeurDebut = this.premierElt;
    		for (int i = 0; i < this.taille; i++)
    		{
    			if (index == i) return pointeurDebut.getCaractere();
    			pointeurDebut = pointeurDebut.suivant;
    		}
    		return null;
    	}
     
    	public void insertionEnTete(Caractere elt)
    	{
    		if (this.taille == 0)
    		{
    			this.premierElt = new Maillon(elt);
    			this.dernierElt = this.premierElt;
    		} else
    		{
    			Maillon AncienPremierElt = this.premierElt;
    			this.premierElt = new Maillon(elt, AncienPremierElt);
    		}
    		this.taille++;
    	}
     
    	public void insertionEnQueue(Caractere elt)
    	{
    		if (this.taille == 0)
    		{
    			this.dernierElt = new Maillon(elt);
    			this.premierElt = this.dernierElt;
    		} else
    		{
    			Maillon AncienDernierElt = this.dernierElt;
    			this.dernierElt = new Maillon(elt);
    			AncienDernierElt.setSuivant(this.dernierElt);
    		}
    		this.taille++;
    	}
     
    	public void insertionPosition(int pos, Caractere elt)
    	{
    		if (pos == 0) this.insertionEnTete(elt);
    		else if (pos == this.taille) this.insertionEnQueue(elt);
    		else
    		{
    			Maillon courant = this.premierElt;
    			for (int i = 0; i < pos - 1; i++)
    				courant = courant.suivant;
    			Maillon MaillonAInserer = new Maillon(elt, courant.suivant);
    			if (courant.suivant == null) this.dernierElt = MaillonAInserer;
    			else
    			{
    				MaillonAInserer.setSuivant(courant.suivant);
    				courant.setSuivant(MaillonAInserer);
    				this.taille++;
    			}
    		}
    	}
     
    	public void suppressionPremierElt()
    	{
    		if (this.taille == 0) this.dernierElt = null;
    		else
    		{
    			Maillon AncienPremierElement = this.premierElt;
    			this.premierElt = this.premierElt.getSuivant();
    			AncienPremierElement.setSuivant(null);
    			this.taille--;
    		}
    	}
     
    	public void suppressionDernierElt()
    	{
    		if (this.taille == 0) this.premierElt = null;
    		else
    		{
    			Maillon courant = this.premierElt;
    			for (int i = 0; i < this.taille - 1; i++)
    				courant = courant.getSuivant();
    			courant = this.dernierElt;
    			this.dernierElt.setSuivant(null);
    			this.taille--;
    		}
    	}
     
    	public void suppression(int pos)
    	{
    		if (pos == 0) this.suppressionPremierElt();
    		else if (pos == this.taille - 1) this.suppressionDernierElt();
    		if (pos == 1)
    		{
    			this.premierElt = this.dernierElt;
    			this.premierElt.setSuivant(null);
    		} else
    		{
    			Maillon courant, MaillonASupprimer, MaillonPrecedantCourant;
    			courant = this.premierElt;
    			MaillonPrecedantCourant = courant;
    			for (int i = 0; i < pos - 1; i++)
    			{
    				MaillonPrecedantCourant = MaillonPrecedantCourant.getSuivant();
    			}
    			for (int i = 0; i < pos; i++)
    				courant = courant.suivant;
    			MaillonASupprimer = courant;
    			MaillonPrecedantCourant.suivant = courant.suivant;
    			courant.suivant = null;
    			this.taille--;
    		}
    	}
     
    	void affiche()
    	{
    		Maillon courant = this.premierElt;
    		Terminal.ecrireString("[");
    		while (courant != null)
    		{
    			Terminal.ecrireChar(courant.elt.getChar());
    			if (courant.getSuivant() != null) Terminal.ecrireString("");
    			courant = courant.getSuivant();
    		}
    		Terminal.ecrireString("]\n");
    	}
     
    	public static void main(String [] args)
    	{
    		ListeSimple l = new ListeSimple();
    		l.insertionEnTete(new Caractere('0'));
    		l.insertionEnTete(new Caractere('0'));
    		l.insertionEnQueue(new Caractere('1'));
    		l.insertionEnQueue(new Caractere('2'));
    		l.insertionEnQueue(new Caractere('3'));
    		l.insertionEnQueue(new Caractere('4'));
    		l.insertionEnQueue(new Caractere('5'));
    		l.insertionEnQueue(new Caractere('6'));
    		l.insertionEnQueue(new Caractere('7'));
    		l.insertionEnQueue(new Caractere('0'));
    		l.affiche();
    		l.suppressionDernierElt();
    		l.affiche();
    	}
    }
    Merci par avance,
    Johnny3

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 234
    Points : 172
    Points
    172
    Par défaut
    Il existe une implementation dans java des listes chainées.

    http://java.sun.com/j2se/1.5.0/docs/...inkedList.html

    Cela ne sert absolument à rien de réinventer la roue.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 207
    Points : 114
    Points
    114
    Par défaut
    lol. Si je le fais, c'est parce que... eh bien tout simplement parce que mon prof me l'a demandé, petit comique! Je suis étudiant au CNAM et on nous oblige à écrire les listes doublement et simplement chaînée pour ne pas simplement utiliser linkedList.

    Sinon, j'ai trouvé où était mon erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public void suppressionDernierElt()
    	{
    		if (this.taille == 0) this.premierElt = null;
    		else
    		{
    			Maillon courant = this.premierElt;
    			for (int i = 1; i < this.taille - 1; i++)
    				courant = courant.getSuivant();
    			this.dernierElt = courant;
    			courant.setSuivant(null);
    			this.taille--;
    		}
    	}
    Je te renvoie sur un autre lien instructif: http://deptinfo.cnam.fr/phpBB2/viewtopic.php?f=3&t=6342

    Sinon, je te remets ici la réponse du prof quand je lui ai demandé si on pouvait utiliser LinkedList l'année dernière:

    L'une des difficultés étant justement l'implémentation des différentes méthodes relatives aux listes, si vous utilisez des méthodes déjà existantes vous supprimez cette difficulté.

    D'autre part, si votre code est assez bien structuré, cela ne doit pas changer trop de choses.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 234
    Points : 172
    Points
    172
    Par défaut
    Petit comique... J'aprécie.

    D'une part le langage java est conçu justement pour supprimer ces problématiques et je ne connaissais pas la raison de ton post.

    Et contrairement à ce que ton prof dit, les difficultés en conception orienté objet ne sont pas de nature alogorthmique comme on pouvait en recontrer sur des langages comme le C mais conceptuel. La valeur ajoutée se trouve dans la conception d'architecture maintenable sur le long terme.

    Il y'a beaucoup plus intéressant à faire que recoder les listes chainées... Surtout si tu as déja rencontrée cette problèmatique dans d'autre langage.

    Autre chose si tu veux faire une implementation d'une liste au moins implemente les interfaces standards... (java.util.List en l'occurence)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Insertion d'un élément dans une liste simplement chainée triée (croissante)
    Par vayouva dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 14/11/2014, 09h29
  2. [Débutant] Erreur lookup field dans une liste SharePoint 2007
    Par Lily Stamper dans le forum Développement Sharepoint
    Réponses: 4
    Dernier message: 18/11/2013, 11h37
  3. Déplacement dans une liste doublement chaînée
    Par Adenora dans le forum Débuter
    Réponses: 9
    Dernier message: 19/10/2010, 15h43
  4. Erreur d'index sur une List<int> dans boucle for
    Par popoliline dans le forum C#
    Réponses: 13
    Dernier message: 16/06/2010, 11h03
  5. [Free Pascal] Clonage d'une liste simplement chaînée
    Par xinx1 dans le forum Free Pascal
    Réponses: 13
    Dernier message: 12/06/2009, 16h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo