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 :

passage de listes chaînées en argument


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Points : 2
    Points
    2
    Par défaut passage de listes chaînées en argument
    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...

  2. #2
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    1- Parce que lorsqu'on fait un scanf(), il faut dire on veut mettre la valeur lue, donc l'adresse de destination.

    2- parce que tu n'utilises pas le même "mode d'emploi" pour la fonction ajouter() et la fonction rechercher()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    llist ajouter(llist liste, int i)....
    llist rechercher(llist liste1, llist liste2, llist liste3)....
        maListe1 = ajouter(maListe1, i);
    ....
        rechercher(maListe1, maListe2, listeCommune); // et la valeur de retour est ignorée
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Désolé d'avoir posté ma question deux fois.

    Tu as tout à fait raison pour la fonction ajouter.

    Donc, il me suffit de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listeCommune = rechercher(maListe1, maListe2, listeCommune);
    Le problème est certes résolu, mais j'aimerais tout de même comprendre.

    N'est-il pas possible de modifier directement ma listeCommune dans ma fonction rechercher, car je la passe bien par pointeur et non par valeur puisque je la passe par un pointeur de structure. Donc, toute modification faite dans ma fonction rechercher à liste3 devrait se répercuter sur listeCommune dans mon main, non ?



    Si vous pouviez m'éclairer...

  4. #4
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    On ne peut jamais changer les arguments passés en paramètre des fonctions puisque la fonction ne reçoit que des copies. C'est bien sûr également vrai si les paramètres sont des pointeurs : on ne peut pas modifier le pointeur mais seulement l'objet pointé. Si tu veux modifier le pointeur, il faut, comme d'habitude, passer son adresse.
    Pour illustrer :
    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
    void 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;
                    }
    .....
    rechercher(maListe1, maListe2, &listeCommune);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour les explications

    ce poste est résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/10/2005, 19h20
  2. Liste chaînée
    Par kilinette dans le forum C
    Réponses: 6
    Dernier message: 17/10/2005, 23h45
  3. Listes chaînées circulaires
    Par gege2061 dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 11/05/2005, 13h44
  4. Construction de liste chaînées
    Par fomblardo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 15/03/2005, 21h19
  5. Insertion d'un noeud dans une liste chaînée
    Par habib106 dans le forum Assembleur
    Réponses: 8
    Dernier message: 07/04/2004, 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