Suppresion d'un element dans une liste chainée

Résolu/Fermé
zarganomi Messages postés 30 Date d'inscription mercredi 11 juin 2014 Statut Membre Dernière intervention 13 juillet 2014 - 30 juin 2014 à 00:57
zarganomi Messages postés 30 Date d'inscription mercredi 11 juin 2014 Statut Membre Dernière intervention 13 juillet 2014 - 1 juil. 2014 à 22:18
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;



}


A voir également:

2 réponses

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
Modifié par gravgun le 30/06/2014 à 19:45
'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
zarganomi Messages postés 30 Date d'inscription mercredi 11 juin 2014 Statut Membre Dernière intervention 13 juillet 2014
1 juil. 2014 à 22:18
merci gravgun
0