Salut
En ce qui concerne ton problème, ta conception est clairement erronée.
Si je commente un peu ton code :
Code C/C++ :
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 ! -