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