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

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... Pouvez-vous m'aider svp? Voici mon code :
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
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);
}