1 pièce(s) jointe(s)
J'ai mal a mon arbre [Arbre multidirectionnel]
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.
Pièce jointe 291043
Mon .h
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
| #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 qui s'occupe de rentrer les donner dans l'arbre :
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 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);
} |
Ma fonction de parcours :
Code:
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);
} |
PS : Ne me juger pas sur la propreté de mon code, il faut que je le remette un peut en place :p
Et désolé pour les fautes d'orthographe :/