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 :

mettre une liste chainee en arbre binaire equilibre


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 289
    Points : 158
    Points
    158
    Par défaut mettre une liste chainee en arbre binaire equilibre
    salut,

    je voudrais mettre la moitie d'une liste chainee passe en parametre a gauche de mon arbre et le reste a droite de l'arbre mais je ne sais pas comment coder la fonction ni comment couper une liste en deux.

    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
    #include <stdlib.h>
     
    void    *xmalloc(int size)
    {
      void  *temp;
     
      temp = malloc(size);
      if (temp == 0)
        exit(1);
      return (temp);
    }
     
    typedef struct          s_btree
    {
      void                  *item;
      struct s_btree        *left;
      struct s_btree        *right;
    }                       t_btree;
     
    t_btree         *sorted_list_to_btree(t_list *l, int size)
    {
    // je ne sais pas quoi mettre ici...
    }

  2. #2
    Membre confirmé Avatar de toxcct
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 434
    Points : 511
    Points
    511
    Par défaut
    Citation Envoyé par Pitou5464
    salut,

    je voudrais mettre la moitie d'une liste chainee passe en parametre a gauche de mon arbre et le reste a droite de l'arbre mais je ne sais pas comment coder la fonction ni comment couper une liste en deux.
    et ben moi non plus, carje ne comprends pas ton probleme... peux tu STP reformuler ta question avec des mots pesés pour qu'on comprenne ce que tu as, ce que tu veux, et ce que tu n'arrives pas a faire... ?

  3. #3
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Pour couper une liste en deux, tu as deux algorithmes, qui produisent des résultats différents.

    Le premier est tout bête : tu parcours la liste et tu distribues alternativement un élément dans la liste gauche et un autre dans la liste droite.

    Le deuxième est plus complexe, mais permet de réellement couper en deux ta liste sans même en calculer la longueur, donc le tout en une seule passe. L'idée est d'avoir deux "indices" débutant tous les deux au début : quand l'un se déplace de deux en deux, l'autre se déplace d'un élément, ainsi tu es assuré que, quand l'"indice" le plus lointain est arrivé en bout de liste, l'autre se situe exactement à la moitié de la liste. Il ne reste donc plus qu'à couper.

    Tu auras remarqué que si la liste est de taille N, l'algorithme est en N/2 étapes, ce qui est beaucoup plus optimal que l'algorithme du dessus qui t'oblige à recréer deux listes et à dés-allouer la liste courante.

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Juste une petite question (quand tu auras donné la réponse, je m'écrirai sans doute "mais comment n'y ai-je pas pensé" ) mais, pourrais tu expliciter ce que tu entend par
    je voudrais mettre la moitie d'une liste chainee passe en parametre a gauche de mon arbre et le reste a droite de l'arbre
    Car, de la manière dont je l'interprete, peut etre mal, d'ailleurs, tu cherche juste à avoir quelque chose ressemblant à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
         racine de ton arbre binaire
                  / \
    une demi-liste   l'autre demi-liste
    alors que l'utilisation "classique" d'un arbre binaire serait du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          el4
         /    \
      el2      el6
       /\       /\
    el1  el3 el5  el7
    où elN serait le Nieme élément de ta liste triée

    A moins, évidemment, que tu ne veuille rentrer dans une logique de "ashtable" ou autre...

Discussions similaires

  1. Réponses: 18
    Dernier message: 20/09/2007, 22h04
  2. [LG]probleme d'ajout dans une liste chainée...
    Par misteryann dans le forum Langage
    Réponses: 5
    Dernier message: 08/03/2004, 20h28
  3. Réponses: 5
    Dernier message: 03/02/2004, 14h20
  4. [LG]Tri par insertion dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2003, 22h34
  5. [LG]suppression dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 9
    Dernier message: 16/12/2003, 21h20

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