langage c et liste chainee

langage c et liste chainee - C - Programmation

Marsh Posté le 15-08-2016 à 14:41:55    

Bonjour,
 
j'ai fait un programme complet pour les listes chainees mais j'ai une fonction de suppression qui ne fonctionne pas. Est ce possible de me dire ce qui ne marche pas dans la fonction supprimer ? la fonction supprimer est à la fin du programme.
le programme peut être compilé avec un compilateur et fonctionne sauf supprimer.
 
si j'encode foot platini 58 judo rinner 30 karate lee 78  
 
quand je supprime platini et que je reaffiche alors ça supprime foot platini mais l'age n'est pas supprime  
 
quand je supprimme judo alors là ça supprime bien  
 
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<string.h>
  4. struct joueurs{
  5. char nom[20];
  6. short age;
  7. struct joueurs *next;
  8. };
  9. struct sport{
  10. char nom[20];
  11. struct joueurs *liste;
  12. struct sport *next;
  13. };
  14. struct sport *insersport(struct sport *debut,struct sport *inser,struct joueurs*inserjoueur);
  15. struct joueurs *inserjoueur(struct joueurs *debut,struct joueurs *inser);
  16. struct sport*creer();
  17. struct sport *encodage(struct sport *debut);
  18. void affichage(struct sport*debut);
  19. void affichagesport(struct sport*debut);
  20. struct sport* modifjoueur(struct sport*debut);
  21. void recherchemodifjoueur(struct sport*debut);
  22. struct sport* supprimer(struct sport *debut);
  23. struct joueurs* supprimersousliste(struct joueurs*debut );
  24. //struct sport* supprimerElement(struct sport* debut);
  25. int main()
  26. {
  27.     int choix=0;
  28.     int r=1;
  29.   //  int i=0;
  30.     //int nbl=0;
  31.     struct sport *liste;
  32.     liste = creer();
  33. //menu
  34.     do
  35.     {
  36.         printf("(1)Pour afficher la liste des joueurs d'un sport recherche" );
  37.         printf("\n(2)Pour afficher la liste de tous les sports et des joueurs\n(3)Pour rechercher un joueur et le modifier" );
  38.         printf("\n(4)Pour encoder des sports et des joueurs" );
  39.         printf("\n(5)Pour supprimer un sport recherche" );
  40.         printf("\n(6)pour quitter taper autre touche" );
  41.         printf("\nQuel est votre choix : " );
  42.         fflush(stdin);
  43.         scanf("%d",&choix);
  44.         switch(choix)
  45.         {
  46.         case 1:affichagesport(liste);
  47.             break;
  48.         case 2:affichage(liste);
  49.             break;
  50.         case 3: recherchemodifjoueur(liste);
  51.             break;
  52.         case 4:
  53.            // printf("\nCombien de sport voulez vous encoder : " );
  54.            // fflush(stdin);
  55.           //  scanf("%d",&nbl);
  56.            // while(i<nbl){
  57.             liste=encodage(liste);
  58.            // i++;
  59.            // }
  60.             break;
  61.         case 5:
  62.                 //supprimerElement(liste);
  63.                 supprimer(liste);
  64.                 break;
  65.         default: r=0;
  66.         }
  67.     }while(r==1);
  68.     return 0;
  69. }
  70. /*ça s'appelle l'entete
  71. I: un pointeur de sport qui est la tête de liste, un pointeur de structure sport à inserer dans la liste, un pointeur
  72. de structure joueur à inserer dans la liste
  73. P: inserer un sport et inserer un joueur
  74. O: elle retourne le pointeur de début de liste
  75. */
  76. struct sport *insersport(struct sport *debut,struct sport *inser,struct joueurs*insertjoueur)
  77. {
  78.     struct sport *courant, *prev;
  79.     courant =NULL;
  80.     prev=NULL;
  81.     courant = debut;
  82.     if(debut==NULL || strcmp(debut->nom,inser->nom)>0)// si debut est après inser
  83.     {
  84.         inser->next=debut;
  85.         debut=inser;
  86.         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 ?
  87.     }
  88.     else
  89.         {
  90.             while(courant!=NULL && strcmp(inser->nom,courant->nom)>0)// (inser est alphabétiquement avant courant) inser plus grand que courant
  91.             {
  92.                 prev=courant;
  93.                 courant=courant->next;
  94.             }
  95.             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
  96.             {
  97.                 courant->liste = inserjoueur(courant->liste,insertjoueur);
  98.             }
  99.             else// inser n'est pas present dans la liste et on insere inser et ensuite on insere le joueur
  100.             {
  101.                 prev->next=inser;
  102.                 inser->next=courant;
  103.                 inser->liste = inserjoueur(inser->liste,insertjoueur);
  104.             }
  105.         }
  106.         return debut;
  107. }
  108. /*
  109. I: tête de liste de la structure joueur et pointeur de structure joueur qui est un element à inserer
  110. P: elle insere un joueur en tête de liste pile
  111. O: elle retourne le pointeur de début de liste
  112. */
  113. struct joueurs *inserjoueur(struct joueurs *debut,struct joueurs *inser)// on insere joueur en tete de liste pile
  114. {
  115.     inser->next=debut;
  116.     debut=inser;
  117.     return debut;
  118. }
  119. /*
  120. I: pointeur de tete de liste de la structure sport
  121. P: encoder des sports et des joueurs et l'inserer au bon endroit
  122. O: pointeur de début de liste (tete de liste)de la structure sport
  123. */
  124. struct sport *encodage(struct sport *debut)//une seule structure car joueur est une sous liste
  125. {
  126.     struct sport *newsport;
  127.     struct joueurs *newjoueur;
  128.     newsport= malloc (sizeof(struct sport));
  129.     if(newsport!=NULL)
  130.     {
  131.         newjoueur=malloc(sizeof(struct joueurs));
  132.             if(newjoueur!=NULL)
  133.             {
  134.                 newjoueur->next = NULL;
  135.                 newsport->next = NULL;
  136.                 newsport->liste = NULL;
  137.                 printf("Entrez le sport : " );
  138.                 fflush(stdin);
  139.                 fgets(newsport->nom,20,stdin);
  140.                 printf("Entrez le joueur : " );
  141.                 fflush(stdin);
  142.                 fgets(newjoueur->nom,20,stdin);
  143.                 printf("Entrez l'age : " );
  144.                 fflush(stdin);
  145.                 scanf("%hd",&newjoueur->age);
  146.                 debut=insersport(debut,newsport,newjoueur);
  147.                 }
  148.             }
  149.     return debut;
  150. }
  151. /*
  152. I: pointeur de tête de liste de la structure sport
  153. P: affiche la liste des sports et des joueurs
  154. O: /
  155. */
  156. void affichage(struct sport*debut)
  157. {
  158.     struct sport *tempsport;
  159.     struct joueurs*tempjoueur;
  160.     if(debut!=NULL)
  161.         {
  162.             tempsport = debut;
  163.             while(tempsport!=NULL)
  164.             {
  165.                 printf("%s :\n",tempsport->nom);
  166.                 tempjoueur = tempsport->liste;
  167.                 while(tempjoueur!=NULL)
  168.                 {
  169.                     printf("%s,\n",tempjoueur->nom);
  170.                     printf("%hd\n",tempjoueur->age);
  171.                     tempjoueur=tempjoueur->next;
  172.                 }
  173.                 tempsport=tempsport->next;
  174.             }
  175.         }
  176.         else
  177.         {
  178.             printf("\nil n'a aucune liste de sport" );
  179.         }
  180. }
  181. /*
  182. I: pointeur de tete de liste de la structure sport
  183. P: affiche  liste joueur d'un sport demandé à l'utilisateur
  184. O:/
  185. */
  186. void affichagesport(struct sport*debut)
  187. {
  188.     struct sport *tempsport;
  189.     struct joueurs *tempjoueur;
  190.     //struct joueurs *prevjoueur;
  191.     char ptab[20];
  192.     printf("Vous voulez la liste des joueurs de quel sport : " );
  193.     fflush(stdin);
  194.     fgets(ptab,20,stdin);
  195.     tempsport=debut;
  196.     while(tempsport!=NULL && strcmp(ptab,tempsport->nom)> 0)//ptab>tempsport tant que ptab est alphabétiquement après tempsport tempsportnom
  197.     {
  198.         tempsport=tempsport->next;
  199.     }
  200.     if(tempsport!=NULL && strcmp(ptab,tempsport->nom)==0)
  201.     {
  202.         tempjoueur=tempsport->liste;
  203.         while(tempjoueur!=NULL)
  204.         {
  205.           printf("%s, %hd; ",tempjoueur->nom,tempjoueur->age);
  206.           tempjoueur=tempjoueur->next;
  207.         }
  208.     }
  209.     else
  210.     {
  211.         printf("\nLE NOM N EST PAS PRESENT" );
  212.     }
  213. }
  214. /*
  215. I: pointeur de tete de liste de la structure sport
  216. P: modification de joueur
  217. O: pointeur de tête de liste de la structure sport
  218. */
  219. struct sport* modifjoueur(struct sport*debut)
  220. {
  221.     struct sport *tempsport;
  222.     struct joueurs*tempjoueur;
  223. char ptabspor[20];
  224. char ptabjoueu[20];
  225. printf(" Dans quel sport voulez vous modifier un joueur : " );
  226. fflush(stdin);
  227. fgets(ptabspor,20,stdin);
  228. printf("Quel joueur voulez vous modifier : " );
  229. fflush(stdin);
  230. fgets(ptabspor,20,stdin);
  231. tempsport=debut;
  232. while(tempsport!=NULL && strcmp(ptabspor,tempsport->nom)>0)
  233. {
  234.      tempsport=tempsport->next;
  235. }
  236. if(tempsport!=NULL &&strcmp(ptabspor,tempsport->nom)==0)
  237. {
  238.      tempjoueur=tempsport->liste;
  239.     // prev=tempjoueur;
  240.      //tempjoueur=temjoueur->next
  241.      while(tempjoueur!=NULL && strcmp(ptabjoueu,tempjoueur->nom)>0)
  242.      {
  243.         tempjoueur = tempjoueur->next;
  244.      }
  245.      if(tempjoueur !=NULL&&strcmp(ptabjoueu,tempjoueur->nom)==0)
  246.         {
  247.             short choix=0;
  248.         printf("que voulez vous modifier (1) age (2) nom:" );
  249.         fflush(stdin);
  250.         scanf("%hd",&choix);
  251.         switch(choix){
  252.         case 1:
  253.             printf("entrer l'age:" );
  254.             fflush(stdin);
  255.             scanf("%hd",&tempjoueur->age);
  256.             break;
  257.         case 2:
  258.             printf("entre le nom:" );
  259.             fflush(stdin);
  260.             fgets(tempjoueur->nom,20,stdin);
  261.             break;
  262.         }
  263.      }
  264. }
  265. return debut;
  266. }
  267. /*
  268. I: pointeur de tete de liste de la structure sport
  269. P: modification d'un joueur
  270. O: /
  271. */
  272. void recherchemodifjoueur(struct sport*debut)
  273. {
  274.     short choix=0;
  275.     int trouve=0;
  276.     char ptabjoueu[20];//nom a rechercher
  277.     printf("Quel joueur recherchez vous : " );
  278.     fflush(stdin);
  279.     fgets(ptabjoueu,20,stdin);
  280.     struct sport*tempsport;
  281.     struct joueurs*tempjoueur;
  282.     tempsport=debut;
  283.     while(tempsport!=NULL&& trouve==0)
  284.     {
  285.         tempjoueur=tempsport->liste;
  286.         while(tempjoueur!=NULL && trouve==0)
  287.         {
  288.             if(strcmp(tempjoueur->nom,ptabjoueu)==0)
  289.             {
  290.                 trouve=1;
  291.             }else
  292.             {
  293.                 tempjoueur=tempjoueur->next;
  294.             }
  295.         }
  296.         tempsport=tempsport->next;
  297.     }
  298.     if(trouve ==1)
  299.     {
  300.         printf("que voulez vous modifier : (1)l'age\n(2)le nom" );
  301.         fflush(stdin);
  302.         scanf("%hd",&choix);
  303.         switch(choix)
  304.         {
  305.         case 1:
  306.             printf("Entrez l'age : " );
  307.             fflush(stdin);
  308.             scanf("%hd",&tempjoueur->age);
  309.             break;
  310.         case 2:
  311.             printf("Entrez le nom : " );
  312.             fflush(stdin);
  313.             fgets(tempjoueur->nom,20,stdin);
  314.         }
  315.     }
  316. }
  317. /*
  318. I: /
  319. P: creation d'une liste
  320. O: retourne un pointeur null
  321. */
  322. struct sport*creer()
  323. {
  324.    return NULL;
  325. }
  326. /*struct sport* supprimerElement(struct sport* debut)
  327. {
  328.      char ptab[20];
  329.     struct sport *courant;
  330.     struct sport*precedent;
  331.     precedent = NULL;
  332. printf("Entrez le nom a supprimer : " );
  333. fflush(stdin);
  334. fgets(ptab,20,stdin);
  335. courant = debut;
  336. if (debut == NULL) // si la liste est NULL on s'arrete tout de suite
  337.   return (debut);
  338. precedent = debut;
  339. if (strcmp(precedent->nom,ptab)== 0) // Verifie la tete de liste, cas particulier
  340. {
  341.   debut = precedent->next;
  342.   free(precedent);
  343.   return (debut);
  344. }
  345. courant = precedent->next; // le cas n est gere on se place donc sur le cas n+1
  346. while(courant != NULL) // On Mouline est on supprime si on trouve l'element
  347. {
  348. if (strcmp(precedent->nom,ptab)== 0)
  349.   {
  350.     precedent->next = courant->next;
  351.     free(courant);
  352.     return (debut);
  353.   }
  354.   precedent = courant; // pour ce souvenir dans la prochaine iteration du precedent
  355.   courant = courant->next;
  356. }
  357. return debut;
  358. }
  359. */
  360. struct sport* supprimer(struct sport *debut)// cette fonction ne va pas bien
  361. {
  362.     char ptab[20];
  363.     struct sport *courant;
  364.     struct sport*precedent;
  365.     precedent = NULL;
  366. printf("Entrez le nom a supprimer : " );
  367. fflush(stdin);
  368. fgets(ptab,20,stdin);
  369. courant = debut;
  370.     if (debut!=NULL && strcmp(ptab,courant->nom) == 0)/// on supprime la tete
  371.     {
  372. supprimersousliste(courant->liste);
  373. //free(courant);
  374.         debut=debut->next;
  375.         free(courant);
  376.         return debut;
  377.     }
  378.     else{
  379.        while(courant!=NULL && strcmp(ptab,courant->nom)>0)
  380.          {
  381.              precedent = courant;
  382.              courant= courant->next;
  383.          }
  384.          if(courant!=NULL && strcmp(ptab,courant->nom)==0 )
  385.          {supprimersousliste(courant->liste);
  386.         // free(courant);
  387.             precedent->next=courant->next;
  388.             //courant->next=NULL;
  389.              free(courant);
  390.              return(debut);
  391.          }
  392.          else
  393.              {
  394.                 printf("le nom n'est pas present" );
  395.             }
  396. }
  397. return debut;
  398. }
  399. struct joueurs*supprimersousliste(struct joueurs*debut )
  400. {
  401.     struct joueurs *tmpjoueurs;//element a supprimer
  402.     while(debut!=NULL){
  403. tmpjoueurs=debut;
  404. debut=debut->next;
  405. free(tmpjoueurs);
  406.     }
  407. return debut;
  408. }

Reply

Marsh Posté le 15-08-2016 à 14:41:55   

Reply

Marsh Posté le 15-08-2016 à 18:12:57    

Code :
  1. case 5:
  2.   //supprimerElement(liste);
  3.   liste = supprimer(liste);
  4.   break;


 
Et perso, ta fonction supprimer, je la coderais ainsi;
 
 

Code :
  1. void supprimersousliste(struct joueurs* debut );
  2. ......................................................................
  3. struct sport* supprimer(struct sport *debut) {
  4.     struct sport *courant = debut;
  5.     struct sport *precedent = NULL;
  6.     char ptab[20];
  7. // récupération du nom de sport à supprimer
  8. printf("Entrez le nom a supprimer : " );
  9. fflush(stdin);
  10. fgets(ptab, 20, stdin);
  11. while (courant) {
  12.  if (!strcmp(ptab, courant->nom)) {
  13.   // d'abord on sort l'élément de la liste
  14.   if (precedent) {
  15.    precedent->next = courant->next;
  16.   }
  17.   else {
  18.    debut = courant->next;
  19.   }
  20.   // et ensuite on le supprime
  21.   supprimersousliste(courant->liste);
  22.   free(courant);
  23.   break;
  24.  }
  25.  precedent = courant;
  26.  courant = courant->next;
  27.  if (!courant) {
  28.   printf("Le sport n'est pas present dans la liste" );
  29.  }
  30. }
  31. return debut;
  32. }
  33. void supprimersousliste(struct joueurs *debut ) {
  34.     while (debut) {
  35.  struct joueurs *tmp = debut;
  36.  debut = debut->next;
  37.  free(tmp);
  38.     }
  39. }


 
Ou alors ainsi:

Code :
  1. void supprimer(struct sport **debut);
  2. void supprimersousliste(struct joueurs* debut );
  3. ......................................................................
  4.  case 5:
  5.   //supprimerElement(liste);
  6.   supprimer(&liste);
  7.   break;
  8. ......................................................................
  9. void supprimer(struct sport **debut) {
  10.     struct sport *courant = *debut;
  11.     struct sport *precedent = NULL;
  12.     char ptab[20];
  13. // récupération du nom de sport à supprimer
  14. printf("Entrez le nom a supprimer : " );
  15. fflush(stdin);
  16. fgets(ptab, 20, stdin);
  17. while (courant) {
  18.  if (!strcmp(ptab, courant->nom)) {
  19.   // d'abord on sort l'élément de la liste
  20.   if (precedent) {
  21.    precedent->next = courant->next;
  22.   }
  23.   else {
  24.    *debut = courant->next;
  25.   }
  26.   // et ensuite on le supprime
  27.   supprimersousliste(courant->liste);
  28.   free(courant);
  29.   break;
  30.  }
  31.  precedent = courant;
  32.  courant = courant->next;
  33.  if (!courant) {
  34.   printf("Le sport n'est pas present dans la liste" );
  35.  }
  36. }
  37. }
  38. void supprimersousliste(struct joueurs *debut ) {
  39.     while (debut) {
  40.  struct joueurs *tmp = debut;
  41.  debut = debut->next;
  42.  free(tmp);
  43.     }
  44. }


A+,


Message édité par gilou le 15-08-2016 à 18:26:06

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-08-2016 à 18:26:21    

pour la ligne 14 ç'est quoi la condition du if (precedent)?
ç'est if (precedent==0)??  
je viens de compiler mais ta solution ne marche pas ç'est toujours le meme problème pour l'affichage ensuite car elle affiche l'age de l'element supprimé si il est en debut de liste

Reply

Marsh Posté le 15-08-2016 à 18:28:23    

si quelqu'un poste une réponse je vous prie de la compiler avant sinon ça sert à rien de faire quelque chose de tete si on est pas sur

Reply

Marsh Posté le 15-08-2016 à 18:29:01    

j'ai mis le code complet et y a que supprimer qui marche pas bien merci d'avance et merci de COMPILER AVANT DE DIRE QUE C EST RESOLU

Reply

Marsh Posté le 15-08-2016 à 18:39:39    

Merci ta deuxième solution fonctionne parfaitement j'imagine que ç'est pas une grande difference si tu utilises despointeurs de pointeurs ? parce que la première solution ne fonctionne pas et seule la solution avec les pointeurs de pointeur fonctionne... je maitrise pas les pointeurs de pointeurs mais j'imagine que ç'est pas une grande différence dans le code

Reply

Marsh Posté le 15-08-2016 à 18:55:40    

La première solution fonctionnait aussi bien que la seconde chez moi, mais j'avais déjà modifié ton code. Ce qui se passait c'est que en faisant supprimer(debut) tu ne permettais pas à debut de changer, ce qui était nécessaire, si c'était le 1er qui était à supprimer.
D'ou soit faire liste=supprimer(liste) avec une fonction qui retourne la liste modifiée soit faire supprimer(&liste) ce qui permet de modifier la valeur de liste dans la fonction.
 
Un ou deux typedefs n'auraient pas fait de mal non plus. Ainsi que des espaces dans le code.
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. struct joueur {
  5.     char nom[20];
  6.     short age;
  7.     struct joueur *next;
  8. };
  9. typedef struct joueur *liste_joueurs;
  10. struct sport {
  11.     char nom[20];
  12.     liste_joueurs liste;
  13.     struct sport *next;
  14. };
  15. typedef struct sport *liste_sports;
  16. liste_sports insersport(liste_sports debut, liste_sports inser, liste_joueurs inserjoueur);
  17. liste_joueurs inserjoueur(liste_joueurs debut, liste_joueurs inser);
  18. liste_sports creer();
  19. liste_sports encodage(liste_sports debut);
  20. void affichage(liste_sports debut);
  21. void affichagesport(liste_sports debut);
  22. liste_sports modifjoueur(liste_sports debut);
  23. void recherchemodifjoueur(liste_sports debut);
  24. void supprimer(liste_sports *debut);
  25. void supprimersousliste(liste_joueurs debut );
  26. //liste_sports supprimerElement(liste_sports debut);
  27. int main() {
  28.     int choix = 0;
  29.     int r = 1;
  30.     //  int i = 0;
  31.     //int nbl = 0;
  32.     liste_sports liste;
  33.     liste = creer();
  34.     //menu
  35.     do {
  36.         printf("(1)Pour afficher la liste des joueurs d'un sport recherche" );
  37.         printf("\n(2)Pour afficher la liste de tous les sports et des joueurs\n(3)Pour rechercher un joueur et le modifier" );
  38.         printf("\n(4)Pour encoder des sports et des joueurs" );
  39.         printf("\n(5)Pour supprimer un sport recherche" );
  40.         printf("\n(6)Pour quitter taper autre touche" );
  41.         printf("\nQuel est votre choix : " );
  42.         fflush(stdin);
  43.         scanf("%d", &choix);
  44.         switch (choix) {
  45.         case 1:
  46.             affichagesport(liste);
  47.             break;
  48.         case 2:
  49.             affichage(liste);
  50.             break;
  51.         case 3:
  52.             recherchemodifjoueur(liste);
  53.             break;
  54.         case 4:
  55.             // printf("\nCombien de sport voulez vous encoder : " );
  56.             // fflush(stdin);
  57.             //  scanf("%d", &nbl);
  58.             // while(i < nbl) {
  59.             liste = encodage(liste);
  60.             // i++;
  61.             // }
  62.             break;
  63.         case 5:
  64.             //supprimerElement(liste);
  65.             supprimer(&liste);
  66.             break;
  67.         default:
  68.             r = 0;
  69.         }
  70.     } while (r == 1);
  71.     return 0;
  72. }
  73. /*ça s'appelle l'entete
  74.   I: un pointeur de sport qui est la tête de liste, un pointeur de structure sport à inserer dans la liste, un pointeur
  75.   de structure joueur à inserer dans la liste
  76.   P: inserer un sport et inserer un joueur
  77.   O: elle retourne le pointeur de début de liste
  78. */
  79. liste_sports insersport(liste_sports debut, liste_sports inser, liste_joueurs insertjoueur) {
  80.     liste_sports courant, prev;
  81.     courant = NULL;
  82.     prev = NULL;
  83.     courant = debut;
  84.     // si debut est après inser
  85.     if (debut == NULL || strcmp(debut->nom, inser->nom) > 0) {
  86.         inser->next = debut;
  87.         debut = inser;
  88.         //inser est le nouvel element que j'ai inseré donc le chainage se fait avec ce nom logique non ?
  89.         inser->liste = inserjoueur(inser->liste, insertjoueur);
  90.     } else {
  91.         // (inser est alphabétiquement avant courant) inser plus grand que courant
  92.         while (courant != NULL && strcmp(inser->nom, courant->nom) > 0) {
  93.             prev=courant;
  94.             courant=courant->next;
  95.         }
  96.         //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
  97.         if (courant != NULL  && strcmp(courant->nom,inser->nom)==0) {
  98.             courant->liste = inserjoueur(courant->liste, insertjoueur);
  99.         }
  100.         // inser n'est pas present dans la liste et on insere inser et ensuite on insere le joueur
  101.         else {
  102.             prev->next=inser;
  103.             inser->next=courant;
  104.             inser->liste = inserjoueur(inser->liste, insertjoueur);
  105.         }
  106.     }
  107.     return debut;
  108. }
  109. /*
  110.   I: tête de liste de la structure joueur et pointeur de structure joueur qui est un element à inserer
  111.   P: elle insere un joueur en tête de liste pile
  112.   O: elle retourne le pointeur de début de liste
  113. */
  114. // on insere joueur en tete de liste pile
  115. liste_joueurs inserjoueur(liste_joueurs debut, liste_joueurs inser) {
  116.     inser->next = debut;
  117.     debut = inser;
  118.     return debut;
  119. }
  120. /*
  121.   I: pointeur de tete de liste de la structure sport
  122.   P: encoder des sports et des joueurs et l'inserer au bon endroit
  123.   O: pointeur de début de liste (tete de liste)de la structure sport
  124. */
  125. //une seule structure car joueur est une sous liste
  126. liste_sports encodage(liste_sports debut) {
  127.     liste_sports newsport;
  128.     liste_joueurs newjoueur;
  129.     newsport = malloc(sizeof(struct sport));
  130.     if (newsport != NULL) {
  131.         newjoueur = malloc(sizeof(struct joueur));
  132.         if (newjoueur != NULL) {
  133.             newjoueur->next = NULL;
  134.             newsport->next = NULL;
  135.             newsport->liste = NULL;
  136.             printf("Entrez le sport : " );
  137.             fflush(stdin);
  138.             fgets(newsport->nom, 20, stdin);
  139.             printf("Entrez le joueur : " );
  140.             fflush(stdin);
  141.             fgets(newjoueur->nom, 20, stdin);
  142.             printf("Entrez l'age : " );
  143.             fflush(stdin);
  144.             scanf("%hd", &newjoueur->age);
  145.             debut = insersport(debut, newsport, newjoueur);
  146.         }
  147.     }
  148.     return debut;
  149. }
  150. /*
  151.   I: pointeur de tête de liste de la structure sport
  152.   P: affiche la liste des sports et des joueurs
  153.   O: /
  154. */
  155. void affichage(struct sport*debut) {
  156.     liste_sports tempsport;
  157.     liste_joueurs tempjoueur;
  158.     if (debut != NULL) {
  159.         tempsport = debut;
  160.         while (tempsport != NULL) {
  161.             printf("%s :\n", tempsport->nom);
  162.             tempjoueur = tempsport->liste;
  163.             while (tempjoueur != NULL) {
  164.                 printf("%s,\n", tempjoueur->nom);
  165.                 printf("%hd\n", tempjoueur->age);
  166.                 tempjoueur = tempjoueur->next;
  167.             }
  168.             tempsport = tempsport->next;
  169.         }
  170.     } else {
  171.         printf("\nil n'a aucune liste de sport" );
  172.     }
  173. }
  174. /*
  175.   I: pointeur de tete de liste de la structure sport
  176.   P: affiche  liste joueur d'un sport demandé à l'utilisateur
  177.   O:/
  178. */
  179. void affichagesport(liste_sports debut) {
  180.     liste_sports tempsport;
  181.     liste_joueurs tempjoueur;
  182.     //liste_joueurs prevjoueur;
  183.     char ptab[20];
  184.     printf("Vous voulez la liste des joueurs de quel sport : " );
  185.     fflush(stdin);
  186.     fgets(ptab, 20, stdin);
  187.     tempsport = debut;
  188.     //ptab > tempsport tant que ptab est alphabétiquement après tempsport tempsportnom
  189.     while (tempsport != NULL && strcmp(ptab,tempsport->nom) > 0) {
  190.         tempsport = tempsport->next;
  191.     }
  192.     if (tempsport != NULL && strcmp(ptab, tempsport->nom) == 0) {
  193.         tempjoueur = tempsport->liste;
  194.         while (tempjoueur!=NULL) {
  195.             printf("%s, %hd; ", tempjoueur->nom, tempjoueur->age);
  196.             tempjoueur = tempjoueur->next;
  197.         }
  198.     } else {
  199.         printf("\nLE NOM N EST PAS PRESENT" );
  200.     }
  201. }
  202. /*
  203.   I: pointeur de tete de liste de la structure sport
  204.   P: modification de joueur
  205.   O: pointeur de tête de liste de la structure sport
  206. */
  207. liste_sports modifjoueur(liste_sports debut) {
  208.     liste_sports tempsport;
  209.     liste_joueurs tempjoueur;
  210.     char ptabspor[20];
  211.     char ptabjoueu[20];
  212.     printf(" Dans quel sport voulez vous modifier un joueur : " );
  213.     fflush(stdin);
  214.     fgets(ptabspor, 20, stdin);
  215.     printf("Quel joueur voulez vous modifier : " );
  216.     fflush(stdin);
  217.     fgets(ptabspor, 20, stdin);
  218.     tempsport = debut;
  219.     while (tempsport != NULL && strcmp(ptabspor, tempsport->nom) > 0) {
  220.         tempsport=tempsport->next;
  221.     }
  222.     if (tempsport != NULL && strcmp(ptabspor, tempsport->nom) == 0) {
  223.         tempjoueur = tempsport->liste;
  224.         // prev = tempjoueur;
  225.         //tempjoueur = temjoueur->next
  226.         while (tempjoueur != NULL && strcmp(ptabjoueu, tempjoueur->nom) > 0) {
  227.             tempjoueur = tempjoueur->next;
  228.         }
  229.         if(tempjoueur != NULL && strcmp(ptabjoueu, tempjoueur->nom) == 0) {
  230.             short choix = 0;
  231.             printf("que voulez vous modifier (1) age (2) nom:" );
  232.             fflush(stdin);
  233.             scanf("%hd", &choix);
  234.             switch (choix) {
  235.             case 1:
  236.                 printf("entrer l'age:" );
  237.                 fflush(stdin);
  238.                 scanf("%hd", &tempjoueur->age);
  239.                 break;
  240.             case 2:
  241.                 printf("entre le nom:" );
  242.                 fflush(stdin);
  243.                 fgets(tempjoueur->nom, 20, stdin);
  244.                 break;
  245.             }
  246.         }
  247.     }
  248.     return debut;
  249. }
  250. /*
  251.   I: pointeur de tete de liste de la structure sport
  252.   P: modification d'un joueur
  253.   O: /
  254. */
  255. void recherchemodifjoueur(liste_sports debut) {
  256.     short choix = 0;
  257.     int trouve = 0;
  258.     char ptabjoueu[20]; //nom a rechercher
  259.     printf("Quel joueur recherchez vous : " );
  260.     fflush(stdin);
  261.     fgets(ptabjoueu, 20, stdin);
  262.     liste_sports tempsport;
  263.     liste_joueurs tempjoueur;
  264.     tempsport = debut;
  265.     while (tempsport != NULL && trouve == 0) {
  266.         tempjoueur = tempsport->liste;
  267.         while (tempjoueur != NULL && trouve==0) {
  268.             if (strcmp(tempjoueur->nom, ptabjoueu) == 0) {
  269.                 trouve = 1;
  270.             } else {
  271.                 tempjoueur = tempjoueur->next;
  272.             }
  273.         }
  274.         tempsport = tempsport->next;
  275.     }
  276.     if (trouve == 1) {
  277.         printf("que voulez vous modifier : (1)l'age\n(2)le nom" );
  278.         fflush(stdin);
  279.         scanf("%hd", &choix);
  280.         switch (choix) {
  281.         case 1:
  282.             printf("Entrez l'age : " );
  283.             fflush(stdin);
  284.             scanf("%hd", &tempjoueur->age);
  285.             break;
  286.         case 2:
  287.             printf("Entrez le nom : " );
  288.             fflush(stdin);
  289.             fgets(tempjoueur->nom, 20, stdin);
  290.         }
  291.     }
  292. }
  293. /*
  294.   I: /
  295.   P: creation d'une liste
  296.   O: retourne un pointeur null
  297. */
  298. liste_sports creer() {
  299.     return NULL;
  300. }
  301. void supprimer(liste_sports *debut) {
  302.     liste_sports courant = *debut;
  303.     liste_sports precedent = NULL;
  304.     char ptab[20];
  305.     // récupération du nom de sport à supprimer
  306.     printf("Entrez le nom a supprimer : " );
  307.     fflush(stdin);
  308.     fgets(ptab, 20, stdin);
  309.     while (courant) {
  310.         if (!strcmp(ptab, courant->nom)) {
  311.             // d'abord on sort l'élément de la liste
  312.             if (precedent) {
  313.                 precedent->next = courant->next;
  314.             } else {
  315.                 *debut = courant->next;
  316.             }
  317.             // et ensuite on le supprime
  318.             supprimersousliste(courant->liste);
  319.             free(courant);
  320.             break;
  321.         }
  322.         precedent = courant;
  323.         courant = courant->next;
  324.         if (!courant) {
  325.             printf("Le sport n'est pas present dans la liste" );
  326.         }
  327.     }
  328. }
  329. void supprimersousliste(liste_joueurs debut) {
  330.     while (debut) {
  331.         liste_joueurs tmp = debut;
  332.         debut = debut->next;
  333.         free(tmp);
  334.     }
  335. }


 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-08-2016 à 19:17:36    

un grand merci à toi car les deux réponses marchent. ç'est parfait. je reviens à toi dans 30 min pour quelques explications sur ton code stp ? en tout cas merci à toi résolu

Reply

Marsh Posté le 15-08-2016 à 19:33:53    

Incidemment, ta manière de procéder est mauvaise, et tu alloues de la mémoire inutile a chaque fois que tu ajoutes un joueur à la liste des sports existants.
Il faut  
1) Chercher le sport dans la liste
2) Créer la structure sport que si elle n'est pas présente dans la liste
3) insérer le joueur dans la liste des joueurs du sport résultat de la recherche/création (et vérifier d'abord qu'il n'y est pas déjà, car actuellement, ton code permet les doublons).
 
A+,


Message édité par gilou le 15-08-2016 à 19:51:47

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-08-2016 à 19:38:36    

> if (!strcmp(ptab, courant->nom)) {
C'est identique à  
 if (strcmp(ptab, courant->nom) == 0) {
 
Et c'est une habitude très courante en C d'écrire ainsi quand on compare deux chaines.
 
idem pour  
> if (precedent) {
qui est la manière usuelle d'écrire
if (precedent != NULL) {
pour un pointeur
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-08-2016 à 19:38:36   

Reply

Marsh Posté le 15-08-2016 à 20:09:11    

je ne comprends presque aucune de tes conditions quand tu mets rien du tout

Reply

Marsh Posté le 15-08-2016 à 20:16:33    

ah ça va j'ai compris dsl j'avais pas lu ton message  
j'ai une autre question est ce que ç'est possible de ne pas mettre de break ??

Reply

Marsh Posté le 15-08-2016 à 20:21:58    

je n'ai pas compris le dernier if (courant!=null)
printf(le sport n'est pas present dans la liste)
comment ça marche là ? j'ai compris ton code mais pas quand j'arrive à cette ligne car je vois pas comment ça marche

Reply

Marsh Posté le 15-08-2016 à 21:12:06    

Code :
  1. while (courant) {
  2.         if (!strcmp(ptab, courant->nom)) {
  3.             // d'abord on sort l'élément de la liste
  4.             if (precedent) {
  5.                 precedent->next = courant->next;
  6.             } else {
  7.                 *debut = courant->next;
  8.             }
  9.             // et ensuite on le supprime
  10.             supprimersousliste(courant->liste);
  11.             free(courant);
  12.             break;
  13.         }
  14.         precedent = courant;
  15.         courant = courant->next;
  16.         if (!courant) {
  17.             printf("Le sport n'est pas present dans la liste" );
  18.         }
  19.     }


Si tu as pas trouvé la chaine, tu passes a l'élément suivant:
courant = courant->next;
S'il y en a pas, tu as parcouru toute la liste sans trouver le nom du sport, d'ou le message d'erreur
if (!courant) {
            printf("Le sport n'est pas present dans la liste" );
        }
Mais en fait, ça fait pas de message pour une liste vide ça, donc ceci serait mieux:

Code :
  1. while (courant) {
  2.         if (!strcmp(ptab, courant->nom)) {
  3.             // d'abord on sort l'élément de la liste
  4.             if (precedent) {
  5.                 precedent->next = courant->next;
  6.             } else {
  7.                 *debut = courant->next;
  8.             }
  9.             // et ensuite on le supprime
  10.             supprimersousliste(courant->liste);
  11.             free(courant);
  12.             return;
  13.         }
  14.         precedent = courant;
  15.         courant = courant->next;
  16.     }
  17.     printf("Le sport n'est pas present dans la liste" );


 
A+,


Message édité par gilou le 15-08-2016 à 21:16:34

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-08-2016 à 21:14:22    

> j'ai une autre question est ce que ç'est possible de ne pas mettre de break ??
 
Tu as quoi contre les breaks? C'est particulièrement utile pour sortir d'une boucle sans compliquer inutilement le code de la boucle avec des tests verbeux.
 
A+,


Message édité par gilou le 15-08-2016 à 21:14:55

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-08-2016 à 21:20:13    

je suis en première informatique et notre prof nous interdit de mettre des break dans les codes. Merci à toi pour tes explications j'ai compris le code maintenant et à un moment je me suis dit ça aussi mais je suis pas un expert en c.

Reply

Marsh Posté le 15-08-2016 à 21:25:33    

si j'enlève le break et met le return et que je sors le if pour dire le sport n'est pas présent alors ça plante

Reply

Marsh Posté le 15-08-2016 à 21:55:29    

Code :
  1. void supprimer(liste_sports *debut) {
  2.     liste_sports courant = *debut;
  3.     liste_sports precedent = NULL;
  4.     char ptab[20];
  5.     // récupération du nom de sport à supprimer
  6.     printf("Entrez le nom a supprimer : " );
  7.     fflush(stdin);
  8.     fgets(ptab, 20, stdin);
  9.     while (courant) {
  10.         if (!strcmp(ptab, courant->nom)) {
  11.             // d'abord on sort l'élément de la liste
  12.             if (precedent) {
  13.                 precedent->next = courant->next;
  14.             } else {
  15.                 *debut = courant->next;
  16.             }
  17.             // et ensuite on le supprime
  18.             supprimersousliste(courant->liste);
  19.             free(courant);
  20.             return;
  21.         }
  22.         precedent = courant;
  23.         courant = courant->next;
  24.     }
  25. printf("Le sport n'est pas present dans la liste" );
  26. }
  27. void supprimersousliste(liste_joueurs debut) {
  28.     while (debut) {
  29.         liste_joueurs tmp = debut;
  30.         debut = debut->next;
  31.         free(tmp);
  32.     }
  33. }


Chez moi ça marche très bien.

(1)Pour afficher la liste des joueurs d'un sport recherche
(2)Pour afficher la liste de tous les sports et des joueurs
(3)Pour rechercher un joueur et le modifier
(4)Pour encoder des sports et des joueurs
(5)Pour supprimer un sport recherche
(6)Pour quitter taper autre touche
Quel est votre choix : 4
Entrez le sport : foot
Entrez le joueur : platini
Entrez l'age : 48
(1)Pour afficher la liste des joueurs d'un sport recherche
(2)Pour afficher la liste de tous les sports et des joueurs
(3)Pour rechercher un joueur et le modifier
(4)Pour encoder des sports et des joueurs
(5)Pour supprimer un sport recherche
(6)Pour quitter taper autre touche
Quel est votre choix : 4
Entrez le sport : judo
Entrez le joueur : rinner
Entrez l'age : 30
(1)Pour afficher la liste des joueurs d'un sport recherche
(2)Pour afficher la liste de tous les sports et des joueurs
(3)Pour rechercher un joueur et le modifier
(4)Pour encoder des sports et des joueurs
(5)Pour supprimer un sport recherche
(6)Pour quitter taper autre touche
Quel est votre choix : 4
Entrez le sport : karate
Entrez le joueur : lee
Entrez l'age : 70
(1)Pour afficher la liste des joueurs d'un sport recherche
(2)Pour afficher la liste de tous les sports et des joueurs
(3)Pour rechercher un joueur et le modifier
(4)Pour encoder des sports et des joueurs
(5)Pour supprimer un sport recherche
(6)Pour quitter taper autre touche
Quel est votre choix : 2
foot
 :
platini
,
48
judo
 :
rinner
,
30
karate
 :
lee
,
70
(1)Pour afficher la liste des joueurs d'un sport recherche
(2)Pour afficher la liste de tous les sports et des joueurs
(3)Pour rechercher un joueur et le modifier
(4)Pour encoder des sports et des joueurs
(5)Pour supprimer un sport recherche
(6)Pour quitter taper autre touche
Quel est votre choix : 5
Entrez le nom a supprimer : foot
(1)Pour afficher la liste des joueurs d'un sport recherche
(2)Pour afficher la liste de tous les sports et des joueurs
(3)Pour rechercher un joueur et le modifier
(4)Pour encoder des sports et des joueurs
(5)Pour supprimer un sport recherche
(6)Pour quitter taper autre touche
Quel est votre choix : 2
judo
 :
rinner
,
30
karate
 :
lee
,
70
(1)Pour afficher la liste des joueurs d'un sport recherche
(2)Pour afficher la liste de tous les sports et des joueurs
(3)Pour rechercher un joueur et le modifier
(4)Pour encoder des sports et des joueurs
(5)Pour supprimer un sport recherche
(6)Pour quitter taper autre touche
Quel est votre choix : foot
judo
 :
rinner
,
30
karate
 :
lee
,
70
(1)Pour afficher la liste des joueurs d'un sport recherche
(2)Pour afficher la liste de tous les sports et des joueurs
(3)Pour rechercher un joueur et le modifier
(4)Pour encoder des sports et des joueurs
(5)Pour supprimer un sport recherche
(6)Pour quitter taper autre touche
Quel est votre choix : 5
Entrez le nom a supprimer : foot
Le sport n'est pas present dans la liste(1)Pour afficher la liste des joueurs d'
un sport recherche
(2)Pour afficher la liste de tous les sports et des joueurs
(3)Pour rechercher un joueur et le modifier
(4)Pour encoder des sports et des joueurs
(5)Pour supprimer un sport recherche
(6)Pour quitter taper autre touche
Quel est votre choix : 5
Entrez le nom a supprimer : judo
(1)Pour afficher la liste des joueurs d'un sport recherche
(2)Pour afficher la liste de tous les sports et des joueurs
(3)Pour rechercher un joueur et le modifier
(4)Pour encoder des sports et des joueurs
(5)Pour supprimer un sport recherche
(6)Pour quitter taper autre touche
Quel est votre choix : 5
Entrez le nom a supprimer : karate
(1)Pour afficher la liste des joueurs d'un sport recherche
(2)Pour afficher la liste de tous les sports et des joueurs
(3)Pour rechercher un joueur et le modifier
(4)Pour encoder des sports et des joueurs
(5)Pour supprimer un sport recherche
(6)Pour quitter taper autre touche
Quel est votre choix : 5
Entrez le nom a supprimer : foot
Le sport n'est pas present dans la liste(1)Pour afficher la liste des joueurs d'
un sport recherche
(2)Pour afficher la liste de tous les sports et des joueurs
(3)Pour rechercher un joueur et le modifier
(4)Pour encoder des sports et des joueurs
(5)Pour supprimer un sport recherche
(6)Pour quitter taper autre touche
Quel est votre choix : 5
Entrez le nom a supprimer :
Le sport n'est pas present dans la liste(1)Pour afficher la liste des joueurs d'
un sport recherche
(2)Pour afficher la liste de tous les sports et des joueurs
(3)Pour rechercher un joueur et le modifier
(4)Pour encoder des sports et des joueurs
(5)Pour supprimer un sport recherche
(6)Pour quitter taper autre touche
Quel est votre choix : 5
Entrez le nom a supprimer : judo
Le sport n'est pas present dans la liste(1)Pour afficher la liste des joueurs d'
un sport recherche
(2)Pour afficher la liste de tous les sports et des joueurs
(3)Pour rechercher un joueur et le modifier
(4)Pour encoder des sports et des joueurs
(5)Pour supprimer un sport recherche
(6)Pour quitter taper autre touche
Quel est votre choix : 2
 
il n'a aucune liste de sport(1)Pour afficher la liste des joueurs d'un sport rec
herche
(2)Pour afficher la liste de tous les sports et des joueurs
(3)Pour rechercher un joueur et le modifier
(4)Pour encoder des sports et des joueurs
(5)Pour supprimer un sport recherche
(6)Pour quitter taper autre touche
Quel est votre choix : foot
 
il n'a aucune liste de sport(1)Pour afficher la liste des joueurs d'un sport rec
herche
(2)Pour afficher la liste de tous les sports et des joueurs
(3)Pour rechercher un joueur et le modifier
(4)Pour encoder des sports et des joueurs
(5)Pour supprimer un sport recherche
(6)Pour quitter taper autre touche
Quel est votre choix : 4
Entrez le sport : foot
Entrez le joueur : lee
Entrez l'age : 25
(1)Pour afficher la liste des joueurs d'un sport recherche
(2)Pour afficher la liste de tous les sports et des joueurs
(3)Pour rechercher un joueur et le modifier
(4)Pour encoder des sports et des joueurs
(5)Pour supprimer un sport recherche
(6)Pour quitter taper autre touche
Quel est votre choix : 2
foot
 :
lee
,
25
(1)Pour afficher la liste des joueurs d'un sport recherche
(2)Pour afficher la liste de tous les sports et des joueurs
(3)Pour rechercher un joueur et le modifier
(4)Pour encoder des sports et des joueurs
(5)Pour supprimer un sport recherche
(6)Pour quitter taper autre touche
Quel est votre choix : 5
Entrez le nom a supprimer : foot
(1)Pour afficher la liste des joueurs d'un sport recherche
(2)Pour afficher la liste de tous les sports et des joueurs
(3)Pour rechercher un joueur et le modifier
(4)Pour encoder des sports et des joueurs
(5)Pour supprimer un sport recherche
(6)Pour quitter taper autre touche
Quel est votre choix : 2
 
il n'a aucune liste de sport(1)Pour afficher la liste des joueurs d'un sport rec
herche
(2)Pour afficher la liste de tous les sports et des joueurs
(3)Pour rechercher un joueur et le modifier
(4)Pour encoder des sports et des joueurs
(5)Pour supprimer un sport recherche
(6)Pour quitter taper autre touche
Quel est votre choix : 5
Entrez le nom a supprimer : foot
Le sport n'est pas present dans la liste(1)Pour afficher la liste des joueurs d'
un sport recherche
(2)Pour afficher la liste de tous les sports et des joueurs
(3)Pour rechercher un joueur et le modifier
(4)Pour encoder des sports et des joueurs
(5)Pour supprimer un sport recherche
(6)Pour quitter taper autre touche
Quel est votre choix : 6


 
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-08-2016 à 22:00:53    

oui j'ai mis le break en commentaire et ça marche . est ce que ç'est normal ?

Reply

Marsh Posté le 15-08-2016 à 22:02:48    

en tout cas un grand merci à toi pour le temps que tu m'as accordé. je te souhaite une agréable soiree

Reply

Marsh Posté le 15-08-2016 à 22:29:07    

bjs a écrit :

oui j'ai mis le break en commentaire et ça marche . est ce que ç'est normal ?

Ben si tu as le return, oui, sinon, tu vas parcourir le reste de la liste sans rien faire, après la suppression. Pourquoi pas, mais tu pourras plus détecter si le sport était absent de la liste pour le message d'erreur.
 
A+,
 
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-08-2016 à 12:19:59    

bonjour,
 
je reviens à toi car j'ai un souci de compréhension sur les files. je voudrais faire l'insertion en file mais je me demande si ç'est possible ? car ç'est par ordre alphabétique ...
ou bien je mets le cas où la file est vide alors je mets
si file = null alors file = insersport
sinon
courant=file
tant que courant->suivant != null FAIRE
 courant = courant->suivant
fin tant que
courant->suivant=insersport
mais je cale un peu car ç'est par ordre alphabétique

Reply

Marsh Posté le 20-08-2016 à 12:21:22    

j'ai l'impression qu'en mode file je suis obligé d'inserer après avoir parcouru tout jusque NULL ET PUIS J'insere et je suis pas sur de moi car si je dois inserer par ordre alphabétique alors ç'est pas possible en file ???? si tu peux m'expliquer stp  
merci d'avance

Reply

Marsh Posté le 20-08-2016 à 12:38:12    

heu j'ai réfléchi et je pense que le tri sur le nom par ordre alphabétique n'est pas possible mais j'aimerais savoir à quoi correspond dans mon code cet algo car j'arrive pas à limplementer

Reply

Marsh Posté le 20-08-2016 à 12:48:35    

struct T* enfiler(struct T*file, struct T* t)
{
struct T*tmp;
si file = nul  
 alors enfiler = tmp->nomsport
 sinon tmp=file;
 tant que tmp->suivant != null faire
   tmp= tmp->suivant
 fin tant que
 tmp ->suivant = tmp->nomsport
enfiler=file
fin si  
fin si
 
je voudrais savoir à quoi correspond enfiler au cas où j'implémente en langage c ... ç'est recursif comme algo je pense

Reply

Marsh Posté le 21-08-2016 à 01:33:34    

j'ai réfléchi et je pense que ç'est file et si je reviens à mon code complet que j'ai posté sur le forum en langage c alors ça doit être debut que je remplace par file et je mets pas le dernier enfiler = file si je veux implémenter en c. enfiler ç'est comme la tete de liste quoi mais ç'est en mode file

Reply

Marsh Posté le 21-08-2016 à 10:51:15    

bjs a écrit :

bonjour,
 
je reviens à toi car j'ai un souci de compréhension sur les files. je voudrais faire l'insertion en file mais je me demande si ç'est possible ? car ç'est par ordre alphabétique ...
ou bien je mets le cas où la file est vide alors je mets
si file = null alors file = insersport
sinon
courant=file
tant que courant->suivant != null FAIRE
 courant = courant->suivant
fin tant que
courant->suivant=insersport
mais je cale un peu car ç'est par ordre alphabétique


si file = null alors file = insersport
sinon
si insersport > file alors /* on le met en tête de file */
insersport->suivant = file
file = intersport
sinon
courant=file
tant que courant->suivant != null et que courant->suivant > insersport FAIRE
 courant = courant->suivant
fin tant que
insersport->suivant = courant->suivant
courant->suivant=insersport
fin si
fin si
 
courant->suivant > insersport désignant bien sur la comparaison des champs appropriés de chacun des deux.
 
Je tape ça a vue, mais ça devrait ressembler à
 
struct T* enfiler(struct T* file, struct T* t, int(Z, Z) *compare) {
   /* ou Z est le type de file->champ_a_comparer */
   if (!file) {
      file = t;
   }
   else {
      if (*compare(t->champ_a_comparer, file->champ_a_comparer) >= 0) {
          t->suivant = file;
          file = t;
      }
      else {
          struct T* courant = file;
          while (courant->suivant && (*compare(t->champ_a_comparer, courant->suivant->champ_a_comparer) < 0) {
              courant = courant->suivant;
          }
          t->suivant = courant->suivant;
          courant->suivant = t;
      }
   }
  return file;
}
 
Et on appelle avec  
file = enfiler(file, t, &fction_de_comparaison_definie_avant)
parce que enfiler peut modifier la tête de file (ou alors, si on veut pas assigner systématiquement le retour de enfiler, il faut écrire une fction struct T* enfiler(struct T** file, struct T* t, int(Z, Z) *compare))
 
Bon, la fonction de comparaison est explicite ici, mais on aurait pu faire
struct T* enfiler(struct T* file, struct T* t) {
....
    if (fction_de_comparaison_definie_avant(t->champ_a_comparer, file->champ_a_comparer) >= 0) {
avec un appel implicite à une fonction.
 
 
A+,


Message édité par gilou le 21-08-2016 à 11:33:46

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-08-2016 à 11:35:57    

ç'est la comparaison de quel champ alors ? je pensais qu'en mode file il fallait absolument arriver à null et puis seulement inserer?? donc je compare quel champs ? merci d'avance

Reply

Marsh Posté le 21-08-2016 à 11:38:38    

Ben tu as dit que tu faisais une comparaison sur le nom par ordre alphabétique, donc c'est sur le champ nom, non?
Bref tu parcours la liste, tant que l’élément courant est plus gros, tu continue, et des qu'il est plus petit, tu insères devant.
Et comme on peut pas reculer pour insérer devant (liste simplement chainée) pour déterminer si on insère on regarde en fait un cran plus loin, donc le suivant de l’élément courant.
 
A+,


Message édité par gilou le 21-08-2016 à 11:43:37

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-08-2016 à 16:49:25    

merci je vais l'ecrire en c avec l'insertion des sous listes et je reviens à toi  
Je te souhaite une agréable fin de week end

Reply

Marsh Posté le 21-08-2016 à 16:50:28    

je me suis un peu reposé ce week end et j'ai étudié les algorithmes car j'ai un examen en algo et un examen en exos

Reply

Marsh Posté le 21-08-2016 à 16:52:07    

j'ai étudié tous les algos de mon syllabus : tris, recherches,file,pile,listes,heapsort(tri),je cale un peu sur les arbres (ç'est difficile à les mémoriser sans les comprendre)car je comprenais pas la matière quand on a vu ça en cours...

Reply

Marsh Posté le 22-08-2016 à 01:49:35    

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<string.h>
  4. struct joueurs{
  5. char nom[20];
  6. short age;
  7. struct joueurs *next;
  8. };
  9. struct sport{
  10. char nom[20];
  11. struct joueurs *liste;
  12. struct sport *next;
  13. };
  14. //struct sport *insersport(struct sport *debut,struct sport *inser,struct joueurs*inserjoueur);
  15. struct joueurs *inserjoueur(struct joueurs *file,struct joueurs *inser);
  16. struct sport*creer();
  17. struct sport *encodage(struct sport *file);
  18. void affichage(struct sport*file);
  19. void affichagesport(struct sport*file);
  20. struct sport* modifjoueur(struct sport*debut);
  21. void recherchemodifjoueur(struct sport*debut);
  22. struct sport* supprimer(struct sport *file);
  23. struct joueurs* supprimersousliste(struct joueurs*file );
  24. //struct sport* supprimerElement(struct sport* debut);
  25. struct sport *insersport(struct sport *file,struct sport *inser,struct joueurs *insertjoueur);
  26. int main()
  27. {
  28.     int choix=0;
  29.     int r=1;
  30.     int i=0;
  31.     int nbl=0;
  32.     struct sport *liste;
  33.     liste = creer();
  34. //menu
  35.     do
  36.     {
  37.         printf("(1)Pour afficher la liste des joueurs d'un sport recherche" );
  38.         printf("\n(2)Pour afficher la liste de tous les sports et des joueurs\n(3)Pour rechercher un joueur et le modifier" );
  39.         printf("\n(4)Pour encoder des sports et des joueurs" );
  40.         printf("\n(5)Pour supprimer un sport recherche" );
  41.         printf("\n(6)pour quitter taper autre touche" );
  42.         printf("\nQuel est votre choix : " );
  43.         fflush(stdin);
  44.         scanf("%d",&choix);
  45.         switch(choix)
  46.         {
  47.         case 1:affichagesport(liste);
  48.             break;
  49.         case 2:affichage(liste);
  50.             break;
  51.         case 3: recherchemodifjoueur(liste);
  52.             break;
  53.         case 4:
  54.             printf("\nCombien de sport voulez vous encoder : " );
  55.             fflush(stdin);
  56.             scanf("%d",&nbl);
  57.             while(i<nbl){
  58.             liste=encodage(liste);
  59.             i++;
  60.             }
  61.             break;
  62.         case 5:
  63.                 //supprimerElement(liste);
  64.                 printf("\nadresse pointee par liste avant supression : %p\n",liste);
  65.                 liste=supprimer(liste);
  66.                 printf("\nadresse pointee par liste apres supression : %p\n",liste);
  67.                 break;
  68.         default: r=0;
  69.         }
  70.     }while(r==1);
  71.     return 0;
  72. }
  73. /*�a s'appelle l'entete
  74. I: un pointeur de sport qui est la t�te de liste, un pointeur de structure sport � inserer dans la liste, un pointeur
  75. de structure joueur � inserer dans la liste
  76. P: inserer un sport et inserer un joueur
  77. O: elle retourne le pointeur de d�but de liste
  78. */
  79. struct sport *insersport(struct sport *file,struct sport *inser,struct joueurs *insertjoueur)
  80. {
  81.      struct sport *courant;//, //*prev;
  82.     courant =NULL;
  83.     //prev=NULL;
  84.     courant = file;
  85.     if (file== NULL)
  86.     {
  87.         file = inser;
  88.         inser->liste=inserjoueur(inser->liste,insertjoueur);
  89.     }
  90.     else
  91.     {
  92.         if(strcmp(inser->nom,file->nom)<0 )/* on le met en tête de file */
  93.         {
  94.             inser->next = file;
  95.             file = inser;
  96.              inser->liste=inserjoueur(inser->liste,insertjoueur);
  97.         }
  98.         else
  99.         {
  100.             courant = file;
  101.             while(courant->next != NULL && strcmp(courant->next->nom,inser->nom)<0)
  102.             {
  103.                 courant = courant->next;
  104.             }
  105.                 if(courant != NULL  && strcmp(courant->nom,inser->nom)==0)
  106.                 {
  107.                     courant->liste = inserjoueur(courant->liste,insertjoueur);
  108.                 }
  109.                 else
  110.                 {
  111.                     inser->next= courant->next;
  112.                     courant->next=inser;
  113.                     inser->liste=inserjoueur(inser->liste,insertjoueur);
  114.                 }
  115.         }
  116.     }
  117.     return file;
  118. }
  119. /*struct sport *insersport(struct sport *debut,struct sport *inser,struct joueurs*insertjoueur)
  120. {
  121.     struct sport *courant, *prev;
  122.     courant =NULL;
  123.     prev=NULL;
  124.     courant = debut;
  125.     if(debut==NULL || strcmp(debut->nom,inser->nom)>0)// si debut est apr�s inser
  126.     {
  127.         inser->next=debut;
  128.         debut=inser;
  129.         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 ?
  130.     }
  131.     else
  132.         {
  133.             while(courant!=NULL && strcmp(inser->nom,courant->nom)>0)// (inser est alphab�tiquement avant courant) inser plus grand que courant
  134.             {
  135.                 prev=courant;
  136.                 courant=courant->next;
  137.             }
  138.             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
  139.             {
  140.                 courant->liste = inserjoueur(courant->liste,insertjoueur);
  141.             }
  142.             else// inser n'est pas present dans la liste et on insere inser et ensuite on insere le joueur
  143.             {
  144.                 prev->next=inser;
  145.                 inser->next=courant;
  146.                 inser->liste = inserjoueur(inser->liste,insertjoueur);
  147.             }
  148.         }
  149.         return debut;
  150. }*/
  151. /*
  152. I: t�te de liste de la structure joueur et pointeur de structure joueur qui est un element � inserer
  153. P: elle insere un joueur en t�te de liste pile
  154. O: elle retourne le pointeur de d�but de liste
  155. */
  156. struct joueurs *inserjoueur(struct joueurs *file,struct joueurs *inser)// on insere joueur en tete de liste pile
  157. {
  158.    /* inser->next=debut;
  159.     debut=inser;
  160.     return debut;*/
  161.      inser->next = file;
  162.      file = inser;
  163.      return file;
  164. }
  165. /*
  166. I: pointeur de tete de liste de la structure sport
  167. P: encoder des sports et des joueurs et l'inserer au bon endroit
  168. O: pointeur de d�but de liste (tete de liste)de la structure sport
  169. */
  170. struct sport *encodage(struct sport *file)//une seule structure car joueur est une sous liste
  171. {
  172.     struct sport *newsport;
  173.     struct joueurs *newjoueur;
  174.     newsport= malloc (sizeof(struct sport));
  175.     if(newsport!=NULL)
  176.     {
  177.         newjoueur=malloc(sizeof(struct joueurs));
  178.             if(newjoueur!=NULL)
  179.             {
  180.                 newjoueur->next = NULL;
  181.                 newsport->next = NULL;
  182.                 newsport->liste = NULL;
  183.                 printf("Entrez le sport : " );
  184.                 fflush(stdin);
  185.                 fgets(newsport->nom,20,stdin);
  186.                 printf("Entrez le joueur : " );
  187.                 fflush(stdin);
  188.                 fgets(newjoueur->nom,20,stdin);
  189.                 printf("Entrez l'age : " );
  190.                 fflush(stdin);
  191.                 scanf("%hd",&newjoueur->age);
  192.                 file=insersport(file,newsport,newjoueur);
  193.                 }
  194.             }
  195.     return file;
  196. }
  197. /*
  198. I: pointeur de t�te de liste de la structure sport
  199. P: affiche la liste des sports et des joueurs
  200. O: /
  201. */
  202. void affichage(struct sport*file)
  203. {
  204.     struct sport *tempsport;
  205.     struct joueurs*tempjoueur;
  206.     tempsport = file;
  207.     while(tempsport!=NULL)
  208.     {
  209.         printf("%s :\n",tempsport->nom);
  210.         tempjoueur = tempsport->liste;
  211.         while(tempjoueur!=NULL)
  212.         {
  213.             printf("%s, %hd ,",tempjoueur->nom,tempjoueur->age);
  214.             tempjoueur=tempjoueur->next;
  215.         }
  216.         tempsport=tempsport->next;
  217.     }
  218. }
  219. /*
  220. I: pointeur de tete de liste de la structure sport
  221. P: affiche  liste joueur d'un sport demand� � l'utilisateur
  222. O:/
  223. */
  224. void affichagesport(struct sport*file)
  225. {
  226.     struct sport *tempsport;
  227.     struct joueurs *tempjoueur;
  228.     //struct joueurs *prevjoueur;
  229.     char ptab[20];
  230.     printf("Vous voulez la liste des joueurs de quel sport : " );
  231.     fflush(stdin);
  232.     fgets(ptab,20,stdin);
  233.     tempsport=file;
  234.     while(tempsport!=NULL && strcmp(ptab,tempsport->nom)> 0)//ptab>tempsport tant que ptab est alphab�tiquement apr�s tempsport tempsportnom
  235.     {
  236.         tempsport=tempsport->next;
  237.     }
  238.     if(tempsport!=NULL && strcmp(ptab,tempsport->nom)==0)
  239.     {
  240.         tempjoueur=tempsport->liste;
  241.         while(tempjoueur!=NULL)
  242.         {
  243.           printf("%s, %hd; ",tempjoueur->nom,tempjoueur->age);
  244.           tempjoueur=tempjoueur->next;
  245.         }
  246.     }
  247. }
  248. /*
  249. I: pointeur de tete de liste de la structure sport
  250. P: modification de joueur
  251. O: pointeur de t�te de liste de la structure sport
  252. */
  253. struct sport* modifjoueur(struct sport*debut)
  254. {
  255.     struct sport *tempsport;
  256.     struct joueurs*tempjoueur;
  257. char ptabspor[20];
  258. char ptabjoueu[20];
  259. printf(" Dans quel sport voulez vous modifier un joueur : " );
  260. fflush(stdin);
  261. fgets(ptabspor,20,stdin);
  262. printf("Quel joueur voulez vous modifier : " );
  263. fflush(stdin);
  264. fgets(ptabspor,20,stdin);
  265. tempsport=debut;
  266. while(tempsport!=NULL && strcmp(ptabspor,tempsport->nom)>0)
  267. {
  268.      tempsport=tempsport->next;
  269. }
  270. if(tempsport!=NULL &&strcmp(ptabspor,tempsport->nom)==0)
  271. {
  272.      tempjoueur=tempsport->liste;
  273.     // prev=tempjoueur;
  274.      //tempjoueur=temjoueur->next
  275.      while(tempjoueur!=NULL && strcmp(ptabjoueu,tempjoueur->nom)>0)
  276.      {
  277.         tempjoueur = tempjoueur->next;
  278.      }
  279.      if(tempjoueur !=NULL&&strcmp(ptabjoueu,tempjoueur->nom)==0)
  280.         {
  281.             short choix=0;
  282.         printf("que voulez vous modifier (1) age (2) nom:" );
  283.         fflush(stdin);
  284.         scanf("%hd",&choix);
  285.         switch(choix){
  286.         case 1:
  287.             printf("entrer l'age:" );
  288.             fflush(stdin);
  289.             scanf("%hd",&tempjoueur->age);
  290.             break;
  291.         case 2:
  292.             printf("entre le nom:" );
  293.             fflush(stdin);
  294.             fgets(tempjoueur->nom,20,stdin);
  295.             break;
  296.         }
  297.      }
  298. }
  299. return debut;
  300. }
  301. /*
  302. I: pointeur de tete de liste de la structure sport
  303. P: modification d'un joueur
  304. O: /
  305. */
  306. void recherchemodifjoueur(struct sport*debut)
  307. {
  308.     short choix=0;
  309.     int trouve=0;
  310.     char ptabjoueu[20];//nom a rechercher
  311.     printf("Quel joueur recherchez vous : " );
  312.     fflush(stdin);
  313.     fgets(ptabjoueu,20,stdin);
  314.     struct sport*tempsport;
  315.     struct joueurs*tempjoueur;
  316.     tempsport=debut;
  317.     while(tempsport!=NULL&& trouve==0)
  318.     {
  319.         tempjoueur=tempsport->liste;
  320.         while(tempjoueur!=NULL && trouve==0)
  321.         {
  322.             if(strcmp(tempjoueur->nom,ptabjoueu)==0)
  323.             {
  324.                 trouve=1;
  325.             }else
  326.             {
  327.                 tempjoueur=tempjoueur->next;
  328.             }
  329.         }
  330.         tempsport=tempsport->next;
  331.     }
  332.     if(trouve ==1)
  333.     {
  334.         printf("que voulez vous modifier : (1)l'age\n(2)le nom" );
  335.         fflush(stdin);
  336.         scanf("%hd",&choix);
  337.         switch(choix)
  338.         {
  339.         case 1:
  340.             printf("Entrez l'age : " );
  341.             fflush(stdin);
  342.             scanf("%hd",&tempjoueur->age);
  343.             break;
  344.         case 2:
  345.             printf("Entrez le nom : " );
  346.             fflush(stdin);
  347.             fgets(tempjoueur->nom,20,stdin);
  348.         }
  349.     }
  350. }
  351. /*
  352. I: /
  353. P: creation d'une liste
  354. O: retourne un pointeur null
  355. */
  356. struct sport*creer()
  357. {
  358.    return NULL;
  359. }
  360. /*struct sport* supprimerElement(struct sport* debut)
  361. {
  362.      char ptab[20];
  363.     struct sport *courant;
  364.     struct sport*precedent;
  365.     precedent = NULL;
  366. printf("Entrez le nom a supprimer : " );
  367. fflush(stdin);
  368. fgets(ptab,20,stdin);
  369. courant = debut;
  370. if (debut == NULL) // si la liste est NULL on s'arrete tout de suite
  371.   return (debut);
  372. precedent = debut;
  373. if (strcmp(precedent->nom,ptab)== 0) // Verifie la tete de liste, cas particulier
  374. {
  375.   debut = precedent->next;
  376.   free(precedent);
  377.   return (debut);
  378. }
  379. courant = precedent->next; // le cas n est gere on se place donc sur le cas n+1
  380. while(courant != NULL) // On Mouline est on supprime si on trouve l'element
  381. {
  382. if (strcmp(precedent->nom,ptab)== 0)
  383.   {
  384.     precedent->next = courant->next;
  385.     free(courant);
  386.     return (debut);
  387.   }
  388.   precedent = courant; // pour ce souvenir dans la prochaine iteration du precedent
  389.   courant = courant->next;
  390. }
  391. return debut;
  392. }
  393. */
  394. struct sport* supprimer(struct sport *file)// cette fonction ne va pas bien
  395. {
  396.     char ptab[20];
  397.     struct sport *courant;
  398.     struct sport*precedent;
  399.     precedent = NULL;
  400. printf("Entrez le nom a supprimer : " );
  401. fflush(stdin);
  402. fgets(ptab,20,stdin);
  403. courant = file;
  404.     if (file!=NULL && strcmp(ptab,courant->nom) == 0)// on supprime la tete
  405.     {
  406. supprimersousliste(courant->liste);
  407. //free(courant);
  408.         file=file->next;
  409.         free(courant);
  410.         return file;
  411.     }
  412.     else{
  413.        while(courant!=NULL && strcmp(ptab,courant->nom)!=0)
  414.          {
  415.              precedent = courant;
  416.              courant= courant->next;
  417.          }
  418.          if(courant!=NULL && strcmp(ptab,courant->nom)==0 )
  419.          {supprimersousliste(courant->liste);
  420.          //free(courant);
  421.             precedent->next=courant->next;
  422.             //courant->next=NULL;
  423.              free(courant);
  424.              return(file);
  425.          }
  426.          else
  427.              {
  428.                 printf("le nom n'est pas present" );
  429.             }
  430. }
  431. return file;
  432. }
  433. struct joueurs*supprimersousliste(struct joueurs*file)
  434. {
  435.     struct joueurs *tmpjoueurs;//element a supprimer
  436.     while(file!=NULL){
  437. tmpjoueurs=file;
  438. file=file->next;
  439.         free(tmpjoueurs);
  440.     }
  441. return file;
  442. }


Message édité par gilou le 22-08-2016 à 13:30:03
Reply

Marsh Posté le 22-08-2016 à 02:12:52    

voilà le code en mode file et apparement il marche je l'ai compilé et essayé sauf deux fonctions que j'ai pas modifié. mais l'encodage l'affichage de tous les sports et la suppression fonctionnent apparment. Merci de me dire quoi  
cordialement

Reply

Marsh Posté le 22-08-2016 à 02:27:50    

j'ai une question est ce que ç'est bien en mode file que j'ai ecrit en c dans la fonction insertion ?

Reply

Marsh Posté le 22-08-2016 à 13:36:22    

Je regarde ça ce soir (la je code ce qui me permet de bouffer: de la transformation d'arbres avec un langage dédié).
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 22-08-2016 à 21:21:14    

ok merci

Reply

Marsh Posté le 22-08-2016 à 22:34:49    

C'est pas vraiment un mode en file, car traditionellement,une file c'est first in first out, et la, c'est pas le cas.
C'est juste une liste avec insertion en tête de liste.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 22-08-2016 à 22:49:17    

bein si je dois faire par ordre alphabétique alors ç'est pas possible l'insertion en file ???

Reply

Marsh Posté le 22-08-2016 à 23:50:44    

Tu dois faire quoi par ordre alphabétique?
 
De plus je ne sais pas ce que tu appelles insertion en file.
La structure de donnée file je connais, mais c'est pas du tout ce qu'on manipule ici, vu que l'ordre de suppression des joueurs n'est pas déterminé par leur ordre d'insertion.
 
A+,


Message édité par gilou le 22-08-2016 à 23:55:47

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed