j'ai fait une fonction pour supprimer un joueur recherché ç'est le case 6 du menu;
et la fonction est à la fin du programme
mais ça ne marche pas bien merci de me dire ce qui ne va pas
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
struct joueurs{
char nom[20];
short age;
struct joueurs *next;
};
struct sport{
char nom[20];
struct joueurs *liste;
struct sport *next;
};
struct sport *insersport(struct sport *debut,struct sport *inser,struct joueurs*inserjoueur);
struct joueurs *inserjoueur(struct joueurs *debut,struct joueurs *inser);
struct sport*creer();
struct sport *encodage(struct sport *debut);
void affichage(struct sport*debut);
void affichagesport(struct sport*debut);
struct sport* modifjoueur(struct sport*debut);
void recherchemodifjoueur(struct sport*debut);
struct sport* supprimer(struct sport *debut);
struct joueurs* supprimersousliste(struct joueurs*debut );
void liberationmemoireapresquitterprogramme(struct sport*debut);
//struct sport* supprimerElement(struct sport* debut);
struct sport* supprimerjoueur(struct sport*debut);
struct sport* bonnesuppressionjoueur(struct sport*debut);
int main()
{
int choix=0;
int r=1;
int i=0;
int nbl=0;
struct sport *liste;
liste = creer();
//menu
do
{
printf("(1)Pour afficher la liste des joueurs d'un sport recherche" );
printf("\n(2)Pour afficher la liste de tous les sports et des joueurs\n(3)Pour rechercher un joueur et le modifier" );
printf("\n(4)Pour encoder des sports et des joueurs" );
printf("\n(5)Pour supprimer un sport recherche" );
printf("\n(6)Pour supprimer un joueur recherche" );
printf("\n(7)pour quitter taper autre touche" );
printf("\nQuel est votre choix : " );
fflush(stdin);
scanf("%d",&choix);
switch(choix)
{
case 1:affichagesport(liste);
break;
case 2:affichage(liste);
break;
case 3: recherchemodifjoueur(liste);
break;
case 4:
printf("\nCombien de sport voulez vous encoder : " );
fflush(stdin);
scanf("%d",&nbl);
while(i<nbl){
liste=encodage(liste);
i++;
}
break;
case 5:
//supprimerElement(liste);
printf("\nadresse pointee par liste avant supression : %p\n",liste);
liste=supprimer(liste);
printf("\nadresse pointee par liste apres supression : %p\n",liste);
break;
case 6://liste =supprimerjoueur(liste);
liste=bonnesuppressionjoueur(liste);
affichage(liste);
default:liberationmemoireapresquitterprogramme(liste);
r=0;
}
}while(r==1);
liberationmemoireapresquitterprogramme(liste);
return 0;
}
/*�a s'appelle l'entete
I: un pointeur de sport qui est la t�te de liste, un pointeur de structure sport � inserer dans la liste, un pointeur
de structure joueur � inserer dans la liste
P: inserer un sport et inserer un joueur
O: elle retourne le pointeur de d�but de liste
*/
struct sport *insersport(struct sport *debut,struct sport *inser,struct joueurs*insertjoueur)
{
struct sport *courant, *prev;
courant =NULL;
prev=NULL;
courant = debut;
if(debut==NULL || strcmp(debut->nom,inser->nom)>0)// si debut est apr�s inser
{
inser->next=debut;
debut=inser;
inser->liste=inserjoueur(inser->liste,insertjoueur);//inser est le nouvel element que j'ai inser� donc le chainage se fait avec ce nom logique non ?
}
else
{
while(courant!=NULL && strcmp(inser->nom,courant->nom)>0)// (inser est alphab�tiquement avant courant) inser plus grand que courant
{
prev=courant;
courant=courant->next;
}
if(courant != NULL && strcmp(courant->nom,inser->nom)==0)//on fait quoi l� ? inser egal courant donc pr�sent dans la liste et on fait pas l'insertion de sport mais on insere joueur
{
courant->liste = inserjoueur(courant->liste,insertjoueur);
}
else// inser n'est pas present dans la liste et on insere inser et ensuite on insere le joueur
{
prev->next=inser;
inser->next=courant;
inser->liste = inserjoueur(inser->liste,insertjoueur);
}
}
return debut;
}
/*
I: t�te de liste de la structure joueur et pointeur de structure joueur qui est un element � inserer
P: elle insere un joueur en t�te de liste pile
O: elle retourne le pointeur de d�but de liste
*/
struct joueurs *inserjoueur(struct joueurs *debut,struct joueurs *inser)// on insere joueur en tete de liste pile
{
inser->next=debut;
debut=inser;
return debut;
}
/*
I: pointeur de tete de liste de la structure sport
P: encoder des sports et des joueurs et l'inserer au bon endroit
O: pointeur de d�but de liste (tete de liste)de la structure sport
*/
struct sport *encodage(struct sport *debut)//une seule structure car joueur est une sous liste
{
struct sport *newsport;
struct joueurs *newjoueur;
newsport= malloc (sizeof(struct sport));
if(newsport!=NULL)
{
newjoueur=malloc(sizeof(struct joueurs));
if(newjoueur!=NULL)
{
newjoueur->next = NULL;
newsport->next = NULL;
newsport->liste = NULL;
printf("Entrez le sport : " );
fflush(stdin);
fgets(newsport->nom,20,stdin);
printf("Entrez le joueur : " );
fflush(stdin);
fgets(newjoueur->nom,20,stdin);
printf("Entrez l'age : " );
fflush(stdin);
scanf("%hd",&newjoueur->age);
debut=insersport(debut,newsport,newjoueur);
}
}
return debut;
}
/*
I: pointeur de t�te de liste de la structure sport
P: affiche la liste des sports et des joueurs
O: /
*/
void affichage(struct sport*debut)
{
struct sport *tempsport;
struct joueurs*tempjoueur;
tempsport = debut;
if(debut==NULL)
{
printf("la liste est vide" );
}
else{
while(tempsport!=NULL)
{
printf("%s :\n",tempsport->nom);
tempjoueur = tempsport->liste;
while(tempjoueur!=NULL)
{
printf("%s, %hd ,",tempjoueur->nom,tempjoueur->age);
tempjoueur=tempjoueur->next;
}
tempsport=tempsport->next;
}
}
}
/*
I: pointeur de tete de liste de la structure sport
P: affiche liste joueur d'un sport demand� � l'utilisateur
O
*/
void affichagesport(struct sport*debut)
{
struct sport *tempsport;
struct joueurs *tempjoueur;
//struct joueurs *prevjoueur;
char ptab[20];
printf("Vous voulez la liste des joueurs de quel sport : " );
fflush(stdin);
fgets(ptab,20,stdin);
tempsport=debut;
if(tempsport==NULL)
{
printf("la liste est vide " );
}
else{
while(tempsport!=NULL && strcmp(ptab,tempsport->nom)> 0)//ptab>tempsport tant que ptab est alphab�tiquement apr�s tempsport tempsportnom
{
tempsport=tempsport->next;
}
if(tempsport!=NULL && strcmp(ptab,tempsport->nom)==0)
{
tempjoueur=tempsport->liste;
while(tempjoueur!=NULL)
{
printf("%s, %hd; ",tempjoueur->nom,tempjoueur->age);
tempjoueur=tempjoueur->next;
}
}
}
}
/*
I: pointeur de tete de liste de la structure sport
P: modification de joueur
O: pointeur de t�te de liste de la structure sport
*/
struct sport* modifjoueur(struct sport*debut)
{
struct sport *tempsport;
struct joueurs*tempjoueur;
char ptabspor[20];
char ptabjoueu[20];
printf(" Dans quel sport voulez vous modifier un joueur : " );
fflush(stdin);
fgets(ptabspor,20,stdin);
printf("Quel joueur voulez vous modifier : " );
fflush(stdin);
fgets(ptabjoueu,20,stdin);
tempsport=debut;
while(tempsport!=NULL && strcmp(ptabspor,tempsport->nom)>0)
{
tempsport=tempsport->next;
}
if(tempsport!=NULL &&strcmp(ptabspor,tempsport->nom)==0)
{
tempjoueur=tempsport->liste;
// prev=tempjoueur;
//tempjoueur=temjoueur->next
while(tempjoueur!=NULL && strcmp(ptabjoueu,tempjoueur->nom)>0)
{
tempjoueur = tempjoueur->next;
}
if(tempjoueur !=NULL&&strcmp(ptabjoueu,tempjoueur->nom)==0)
{
short choix=0;
printf("que voulez vous modifier (1) age (2) nom:" );
fflush(stdin);
scanf("%hd",&choix);
switch(choix){
case 1:
printf("entrer l'age:" );
fflush(stdin);
scanf("%hd",&tempjoueur->age);
break;
case 2:
printf("entre le nom:" );
fflush(stdin);
fgets(tempjoueur->nom,20,stdin);
break;
}
}
}
return debut;
}
/*
I: pointeur de tete de liste de la structure sport
P: modification d'un joueur
O: /
*/
void recherchemodifjoueur(struct sport*debut)
{
short choix=0;
int trouve=0;
char ptabjoueu[20];//nom a rechercher
printf("Quel joueur recherchez vous : " );
fflush(stdin);
fgets(ptabjoueu,20,stdin);
struct sport*tempsport;
struct joueurs*tempjoueur;
tempsport=debut;
while(tempsport!=NULL&& trouve==0)
{
tempjoueur=tempsport->liste;
while(tempjoueur!=NULL && trouve==0)
{
if(strcmp(tempjoueur->nom,ptabjoueu)==0)
{
trouve=1;
}else
{
tempjoueur=tempjoueur->next;
}
}
tempsport=tempsport->next;
}
if(trouve ==1)
{
printf("que voulez vous modifier : (1)l'age\n(2)le nom" );
fflush(stdin);
scanf("%hd",&choix);
switch(choix)
{
case 1:
printf("Entrez l'age : " );
fflush(stdin);
scanf("%hd",&tempjoueur->age);
break;
case 2:
printf("Entrez le nom : " );
fflush(stdin);
fgets(tempjoueur->nom,20,stdin);
}
}
}
/*
I: /
P: creation d'une liste
O: retourne un pointeur null
*/
struct sport*creer()
{
return NULL;
}
/*struct sport* supprimerElement(struct sport* debut)
{
char ptab[20];
struct sport *courant;
struct sport*precedent;
precedent = NULL;
printf("Entrez le nom a supprimer : " );
fflush(stdin);
fgets(ptab,20,stdin);
courant = debut;
if (debut == NULL) // si la liste est NULL on s'arrete tout de suite
return (debut);
precedent = debut;
if (strcmp(precedent->nom,ptab)== 0) // Verifie la tete de liste, cas particulier
{
debut = precedent->next;
free(precedent);
return (debut);
}
courant = precedent->next; // le cas n est gere on se place donc sur le cas n+1
while(courant != NULL) // On Mouline est on supprime si on trouve l'element
{
if (strcmp(precedent->nom,ptab)== 0)
{
precedent->next = courant->next;
free(courant);
return (debut);
}
precedent = courant; // pour ce souvenir dans la prochaine iteration du precedent
courant = courant->next;
}
return debut;
}
*/
struct sport* supprimer(struct sport *debut)// cette fonction ne va pas bien
{
char ptab[20];
struct sport *courant;
struct sport*precedent;
precedent = NULL;
printf("Entrez le nom a supprimer : " );
fflush(stdin);
fgets(ptab,20,stdin);
courant = debut;
if (debut!=NULL && strcmp(ptab,courant->nom) == 0)/// on supprime la tete
{
supprimersousliste(courant->liste);
//free(courant);
debut=debut->next;
free(courant);
return debut;
}
else{
while(courant!=NULL && strcmp(ptab,courant->nom)!=0)
{
precedent = courant;
courant= courant->next;
}
if(courant!=NULL && strcmp(ptab,courant->nom)==0 )
{supprimersousliste(courant->liste);
// free(courant);
precedent->next=courant->next;
//courant->next=NULL;
free(courant);
// return(debut);
}
else
{
printf("le nom n'est pas present" );
}
}
return debut;
}
struct joueurs*supprimersousliste(struct joueurs*debut )
{
struct joueurs *tmpjoueurs;//element a supprimer
while(debut!=NULL){
tmpjoueurs=debut;
debut=debut->next;
free(tmpjoueurs);
}
return debut;
}
void liberationmemoireapresquitterprogramme(struct sport*debut)
{
struct joueurs *joueurcourant;
struct sport *sportcourant = debut;
while (sportcourant!=NULL) {
joueurcourant = sportcourant->liste;
while (joueurcourant!=NULL) {
struct joueurs *tempjoueur = joueurcourant;
joueurcourant = joueurcourant->next;
free(tempjoueur );
}
struct sport *tempsport = sportcourant;
sportcourant = sportcourant->next;
free(tempsport);
}
}
/*struct sport *supprimerjoueur(struct sport*debut)
{
//short choix=0;
int trouve=0;
char ptabjoueu[20];//nom a rechercher
printf("Quel joueur voulez vous supprimer: " );
fflush(stdin);
fgets(ptabjoueu,20,stdin);
struct sport*tempsport;
struct joueurs*courant=NULL;
struct joueurs*tempjoueur=courant;
struct joueurs*prev;
tempsport=debut;
while(tempsport!=NULL && trouve==0)
{
courant=tempsport->liste;
while(courant!=NULL && strcmp(ptabjoueu,courant->nom)!=0)
{
prev=courant;
courant=courant->next;
}
if(strcmp(courant->nom,ptabjoueu)==0)
{
prev->next=courant->next;
free(courant);
trouve=1;
}
tempsport=tempsport->next;
}
return debut;
}*/
struct sport* bonnesuppressionjoueur(struct sport*debut)
{
struct sport *tempsport;
struct joueurs*tempjoueur;
struct joueurs*prev;
char ptabspor[20];
char ptabjoueu[20];
printf(" Dans quel sport voulez vous supprimer un joueur : " );
fflush(stdin);
fgets(ptabspor,20,stdin);
printf("Quel joueur voulez vous supprimer : " );
fflush(stdin);
fgets(ptabjoueu,20,stdin);
tempsport=debut;
while(tempsport!=NULL && strcmp(ptabspor,tempsport->nom)>0)
{
tempsport=tempsport->next;
}
if(tempsport!=NULL &&strcmp(ptabspor,tempsport->nom)==0)
{
tempjoueur=tempsport->liste;
if(tempjoueur!=NULL && strcmp(ptabjoueu,tempjoueur->nom)==0)
{
struct joueurs*courant=tempjoueur;
tempjoueur=tempjoueur->next;
free(courant);
}
else{
while(tempjoueur!=NULL && strcmp(ptabjoueu,tempjoueur->nom)>0)
{
prev=tempjoueur;
tempjoueur = tempjoueur->next;
}
if(tempjoueur !=NULL&&strcmp(ptabjoueu,tempjoueur->nom)==0)
{
prev->next=tempjoueur->next;
free(tempjoueur);
}
}
}
return debut;
}