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 :

Butte sur un code sur les listes doublement chainées


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Points : 17
    Points
    17
    Par défaut Butte sur un code sur les listes doublement chainées
    Bonjour ! En lisant un tuto sur les listes doublement chainées, j'en suis arrivé à ce code :
    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
    Dlist *dlist_insert(Dlist *p_list, int data, int position)
    {
        if (p_list != NULL)
        {
            struct node *p_temp = p_list->p_head;
            int i = 1;
            while (p_temp != NULL && i <= position)
            {
                if (position == i)
                {
                    if (p_temp->p_next == NULL)
                    {
                        p_list = dlist_append(p_list, data);
                    }
                    else if (p_temp->p_prev == NULL)
                    {
                        p_list = dlist_prepend(p_list, data);
                    }
                    else
                    {
                        struct node *p_new = malloc(sizeof *p_new);;
                        if (p_new != NULL)
                        {
                            p_new->data = data;
                            p_temp->p_next->p_prev = p_new;
                            p_temp->p_prev->p_next = p_new;
                            p_new->p_prev = p_temp->p_prev;
                            p_new->p_next = p_temp;
                            p_list->length++;
                        }
                    }
                }
                else
                {
                    p_temp = p_temp->p_next;
                }
                i++;
            }
        }
        return p_list;
    }
    Aussi je ne comprends pas pourquoi dans l'avant-dernier else, on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p_new->p_next = p_temp;
    et non pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p_new->p_next = p_temp->p_next;
    Merci d'avance pour votre aide !

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Parce qu'on insère un élément entre deux: On n'en remplace pas un...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Octobre 2008
    Messages : 187
    Points : 448
    Points
    448
    Par défaut
    Bonjour,

    dans le code que tu as donné, on insère un maillon en n-ième position, à la place de ptemp, et non pas après ptemp. C'est-à-dire que si on a la liste p_list:

    et qu'on appelle dlist_insert(p_list,42,1) pour insérer un maillon en position 1, on aura p_temp=p1 dans le else (si tu n'es pas convaincu, essaye de faire tourner l'algo à la main), et donc on doit obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p0->p_new->p1(=p_temp)->p2
    On a bien p_new->p_next = p_temp.

    Sinon, juste une remarque au passage, mais au lieu d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int i=1;
    while(condition) {
    /* ... */
    i++
    }
    tu peut écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int i=1;condition;i++) {
     /* ... */
    }

Discussions similaires

  1. Question sur les listes doublement chainées.
    Par entropie67 dans le forum C
    Réponses: 2
    Dernier message: 09/02/2015, 16h12
  2. Réponses: 2
    Dernier message: 29/01/2013, 21h07
  3. polynomes creux et les listes doublements chainées
    Par mustapha_smist dans le forum C
    Réponses: 3
    Dernier message: 11/05/2011, 10h52
  4. Problème sur les listes doublement chainée
    Par Traouspont dans le forum C
    Réponses: 5
    Dernier message: 05/01/2007, 13h02

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