Votre question
Résolu

langage c liste chainee

Tags :
  • Sport
Dernière réponse : dans Programmation
15 Août 2016 14:35:53

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


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

Autres pages sur : langage liste chainee

Meilleure solution

17 Août 2016 21:33:55

ç'est résolu ç'était mon appel de la fonction qui était pas bon. la fonction supprimer était bien
et je devais faire liste = supprimer(liste) et moi j'écrivais supprimer(liste) et je ne récupérais pas l'adresse de la liste modifiée
partage
17 Août 2016 21:50:36

je dois aussi libérer la mémoire allouée dynamiquement avant de quitter le programmme
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS