Suppresion d'un element dans une liste chainée

Résolu
zarganomi Messages postés 39 Statut Membre -  
zarganomi Messages postés 39 Statut Membre -
Bonjour,
SVP pourquoi en exécutant ce programme il n'affiche pas la liste chaîné après la suppression de l'élément 5, pourtant j'ai appelé la fonction Afficher() après la suppression ?

#include <cstdlib>
#include <iostream>

using namespace std;

struct Element
{
int valeur;
Element* suivant;
};

Element* liste = NULL;

void Ajouter(int valeur)
{
Element* element= new Element;
element->valeur = valeur;
element->suivant = liste;
liste = element;
}

Element* Rechercher(int valeur)
{
Element* element = liste;

while(element != NULL && element->valeur != valeur)
element = element->suivant;

return element;
}

void Supprimer(Element* element)
{
Element* precedent = liste;

if(element == liste)
{
liste = NULL;
delete element;
return;
}

while(precedent != NULL && precedent->suivant != element)
precedent = precedent->suivant;

if(precedent == NULL) return;
precedent->suivant = element->suivant;
delete element;
}

void Afficher()
{
Element* element = liste;
while(element != NULL)
{
cout << element->valeur << "\t";
element = element->suivant;
}
cout << endl;
}

int main(void)
{
Element* e;

Ajouter(1);
Ajouter(2);
Ajouter(3);
Ajouter(4);
Ajouter(5);

Afficher();

e = Rechercher(5);
Supprimer(e);

Afficher();

system("pause");
return 0;

}

2 réponses

  1. ElementW Messages postés 5690 Statut Contributeur 1 293
     
    'lut,
    Affiche()
    s'exécute bien mais:
    -
    Ajouter(int)
    ajoute un élément au début de la liste
    - tu cherches le pointeur de l'élément contenant 5
    - tu appelles
    Supprimer(Element*)
    avec, qui 1. libère la mémoire allouée à l'élément 2. définit la globale liste à NULL car l'élément "5" est
    liste
    , donc on a perdu toute référence au reste de la liste.
    -
    Affiche()
    constate que
    element == NULL
    et donc n'affiche que
    '\n'
    .
    Ton code est bien fait dans son ensemble, mais la logique est faite à l'envers pour
    Ajouter()
    ; refait dans le bon sens, ça donne ceci:
    void Ajouter(int valeur)
    {
    	Element* element = new Element;
    	element->valeur = valeur;
    	element->suivant = NULL;
    	if (liste == NULL) {
    		liste = element;
    	} else {
    		Element* precedent = liste;
    		while(precedent->suivant != NULL)
    			precedent = precedent->suivant;
    		precedent->suivant = element;
    	}
    }
    Et là, c'est automagique: ça marche!
    Détail: supprime ce
    system("pause");
    pas joli et pas portable, remplace-le par un
    cout << "Appuyez sur entrée" << endl; cin.get();
    qui marche tout aussi bien.
    from human import idiocy
    del idiocy
    0
  2. zarganomi Messages postés 39 Statut Membre
     
    merci gravgun
    0