Liste chaînée en langage c

youssefelmessari Messages postés 1 Date d'inscription mercredi 22 juillet 2009 Statut Membre Dernière intervention 22 juillet 2009 - 22 juil. 2009 à 12:14
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 - 22 juil. 2009 à 13:54
messieur j'aun un problème concernat la suprresion d'un élement sur la liste chaînée dont voici le doee source
void suppression(void)// a r e v o i r ;
{
struct employe *precedent,*p;
afficher_liste();
printf("\nQuel numero voulez vous supprimer:");
scanf("%d", &p->Num);
if (p!=debut) /* pas le premier element */
{
p=debut;
while (p->suivant!=p)
p=p->suivant;
p->suivant=p->suivant->suivant;
}
else /* suppression du 1er element */
debut=p->suivant;
je savais pas ou est le probleme merci d'avance

4 réponses

Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 13
22 juil. 2009 à 12:50
Bonjour,
[ttp://bul.chez.com/csr/?r=liste chainee&s=cppfrance.com le mieux c'est de voir ici]
Cordialement [mon Site] [M'écrire] Bul
0
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 13
22 juil. 2009 à 12:53
erreur sur le lien ! c'est ici
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 14
22 juil. 2009 à 13:37
Bonjour,

Tu as posté dans :
"A propos des sites CodeS-SourceS / Boîte à idées pour améliorer CodeS-SourceS "

Tu peux m'expliquer en quoi ton idée va améliorer ce site ?

Merci de poster sur un thème C.

Pour ton code... Bin je n'y vois pas grand chose de logique...
Prend un papier, dessine tes structures avec des carrées et des flèches, et traduit ça en code.
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 51
22 juil. 2009 à 13:54
Salut

En ce qui concerne ton problème, ta conception est clairement erronée.

Si je commente un peu ton code :
void suppression(void) // De manière générale, quand un tube est vide, on ne marque rien, pas void
// De plus, tu ne précises pas de quelle liste du comptes supprimer un élément
{
struct employe *precedent,*p; // Déclaration de variables, mais pas d'initialisation

afficher_liste(); // Afficher quelle liste ?

printf("\nQuel numero voulez vous supprimer:");
scanf("%d", &p->Num); // p n'a pas été initialisé. Pointe sur n'importe quoi.
// Donc écrire dans p->Num plantera dans 99.99% des cas
// Et à quoi correspond Num ? à un identifiant ?

if (p!= debut) // Qu'est-ce que debut ? 
// Eviter les variables globales, c'est le meilleur moyen de t'embrouiller
// p n'est toujours pas initialisé => p sera toujours différent de debut (99.99999999% des cas)

{
p=debut;
while (p->suivant!=p) // tant que le prochain élément de la liste n'est pas l'élément actuel ??
// Le dernier élément d'une liste chainée est soit le premier élément (cyclique) soit NULL
// Et si j'ai bien compris ce que tu cherches à faire, il faut que ta condition se fasse sur Num
// while (p->suivant->Num != leNumASupprimer)
// De plus, il est très facile de rentrer dans une boucle infinie
// while (p->suivant != NULL && p->suivant->Num != leNumASupprimer)
// (remplacer NULL par ancre en cas de liste chainée cyclique)
p=p->suivant; // Faire plus attention à la présentation : soit mettre des {} soit mettre sur la même ligne que le while.
// En te lisant, on croirait que l'autre instruction est aussi dans le while

p->suivant=p->suivant->suivant; // Ok, tu enlèves l'élément de la chaine.
// Mais je te conseille quand même de vérifier que c'est bien l'élément que tu veux enlever.
// De plus, tu as oublié de libérer la mémoire
}
else
// Cf. Remarque du while : {} ou même ligne, pour plus de lisibilité.
debut=p->suivant; // Là encore, tu as oublié de libérer ta mémoire



En conclusion :
- évite les variables globales
- découpe en plusieurs fonctions (une pour choisir ton élément à supprimer, et une pour supprimer)
- initialise tes variables
- libère ta mémoire
- et SURTOUT, pour des concepts un peu complexes comme les listes chainées, comme dit rt15, fait tourner ton code A LA MAIN. (tu verrais que tes boucles sont mauvaises, que tu n'as pas libéré la mémoire que des conditions sont mauvaises, et que tu n'as pas initialisé tes variables)

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -


Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
0