Bonjour à tous !

Je m'explique :

Le programme crée 2 listes chaînées contenant des nombres, puis on recherche les éléments identiques aux deux listes et on les copie dans une troisième liste chaînée appelée 'listeCommune'.

Mes problèmes :

1- Je ne comprend pas pourquoi je suis obligé de mettre un '&' devant 'nouveauElement->val' lorsque j'assigne la valeur entrée par l'utilisateur.

2- Je ne comprend pas pourquoi dans ma fonction 'rechercher' ma 'liste3' est bien modifiée (voir l'affichage 'TEST' que je fais dans ma fonction) alors que quand je reviens dans mon 'main', ma liste chaînée 'listeCommune' n'a pas été modifiée !? Je passe pourtant mes listes sous forme de pointeur de liste !? Pourquoi ça fonctionne pour ma fonction 'ajouter' et ça modifie bien la liste originale et ça ne fonctionne pas pour ma fonction 'rechercher' et ça ne modifie pas la liste originale ???

Voici mon 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
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 3
 
typedef struct element
{
    int val;
    struct element *nxt;
} element, *llist;
 
llist ajouter(llist liste, int i)
{
 
    /* On crée un nouvel élément */
    llist nouveauElement = malloc(sizeof(element));
 
    /* On assigne la valeur au nouvel élément */
    printf("\n\nIntroduisez la %d(ere/eme) valeur : ",i);
    scanf("%d", &nouveauElement->val);//Pourquoi ça marche pas sans le & ??
 
    nouveauElement->nxt = NULL;
 
    /* On ajoute en fin, donc aucun élément ne va suivre */
    if(liste == NULL)
    {
        liste = nouveauElement;
    }
    else
    {
        /* Sinon, on parcourt la liste à l'aide d'un pointeur temporaire et on
        indique que le dernier élément de la liste est relié au nouvel élément */
        llist temp = liste;
        while(temp->nxt != NULL)
        {
            temp = temp->nxt;
        }
        temp->nxt = nouveauElement;
    }
    nouveauElement = NULL;
    free(nouveauElement);
 
    return liste;
}
 
void afficher(llist liste)
{
    int i;
    llist tmp = liste;
    /* Tant que l'on n'est pas au bout de la liste */
 
    for(i = 1; tmp != NULL; i++)
    {
        /* On affiche */
        printf("\n\nLa %d(ere/eme) valeur est : %d", i, tmp->val);
        /* On avance d'une case */
        tmp = tmp->nxt;
    }
}
 
llist rechercher(llist liste1, llist liste2, llist liste3)
{
    llist tmp1 = liste1;
    /* Tant que l'on n'est pas au bout de la liste */
    while(tmp1 != NULL)
    {
        llist tmp2 = liste2;
 
        while (tmp2 != NULL)
        {
            if (tmp1->val == tmp2->val)
            {
                llist nouveauElement = malloc(sizeof(element));
 
                /* On assigne la valeur au nouvel élément */
                nouveauElement->val = tmp2->val;
 
                nouveauElement->nxt = NULL;
 
                if(liste3 == NULL)
                {
                    liste3 = nouveauElement;
                }
 
                else
                {
                    /* Sinon, on parcourt la liste à l'aide d'un pointeur temporaire et on
                    indique que le dernier élément de la liste est relié au nouvel élément */
                    llist temp=liste3;
                    while(temp->nxt != NULL)
                    {
                        temp = temp->nxt;
                    }
                    temp->nxt = nouveauElement;
                }
                nouveauElement = NULL;
                free(nouveauElement);
            }
            tmp2 = tmp2->nxt;
        }
        tmp1 = tmp1->nxt;
    }
    printf("\n-------------------TEST-----------------");
    afficher(liste3);//Pourquoi ici ça marche ??
    printf("\n-------------------TEST-----------------\n");
    return liste3;
}
 
 
main()
{
    llist maListe1 = NULL;
    llist maListe2 = NULL;
    llist listeCommune = NULL;
    int i = 0;
 
    printf("\nENTREZ LES VALEURS DE LA PREMIERE LISTE :\n");
	printf("----------------------------------------");
 
    for(i = 1; i <= N; i++)
    {
        maListe1 = ajouter(maListe1, i);
    }
 
    printf("\nENTREZ LES VALEURS DE LA DEUXIEME LISTE :\n");
	printf("----------------------------------------");
 
    for(i = 1; i <= N; i++)
    {
        maListe2 = ajouter(maListe2, i);
    }
 
    printf("\nLES VALEURS DE LA PREMIERE LISTE SONT :\n");
	printf("--------------------------------------");
    afficher(maListe1);// Ici aussi ça marche !!
 
    printf("\n\nLES VALEURS DE LA DEUXIEME LISTE SONT :\n");
	printf("--------------------------------------");
    afficher(maListe2);// Et ici aussi !!??
 
    rechercher(maListe1, maListe2, listeCommune);
 
    printf("\n\nLES VALEURS DE LA LISTE COMMUNE SONT :\n");
	printf("-------------------------------------");
    afficher(listeCommune);// Et pourquoi ici ça marche pas ??
 
}
Merci de me mettre sur la voie...