Bonsoir à tous,
J'ai un petit soucis avec ma fonction de tri par fusion.
Mon programme lit un fichier texte et crée une liste chainée double.
Voila mes structures:
Le problème est que lorsque je choisi de trier par nom, cela trie parfaitement mais lorsque je trie par prénom, cela ne trie pas correctement... une idée??
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 struct DATA{ int taille; struct DATA2 *first; }; struct DATA2{ char nom[15]; char prenom[15]; char initial[10]; char email[35]; char num_tel[10]; char classe[15]; int taille; struct DATA2 *next; struct DATA2 *previous; }; typedef struct DATA2 ELEVE; typedef struct DATA LISTE;
Voici ma fonction de tri par fusion:
J'ai une variable globale "valeur" qui lorsqu'elle prend l'entier 1 , utilise la fonction "Fusion" pour un tri par nom et l'entier 2, pour un tri par prénom.
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 ELEVE *Tri_Fusion(ELEVE *list1) { ELEVE *list2=NULL; if (list1 == NULL) return NULL; else if (list1->next == NULL) return list1; else { list2 = Split_List(list1); if(valeur==1) return Fusion(Tri_Fusion(list1),Tri_Fusion(list2)); if(valeur==2) return Fusion2(Tri_Fusion(list1),Tri_Fusion(list2)); } return list1; } ELEVE *Fusion(ELEVE *list1, ELEVE *list2) { if (list1 == NULL) return list2; else if (list2 == NULL) return list1; else if (strcmp(list1->nom,list2->nom) < 0) { list1->next = Fusion(list1->next, list2); list1->next->previous=list1; list1->previous=NULL; return list1; } else { list2->next = Fusion(list1, list2->next); list2->next->previous=list2; list2->previous=NULL; return list2; } } ELEVE *Fusion2(ELEVE *list1, ELEVE *list2) { if (list1 == NULL) return list2; else if (list2 == NULL) return list1; else if (strcmp(list1->prenom,list2->prenom) < 0) { list1->next = Fusion(list1->next, list2); list1->next->previous=list1; list1->previous=NULL; return list1; } else { list2->next = Fusion(list1, list2->next); list2->next->previous=list2; list2->previous=NULL; return list2; } } ELEVE *Split_List(ELEVE* list1) { ELEVE *list2=NULL; if (list1 == NULL) return list1; else if (list1->next == NULL) return list1->next; else { list2 = list1->next; list1->next = list2->next; list2->next = Split_List(list2->next); return list2; } }
Les fonctions "Fusion" et "Fusion2" sont identiques sauf le strcmp() est dans l'un pour comparer les noms et dans l'autre pour comparer les prénoms, donc je ne vois vraiment pas où peut être l'erreur...
Merci.
Partager