Tri fusion d'une liste chainée
Bonjour tout le monde,
Je suis entrain de coder ls pour mes cours. J'ai presque fini le projet, il me reste plus qu'a lister les informations dans le meme ordre que le vrai ls (Tri par date ou ascii). Dans un premier temps, je m'occupe du tri dans l'ordre ascii.
J'ai un petit problème avec ma fonction de tri sur des listes chainées :aie:
J'ai utilisé l'algo de wiki pour réaliser le tri. Mais j'ai un problème. J'ai un segfault dans la fonction de fusion... :aie: Pouvez-vous m'aider svp? :oops: Voici mon code :
Code:
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
| #include "sort.h"
#include "info.h"
#include <stdio.h>
int tri_ascii(void *a1, void *b1)
{
char *tmp;
char *a;
char *b;
unsigned int i;
a = (char*)a1;
b = (char*)b1;
i = 0;
while (a[i] == (char)b[i] && a[i] != '\0' && a[i] != '\0')
i++;
if ((b[i] < a[i] && a[i] != '\0') || (b[i] == '\0' && a[i] != '\0'))
return (1);
return (0);
}
void switch_link(t_info **p, t_info **q)
{
t_info *t;
t = (*q)->next;
(*q)->next = t->next;
(*q)->next->prev = (*q);
t->prev = (*p);
t->next = (*p)->next;
(*p)->next->prev = t;
(*p)->next = t;
}
t_info **fusion(t_info **beg, int nb_link_beg, t_info **end,
int nb_link_end)
{
while (1)
{
if (tri_ascii((*beg)->name, (*end)->name) == 1)
{
switch_link(beg, end);
if (nb_link_end == 1)
break ;
nb_link_end--;
}
else
{
if (nb_link_beg == 1)
{
while (nb_link_end >= 1)
{
(*end) = (*end)->next;
nb_link_end--;
}
}
nb_link_beg--;
}
(*beg) = (*beg)->next;
}
return (end);
}
t_info **sort(t_info **lst, int nb_link)
{
int nb_link_deb;
int nb_link_fin;
t_info **lst_sort;
nb_link_fin = nb_link / 2;
nb_link_deb = nb_link - nb_link_fin;
if (nb_link_deb >= 2)
{
lst_sort = sort(lst, nb_link_deb);
if (nb_link_fin >= 2)
lst = sort(lst_sort, nb_link_fin);
}
else
*lst_sort = (*lst)->next;
lst_sort = fusion(lst, nb_link_deb, lst_sort, nb_link_fin);
return (lst_sort);
} |