langage c et liste chainee - C - Programmation
Marsh Posté le 15-08-2016 à 18:12:57
Code :
|
Et perso, ta fonction supprimer, je la coderais ainsi;
Code :
|
Ou alors ainsi:
Code :
|
A+,
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
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
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
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
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 :
|
A+,
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
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+,
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+,
Marsh Posté le 15-08-2016 à 20:09:11
je ne comprends presque aucune de tes conditions quand tu mets rien du tout
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 ??
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
Marsh Posté le 15-08-2016 à 21:12:06
Code :
|
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 :
|
A+,
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+,
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.
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
Marsh Posté le 15-08-2016 à 21:55:29
Code :
|
Chez moi ça marche très bien.
(1)Pour afficher la liste des joueurs d'un sport recherche |
A+,
Marsh Posté le 15-08-2016 à 22:00:53
ReplyMarsh 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
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+,
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
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
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
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
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
Marsh Posté le 21-08-2016 à 10:51:15
bjs a écrit : bonjour, |
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+,
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
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+,
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
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
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...
Marsh Posté le 22-08-2016 à 01:49:35
Code :
|
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
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 ?
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+,
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+,
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 ???
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+,
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