Bonsoir,

Pour essayer de vraiment bien comprendre les listes doublement chainées je viens de programmer quelques fonctions dont une qui permet d’insérer un élément :

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
void list_insert(Liste *p_list)
{
    int age=0,position=0;
    printf("\n A quelle position ?");
    scanf("%d",&position);
    printf("\n age ? ");
    scanf("%d",&age);
 
    if (p_list != NULL) //Si la liste n'est pas vide
    {
        struct personne *p_temp = p_list->premiere;
        int i=1;
        while (p_temp != NULL && i <= position)
        {
            if (position == i)
            {
                if (p_temp->suivante == NULL)
                {
                    insertionEnd(p_list);
                }
                else if (p_temp->precedente == NULL)
                {
                    insertion(p_list);
                }
                else
                {
                    struct personne *p_new = malloc(sizeof *p_new);
                    if (p_new != NULL)
                    {
                        p_new->age = age;
                        p_temp->suivante->precedente = p_new; // Ici !!
                        p_temp->precedente->suivante = p_new;
                        p_new->precedente = p_temp->precedente;
                        p_new->suivante = p_temp;
                        p_list->taille++;
                    }
                }
            }
            else
            {
                p_temp = p_temp->suivante;
            }
            i++;
        }
    }
}
ET là, dans cette partie :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 p_new->age = age;
                        p_temp->suivante->precedente = p_new; // Ici !!
                        p_temp->precedente->suivante = p_new;
                        p_new->precedente = p_temp->precedente;
                        p_new->suivante = p_temp;
                        p_list->taille++;
Je ne comprends pas bien. Si je fais un petit schéma,

L1 -- L2-- L3 --L4
Si je veux introduire un élément entre L2 et L3 on devrait avoir :
L3->precedent->suivant =LNEW (c'est à dire L2->suivant=LNEW )
L3>precedente=LNEW
et LNEW->suivant=L3
LNEW->precedent=L2

J'ai l'impression qu'un truc cloche dans le maillage là... Non ?