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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| #include <stdio.h>
#include <stdlib.h>
typedef struct _list
{
int val;
struct _list *next;
} LIST;
LIST* fusion (LIST* list1, LIST* list2);
LIST* _tri_fusion (LIST* list1, unsigned n);
static unsigned nb_elements (LIST* list);
LIST* tri_fusion (LIST* list);
/* fusionne deux listes - pose problèmes sur très grosses listes */
LIST* fusion (LIST* list1, LIST* list2)
{
if (list1 == NULL)
return list2;
else if (list2 == NULL)
return list1;
else if (list1->val < list2->val)
{
list1->next = fusion (list1->next, list2);
return list1;
}
else
{
list2->next = fusion (list1, list2->next);
return list2;
}
}
/* tri fusion sur liste chainée */
LIST* _tri_fusion (LIST* list1, unsigned n)
{
unsigned median = 0, i;
LIST *list2 = NULL, *tmp;
if ( n > 1)
{
/* merge */
median = n/2;
for (list2=list1, i=median; --i; list2=list2->next);
tmp = list2->next, list2->next = NULL, list2 = tmp;
/* sort */
if (median > 1)
list1 = _tri_fusion (list1, median);
if (n-median > 1)
list2 = _tri_fusion (list2, n-median);
list1 = fusion (list1, list2);
}
return list1;
}
static unsigned nb_elements (LIST* list)
{
unsigned ret = 0;
while (list != NULL)
list = list->next, ret++;
return ret;
}
/* tri fusion sur liste chainée */
LIST* tri_fusion (LIST* list)
{
return _tri_fusion (list, nb_elements (list));
}
int main (int argc, const char * argv[])
{
LIST *un,*deux,*trois;
un = (LIST *) malloc(sizeof(LIST));
deux = (LIST *) malloc(sizeof(LIST));
trois = (LIST *) malloc(sizeof(LIST));
un->val = 3;
deux->val = 2;
trois->val = 1;
un->next = deux;
deux->next = trois;
trois->next = NULL;
printf("Taille de la liste : %d\n", nb_elements(un));
tri_fusion(un);
while (un != NULL) {
printf("val : %d\n",un->val);
un = un->next;
}
return EXIT_SUCCESS;
} |
Partager