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 :

probleme insertion liste chainee


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 1
    Par défaut probleme insertion liste chainee
    Bonjour,

    j'ai un petit probleme pour une insertion dans une liste chainee je veux faire un tri par ordre alphabetique. quand je veux l'afficher je n'ai pas le bon resultat.

    j'ai l'impression que ca bloque quand je veux inserer en debut de liste.

    voici la fonction

    edit : structure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct     s_list
    {
      void             *data;
      struct s_list    *next;
    } t_list;
    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
     
     
     
    int     my_put_in_list_last (t_list **list, char *val)
    {
     
      t_list *element;
      t_list *prev;
      t_list *toput;
     
    element = malloc(sizeof(*element));
      if (element == 0)
        return (0);
      toput = malloc(sizeof(*toput));
      if (toput == 0)
        return (0);
      toput->data = val;
         if (*list != NULL)
           {
          element = *list;
          prev = NULL;
          while(element != NULL)
            {
              if(strcmp(element->data,val) == -1)
                {
                  if(prev != NULL)
                    prev->next = toput;
                  else
                    {
                      *list = toput;
                    }
                  toput->next = element;
                  element = element->next;
                }
              else
                {
                  prev = element;
                  element = element->next;
                }
            }
           }
     
         if (*list == NULL)
           {
             element->data = val;
             element->next = *list;
             *list = element;
           }
     
         return (0);
    }
    ca fais plusieurs heures que je bloque sur ca si c'est possible d'avoir un coup de main ca serait cool

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Ton code est trop compliqué.
    La question est de trouver le maillon derrière lequel tu dois insérer le nouveau maillon. Ceci n'est pas possible dans deux cas : la liste est vide ou tu dois insérer en tête. Ces deux cas seront donc traité à part.
    Ta fonction devrait retourner non pas toujours 0, mais un indicateur de la réussite de l'allocation du nouveau maillon. Le plus simple est de retourner l'adresse du nouveau maillon. En cas d'échec, il suffit de retourner NULL.

    On arrive au pseudo-code suivant :
    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
    t_list *  my_put_in_list_last (t_list **list, char *val)
    {
      - Soit p l'adresse du premier maillon 
      - Créer un élément t_list d'adresse element 
      - SI création réussie 
          - initialiser element->data 
          - SI  p est NULL  OU p->data < val  (cas de liste vide ou d'insertion en tête)
               element->next = *list    (==NULL si la liste est vide)
               *list = element          (nouvelle tête)      
          - SINON 
             (parcourir pour trouver l'élément p derrière lequel insérer) :        
              TANT QUE p->next!=NULL ET p->next->data <val  : p = p->next
             (insérer derriere p) :
              element->next = p->next
              p->next = element
    - retourner element 
    }
    Attention à l'initialisation de element->data, écrire element->data = val ne fait que copier le pointeur val. Si la fonction est appelée en passant pour val toujours l'adresse d'un même tableau, les pointeurs element->data seront les mêmes pour tous les maillons.

Discussions similaires

  1. probleme de liste chainee
    Par claire_cartier dans le forum Débuter
    Réponses: 4
    Dernier message: 04/06/2009, 16h58
  2. probleme de listes chainees iterees
    Par norachaouia dans le forum Langage
    Réponses: 1
    Dernier message: 09/05/2007, 13h19
  3. Probleme ds liste chainee 2
    Par Treuze dans le forum C++
    Réponses: 7
    Dernier message: 11/04/2006, 17h55
  4. [LG]probleme d'ajout dans une liste chainée...
    Par misteryann dans le forum Langage
    Réponses: 5
    Dernier message: 08/03/2004, 20h28
  5. [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

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