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

C++ Discussion :

Retirer dans une liste


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 3
    Par défaut Retirer dans une liste
    Bonjour à vous, je dois pour un projet, coder une liste orienté objet en C++. Seulement je suis coincé à un petit problème lorsque je retire dans ma liste. Le but de ma procédure est de pouvoir retirer une cellule à n'importe quel emplacement dans ma liste avec un nombre envoyé en paramètre : _uiPosition. Bon, je suis capable de retirer le premier élément de ma liste, le dernier élément et parfois d'autre qui se trouve n'importe où. J'ai un problème lorsque j'essaie de retirer une cellule autre qu'au premier et au dernier. J'arrive à en retirer quelques-uns, mais lorsque je les retire, que j'en ajoute des nouveaux avec ma procédure ajouter et que je les retire à nouveau. Mon programme peut ne pas fonctionner parfois, un message d'erreur me dit : violation d'accès.

    Voici ma procédure pour retirer

    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
    bool Retirer(unsigned int _uiPosition){ //permet de retirer dans la liste
                if (_uiPosition >= 1 && _uiPosition <= m_uiCount){ //si la position envoyer en paramètre respecte un nombre dans la liste
                        if (m_pPremier->ObtenirSuivant() != nullptr){
                                if (_uiPosition == 1){ //si on veux retirer le première élément de ma liste
                                        m_pPremier = m_pPremier->ObtenirSuivant(); //changer la position de de mon première élément au suivant
                                }
                                else{ //si on a besoin de parcourir ma liste pour trouver l'élément
                                        CCelluleListe<modele>* tempAvantSupprimer = m_pPremier; //créer un temporaire
                                        for (int iCompteur = 1; iCompteur < _uiPosition - 1; iCompteur++){ //trouver l'emplacement précédent de celui que l'on veut suprimer
                                                tempAvantSupprimer = tempAvantSupprimer->ObtenirSuivant(); //changer le pointeur temporaire tant que la position n'est pas la bonne recherché
                                        }
     
                                        if (_uiPosition == m_uiCount){ //si mon élément est le dernier
                                                tempAvantSupprimer->DefinirSuivant(nullptr);
                                        }
     
                                        else{
                                                CCelluleListe<modele>* TempSupprimer = tempAvantSupprimer->ObtenirSuivant(); //créer un nouveau pointeur qui pointe à celui que l'on veut supprimer
                                                tempAvantSupprimer->DefinirSuivant(tempAvantSupprimer->ObtenirSuivant()); //Définir le suivant de l'élément qui précede celui à supprimer au suivant de celui à supprimer
                                                delete TempSupprimer; //supprimer mon pointeur temporaire à supprimer
                                        }
                                }
                        }
                        else{
                                delete m_pDernier;
                                m_pDernier = nullptr;
                        }
                        m_uiCount--; //décrémenter mon nombre d'élément dans ma liste en réponse à un retirement
                }
                else{
                        return false; //si ma liste était vide, alors on ne peut rien retirer
                }
        }
    Voici ma procédure pour ajouter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void Ajouter(modele _Element){
    		if (m_pDernier == nullptr){ // code à executer si ma liste est vide
    			m_pDernier = new CCelluleListe<modele>(_Element, nullptr); //créer une nouvelle cellule à la position m_pDernier
    			m_pPremier = m_pDernier; //mettre la même position à m_pPremier puisque la liste contient seulement cette élément
    		}
    		else{
    			m_pDernier->DefinirSuivant(new CCelluleListe<modele>(_Element, nullptr)); //créer une nouvelle cellule et faire pointer Dernier sur celui-ci
    			m_pDernier = m_pDernier->ObtenirSuivant();
    		}
    		++m_uiCount; //incrémenter mon compteur d'élément dans ma liste
    	}

  2. #2
    Membre éprouvé

    Homme Profil pro
    autodidacte
    Inscrit en
    Mars 2011
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Mars 2011
    Messages : 95
    Par défaut
    Je suppose que ton projet implique de ne pas utiliser la classe list et ça c'est méchant...

    Bon ton code est compliqué. Voici quelques remarques qui feront avancer le schmilblick pour la fonction retirer (commentaires en rouge):

    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
    bool Retirer(unsigned int _uiPosition){ //permet de retirer dans la liste
                if (_uiPosition >= 1 && _uiPosition <= m_uiCount){ //si la position envoyer en paramètre respecte un nombre dans la liste
                        if (m_pPremier->ObtenirSuivant() != nullptr){
                                i=1;
                                CCelluleListe<modele>* tempAvantSupprimer = m_pPremier; //créer un temporaire
                                tempAvantSupprimer = tempAvantSupprimer->ObtenirSuivant()
                                // que se passait-t-il si _uiposition = 2 ????????
                                while (i<=_uiposition)
                                      tempAvantSupprimer = tempAvantSupprimer->ObtenirSuivant();
                                if (_uiPosition == m_uiCount){ //si mon élément est le dernier
                                      tempAvantSupprimer->DefinirSuivant(nullptr);
                                else{
                                      //créer un nouveau pointeur qui pointe à celui que l'on veut supprimer
                                      CCelluleListe<modele>* TempSupprimer = tempAvantSupprimer->ObtenirSuivant(); 
                                      //correction: emploi de TempSupprimer
                                      //Définir le suivant de l'élément qui précede celui à supprimer au suivant de celui à supprimer
                                      tempAvantSupprimer->DefinirSuivant(TempSupprimer); 
                                      //supprimer mon pointeur temporaire à supprimer 
                                      delete TempSupprimer; //inutile fin de la prcoédure atteinte
                                        }
    
                        else{
                                delete m_pDernier; 
                                m_pDernier = nullptr; //m_pDernier vient d'être supprimé-->??????
                        }
                        m_uiCount--; //décrémenter mon nombre d'élément dans ma liste en réponse à un retirement
                }
                else{
                        return false; //si ma liste était vide, alors on ne peut rien retirer
                }
    Bon courage.

    EDIT mention de la classe list, au lieu de vector

Discussions similaires

  1. [LG]Tri par insertion dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2003, 22h34
  2. [LG]suppression dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 9
    Dernier message: 16/12/2003, 21h20
  3. [langage] Comment rajouter des champs dans une liste
    Par toto_titi dans le forum Langage
    Réponses: 4
    Dernier message: 28/08/2003, 14h09
  4. Réponses: 2
    Dernier message: 17/08/2003, 20h07
  5. Réponses: 4
    Dernier message: 24/04/2003, 22h28

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