Salut tout le monde,
J'ai deja exploser mon problème il y a moins de 24h sur un autre forum mais personne n'a pu me venir en aide, j'espère que quelqu'un ici sera en mesure de m'aider :/
J'ai comme projet de refaire la fonction ls, je suis donc passer par un arbre binaire avec pointeur sur right si c'est un fichier et pointeur sur bottom si c'est un dossier (avec le premier element du dossier).
J'ai un peut améliorer mon arbre qui a maintenant un pointeur sur previous et sur racine. J'ai également une fonction de recherche très basic qui parcourt mon arbre.
Le problème c'est que les infos rentrer dans chaque maillon sont toute ok sauf une (qui est celle du nom) mais que sur certain maillon.
Ca fait maintenant un moment que je cherche pourquoi mais je commence a sécher, si quelqu'un veux bien jeter un coup d'oeil ca pourrais m'aider
Je suppose que vous n'avez pas tout compris alors je vous met quelque image et mon code
Sur cette image on voit que link et deep sont bien rentrer correctement dans l'arbre mais que le name ne correspond pas a chaque fois.
Exemple : Manger, Montre, Poulet sont ok mais curry poivre et sel ne corresponde pas.
Mon .h
Ma fonction qui s'occupe de rentrer les donner dans l'arbre :
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 #ifndef FT_LS_H # define FT_LS_H # include "../libft/include/libft.h" # include "../libft/include/ft_printf.h" # include <dirent.h> # include <sys/stat.h> typedef struct s_ls { char *link; char *name; int dir; int deep; struct s_ls *racine; struct s_ls *right; struct s_ls *bottom; struct s_ls *previous; } t_ls; typedef struct s_browdir { t_ls *address; struct s_browdir *next; } t_browdir; typedef struct s_ls_setting { char *link; int dir; t_ls *racine; } t_ls_setting; int is_dir(char *link); //binary_tree t_ls *beginlist(t_ls *list, t_ls_setting *sett); void fillist(char *link, t_ls *list, t_ls_setting *sett); //sort_tree.c t_ls *sort_alpha(t_ls *list); //browse_list.c int foldirect(t_ls *list, t_browdir *browser); int playtree(t_browdir *browser); //tmp int playlist_r(t_ls *list); #endif
Ma fonction de parcours :
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
83
84
85
86
87
88
89
90
91 #include "../include/ft_ls.h" static t_ls *new_elem(t_ls_setting *sett) { t_ls *elem; if ((elem = malloc(sizeof(t_ls))) == NULL) exit(ft_printf("~31Error : Malloc Allocation\n")); elem->link = sett->link; elem->name = NULL; elem->dir = sett->dir; elem->deep = 0; elem->racine = NULL; elem->right = NULL; elem->bottom = NULL; elem->previous = NULL; return (elem); } t_ls *beginlist(t_ls *list, t_ls_setting *sett) { t_ls *elem; elem = new_elem(sett); elem->dir = 1; list = elem; return (list); } void fillist(char *link, t_ls *list, t_ls_setting *sett) { DIR *directory; struct dirent *read; int i; t_ls *tmp; static int deep = 0; deep++; i = 0; read = NULL; directory = opendir(sett->link); if (directory == NULL) ft_printf("~31Error : Open Directory\n"); while ((read = readdir(directory)) != NULL) { while (i < 2) { read = readdir(directory); i++; } if (read == NULL) break; sett->link = ft_strjoin(ft_strjoin(link, "/"), read->d_name); if (!is_dir(sett->link)) sett->dir = 0; else sett->dir = 1; tmp = new_elem(sett); tmp->name = read->d_name; tmp->deep = deep; if (deep > list->deep) tmp->racine = list; else tmp->racine = list->racine; if (list->racine != tmp->racine) list->bottom = tmp; else list->right = tmp; tmp->previous = list; list = tmp; if (sett->dir) fillist(sett->link, list, sett); } sett->link = ft_strjoin(ft_strjoin(link, "/"), "NULL"); tmp = new_elem(sett); tmp->name = "NULL"; tmp->deep = deep; tmp->dir = 0; tmp->previous = list; if (deep > list->deep) tmp->racine = list; else tmp->racine = list->racine; if (list->racine != tmp->racine) list->bottom = tmp; else list->right = tmp; list = tmp; deep--; closedir(directory); }
PS : Ne me juger pas sur la propreté de mon code, il faut que je le remette un peut en place :p
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 int playlist_r(t_ls *list) { while (!ft_strcmp(list->name, "NULL") && list->deep != 1) { list = list->racine; list = list->right; } if (!ft_strcmp(list->name, "NULL") && list->deep == 1) return(0); if (list->dir) { ft_printf("~33%s : %i : ~31%s\n", list->link, list->deep, list->name); list = list->bottom; } else { ft_printf("%s : %i : ~31%s\n", list->link, list->deep, list->name); list = list->right; } playlist_r(list); return (0); }
Et désolé pour les fautes d'orthographe :/
Partager