IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

J'ai mal a mon arbre [Arbre multidirectionnel]


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2017
    Messages : 6
    Par défaut 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.
    Nom : 14990132547449_Screen Shot 2017-07-02 at 18.33.40.png
Affichages : 192
Taille : 259,0 Ko

    Mon .h
    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 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
    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 : 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);
    }
    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 :/

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Première chose, right et left sont de mauvais noms. La preuve? Tu as du nous expliquer ce qu'ils sont.
    Pour Linux (et POSIX), un dossier est un type de fichier, de même que les fichiers normaux, les sockets, les pipes nommés, etc.

    Un fichier n'étant pas simultanément un dossier et un fichier normal, ton arbre ne peut contenir que des nœuds avec un fils gauche ou un droit.
    Il n'est absoluement pas binaire.

    La structure arborescente normale serait le pattern "composite".
    Essaye cette structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct noeud {
        struct noeud* parent;  //dossier contenant ce fichier, ou NULL pour une racine.
        struct noeud* suivant; //liste chainée des frères
        struct noeud* fils;    // le premier fils
        info_fichier details;  // soit une sous structure, soit une liste de champ
    };

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2017
    Messages : 6
    Par défaut
    En faite au départ ne sachant pas trop par ou commencer je me suis appuyé sur cette image :
    Nom : Shemas arbre binaire.jpg
Affichages : 154
Taille : 17,0 Ko

    Ce qui explique pourquoi je suis partie sur "right" et "bottom", je viens de regarder le pattern "composite" mais je ne saisie pas encore tout :/
    Je suis sur cette page : http://smeric.developpez.com/java/uml/composite/
    Si tu en a une qui explique bien a me conseillé je suis preneur.

    Meme si je fini par passer par ce pattern j'aimerais au moins comprendre l'erreur de mon programme (Une erreur compris c'est une erreur que l'on ne refait pas).
    Merci pour ton aide

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/04/2014, 16h32
  2. Où est le mal dans mon code ?
    Par meskine dans le forum Langage
    Réponses: 5
    Dernier message: 17/06/2010, 12h34
  3. [eZ Publish] du mal à créer mon arborescence
    Par eroux dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 29/09/2009, 22h29
  4. Réponses: 6
    Dernier message: 12/04/2007, 20h30
  5. Qu'est ce qu'il y a de mal dans mon code?
    Par pennylanesworld dans le forum Flash
    Réponses: 2
    Dernier message: 23/10/2006, 12h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo