Bonjour je suis nouvelle ici et j'ai besoin de votre aide sur un tp si possible. ça concerne une liste d'entiers simplement chaînée qui échange les positions des nœuds donnés par deux pointeurs g et d. Merci d'avance.
Bonjour je suis nouvelle ici et j'ai besoin de votre aide sur un tp si possible. ça concerne une liste d'entiers simplement chaînée qui échange les positions des nœuds donnés par deux pointeurs g et d. Merci d'avance.
Bonjour et bienvenue,
Nous pouvons t'aider mais nous ne ferons pas ton travail à ta place. Montre-nous ce que tu as écrit jusqu'ici (avec les balises [CODE] et [/CODE]) et nous tâcherons de t'orienter.
Bon courage.
Merci En fait je veux échanger les positions des nœuds donnés par deux pointeurs A et B sur une liste d'entiers chaînéeMais ça ne marche pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 typedef struct Element Element; struct Element { int val; Element *suivant; }; typedef struct Liste Liste; struct Liste { Element *premier; }; void (Liste *liste, int pos1, int pos2){ //Première cellule Element *tmpA = liste->premier; Element *tmpA_precedent; int cpt = 1; int trouve = 0; while(tmpA->suivant != NULL && trouve == 0) { if(cpt == pos1) { trouve = 1; } else { tmpA_precedent = tmpA; tmpA = tmpA->suivant; cpt++; } } //Deuxième cellule Element *tmpB = liste->premier; Element *tmpB_precedent; cpt = 1; trouve = 0; while(tmpB->suivant != NULL && trouve == 0) { if(cpt == pos2) { trouve = 1; } else { tmpB_precedent = tmpB; tmpB = tmpB->suivant; cpt++; } } //On permute Element *tmp; tmpA_precedent->suivant = tmpB; tmpB_precedent->suivant = tmpA; tmp = tmpA->suivant; tmpA->suivant = tmpB->suivant; tmpB->suivant = tmp; } }
Pourtant, c'est du bon travail.
- À la ligne 13, tu as oublié le nom de ta fonction (entre void et « ( ») ;
- Tout en bas, ligne 56, il y a une accolade en trop (défaut d'indentation).
Une fois ces deux détails réglés, j'ai collé ton code au sein d'un programme de test et le résultat est bien celui attendu :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 affiche (&l); permute (&l,4,7); affiche (&l);Par contre, ton programme souffre encore d'un tout petit défaut : il risque de planter si tu essaies de permuter le premier élément avec un autre…101 -> 102 -> 103 -> 104 -> 105 -> 106 -> 107 -> 108 -> 109 -> 110 101 -> 102 -> 103 -> 107 -> 105 -> 106 -> 104 -> 108 -> 109 -> 110
C'est ça mon problème le 1er élément je ne sais pas pourquoi ça ne le considère pas
Parce que si c'est le premier élément, alors par définition, il n'y a pas encore d'éléments précédents. Tes deux pointeurs tmpA_precedent et tmpB_precedent ne pointent donc rien de valide à ce stade. Et comme tu ne les initialises pas en les déclarant, ils peuvent pointer n'importe quoi en mémoire.
Il faut les initialiser à NULL au départ et vérifier ensuite si leur valeur a bien changé avant d'y affecter quelque chose aux lignes 50 à 53. De plus, puisque c'est le premier élément de la chaîne qui change, il faudra aussi mettre à jour la valeur de « liste->premier ».
(Mon petit doigt me dit que tu dois pouvoir faire d'une pierre deux coups en faisant initialement pointer tes tmpX_precedent directement sur l'adresse de ->premier au démarrage, mais chut).
Je l'ai fait mais ça ne gère toujours pas le premier élément au pire des cas ça supprime la 1ère position
C'est que tu l'as mal fait. Ou que tu n'as pas compris ce que j'explique ci-dessus.
Ne te lance pas d'emblée dans ce que j'ai écrit entre parenthèses. Ce n'est pas compliqué mais cela implique une subtilité qu'il faut être sûr d'avoir bien saisie, sinon ton programme va planter encore plus qu'avant.
Si tu as modifié ton code par rapport à ce que tu nous as présenté, montre-le nous à nouveau ici.
je m'excuse du retard j'ai été malade donc je l'ai modifié ainsi
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80 void permutation(Liste *liste, int pos1, int pos2) { if(liste == NULL) { exit(EXIT_FAILURE); } //cas particulier if(pos1 == 1) { //Première cellule Element *tmpA = liste->premier; //Deuxième cellule Element *tmpB = liste->premier; Element *tmpB_precedent; int cpt = 1; int trouve = 0; while(tmpB->suivant != NULL && trouve == 0) { if(cpt == pos2) { trouve = 1; } else { tmpB_precedent = tmpB; tmpB = tmpB->suivant; cpt++; } } //On permute Element *tmp; liste->premier = tmpB; tmpB_precedent->suivant = tmpA; tmp = tmpA->suivant; tmpA->suivant = tmpB->suivant; tmpB->suivant = tmp; } else { //Première cellule Element *tmpA = liste->premier; Element *tmpA_precedent; int cpt = 1; int trouve = 0; while(tmpA->suivant != NULL && trouve == 0) { if(cpt == pos1) { trouve = 1; } else { tmpA_precedent = tmpA; tmpA = tmpA->suivant; cpt++; } } //Deuxième cellule Element *tmpB = liste->premier; Element *tmpB_precedent; cpt = 1; trouve = 0; while(tmpB->suivant != NULL && trouve == 0) { if(cpt == pos2) { trouve = 1; } else { tmpB_precedent = tmpB; tmpB = tmpB->suivant; cpt++; } } //On permute Element *tmp; tmpA_precedent->suivant = tmpB; tmpB_precedent->suivant = tmpA; tmp = tmpA->suivant; tmpA->suivant = tmpB->suivant; tmpB->suivant = tmp; } }
Partager