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

Algorithmes et structures de données Discussion :

SoS liste chainée


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2006
    Messages : 31
    Par défaut SoS liste chainée
    Bonjour,
    Je n'arrive pas à créer un algo itératif pour supprimer toutes les occurrences d'un element dans une liste chainée.

    voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Liste{
     int element;
    Liste suivant;
    ....
    methode qui affiche une liste...
     
     }//fin class
    public class Exple{
     public static void(String [] args){
     Liste ln=new Liste(1,new Liste(2,new Liste(3,new Liste(1, new Liste(1,new Liste(4,null)))));
     }
    }
    L'affichage avant suppression:
    1 2 3 1 1 4
    après suppression
    je devrais avoir uniquement: 2 3 4
    or je n'arrive à supprimer que le 1er élement.
    Voici la methode:
    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
     
    public Liste suppression(int e){
    Liste parcours=this;
    Liste precedent=null;
     
    //tant que je ne suis pas à la fin de la liste et que je n'ai pas trouve e
    while(parcours!=null && parcours.element !=e){
    //je parcours la liste en avançant mes 2 pointeurs
    precedent=parcours;
    parcours=parcours.suivant;
    }
    //je sors de la boucle si  j'ai trouvé e et que je ne suis pas en fin de liste
    if(parcours!=null && parcours.element==e){
      if(precedent==null) //si la liste n'a qu'un élement {
         return parcours.suivant; //je retourne l'element e
       }
     else{
        precedent=precedent.suivant;
        return this;
     }
    else return this;
    }
    Je vous remercie d'avance, mais je n'y arrive pas

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par défaut


    Tu met la condition suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //tant que je ne suis pas à la fin de la liste et que je n'ai pas trouve e
    while(parcours!=null && parcours.element !=e){ ... }
    Or, il faut parcourir toute la liste dans tous les cas de figure pour être sur que l'on efface bien tous les éléments, tu ne dois pas sortir de la boucle au premier trouvé. Voila en gros l'algorithme que tu recherches:

    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
    while(parcours != null) {
     
    	if(parcours.element == e) {
     
    		// On raccorde le précédent avec le suivant
    		precedent.suivant = parcours.suivant;
     
    		// On supprime l'élément actuel
    		delete parcours;
     
    		// On revient en arrière pour continuer la boucle
    		parcours = precedent;
     
    	}
     
    	// On continue le parcours de la liste
    	precedent = parcours;
    	parcours = parcours.suivant;
    }

  3. #3
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2006
    Messages : 31
    Par défaut mon algo fonctionne un petit peu mieux
    mais ce n'est pas encore cela, car cette fois, il ne supprime pas le 1er element lorsque e est en premiere position:
    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
    public Liste supprimeTouteOcc(int e){
      Liste parcours=this;
       Liste precedent=null;
    //le pb est dans ce bloc que je le mette ou non dans le while 
    if((precedent==null) && (parcours.element==e)){
    // precedent= parcours;
      parcours=parcours.suivant;
    }
     while(parcours!=null){
     
     if(parcours.element!=e){
         precedent=parcours;
         parcours=parcours.suivant;
     } //fin if
    
    else{ //je trouve e et je le supprime
          precedent.suivant=parcours.suivant;
          parcours=parcours.suivant;
       }
    
    }//fin du while
    return this;
    } //
    Merci pour ton aide

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par défaut
    Citation Envoyé par tarah01
    mais ce n'est pas encore cela, car cette fois, il ne supprime pas le 1er element lorsque e est en premiere position
    Oui bien vu, j'avais oublié de gérer ce cas particulier (précédent n'existe pas pour le premier), il suffit de le prendre en compte avant de rentrer dans la boucle. Pour cela, une solution consiste à faire une première boucle qui va supprimer les premières occurences, et la seconde va supprimer celles qui suivent:

    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
    public Liste supprimeTouteOcc(int e) {
     
     
    Liste parcours = this;
    Liste precedent = null;
     
     
    // Suppression des occurences en début de liste
    while(parcours != NULL && parcours.element == e) {
     
    	precedent = parcours;
    	parcours = parcours.suivant;
     
    	delete precedent;
    }
     
     
    // Parcours du reste de la liste
    while(parcours != NULL) {
     
    	if(parcours.element == e) {
     
    		// On raccorde le précédent avec le suivant
    		precedent.suivant = parcours.suivant;
     
    		// On supprime l'élément actuel
    		delete parcours;
     
    		// On revient en arrière pour continuer la boucle
    		parcours = precedent;
     
    	}
     
    	// On continue le parcours de la liste
    	precedent = parcours;
    	parcours = parcours.suivant;
    }
     
    /* A ce stade, toutes les occurences sont supprimées */
     
    return this;
    }

  5. #5
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2006
    Messages : 31
    Par défaut un grand merci pour ton aide
    ça marche...

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par défaut
    Il y a peut être une version plus optimisé (ou du moins plus jolie à écrire), mais bon celle là semble correcte pour ce que l'on en fait.
    Pense bien à cliquer sur

    ++

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

Discussions similaires

  1. SOS liste chainée
    Par informohammed dans le forum C
    Réponses: 2
    Dernier message: 13/11/2008, 20h53
  2. Bibliothèque de listes chainées
    Par gege2061 dans le forum C
    Réponses: 29
    Dernier message: 17/12/2004, 20h15
  3. copie de liste chainée
    Par tomsoyer dans le forum C++
    Réponses: 15
    Dernier message: 31/08/2004, 18h20
  4. Trie liste chaine
    Par Congru dans le forum C
    Réponses: 2
    Dernier message: 30/03/2004, 19h05
  5. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25

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