Bonsoir
Merci à ceux qui vont prendre le temps de lire. Cet exercice est simple c'est juste que j'essaye de décrire au mieux mon problème.
Tous d'abord, voici les structures :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 typedef struct celem celem; struct celem { elem value; celem *next; };
Voici le prototype de la fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 struct lelem { celem *head; };
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 // lelem_concatenation_head : concatène en tête de la liste associée à s2 la // liste associée à s1. À la terminaison, la liste associée à s1 est vide. //Aucune opération dallocation ou de désallocation nest effectuée extern void lelem_concatenation_head(lelem *s1, lelem *s2);
Code de la fonction :
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 void lelem_concatenation_head(lelem *s1, lelem *s2) { // AE : s1 != s2 if (s1 -> head == NULL) { return; } if (s2 -> head != NULL) { celem *p = s1 -> head; while (p -> next != NULL) { p = p -> next; } p -> next = s2 -> head; } s2 -> head = s1 -> head; // Mon problème se situe s1 -> head = NULL; // sur ces deux lignes }
Voici mon dessin sur feuille, ou j'ai essayé de représenter au mieux ce que fait le code.
légende : ||header|| -> |value|next| -> |value|next|
A quoi servent réellement les deux derniers instructions ... ?
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 s1: header : ||100|| - -> |1|200| -> -> -> |2|400| -> -> -> |3|0|->NULL s2 : header: ||500|| - ->|4|600| -> -> -> |5|700| -> -> -> |6|0|->NULL if (s1 -> head == NULL) { return; } ici s1->head vaut 100 donc pas NULL on sort du if . if (s2 -> head != NULL) { celem *p = s1 -> head; while (p -> next != NULL) { p = p -> next; } Dans le while p parcours la list s1, et p->next = NULL donc p se retrouve sur 0 . |p| s1 : |1|200| -> -> -> |2|400| -> -> -> |3|0|->NULL p -> next = s2 -> head; le precedent next de s1 ( valait 0 ) devient la tête de s2 ( 500) donc : s1: header: ||100|| - - ->|1|200| - - > |2|400| - - > |3|500|->NULL s2 -> head = s1 -> head; , la tête de s2(500) prend la tête de s1 (100) s2 : header : ||100|| - - -> |4|600| -> -> -> |5|700| -> -> -> |6|0|->NULL s1 -> head = NULL; la tête de s1 devient NULL: s1 : ||NULL|| - ->|1|200| -> -> -> |2|400| -> -> -> |3|500|-> -> -> |4|600| -> -> -> NULL Que faire ?????
Pour moi, la concaténation 1 2 3 4 5 6 marchent rien qu'avec p ->next ( bout de la chaine s1 ) = s2 ->head ( tête chaine s2 ) et je trouve bien 1 2 3 4 5 6
mais avec les deux instructions je m'y perd dans le déroulement du code :
Merci
Partager