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 :

la concaténation de deux listes chainées


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Par défaut la concaténation de deux listes chainées
    salut j'ai un exercice et je n'arrive pas à l'exécuter correctement ,merci de m'aider !
    il s'agit de:
    on considère deux listes dont les adresses de tête et de queue sont mémorisées dans des variables T1,T2,Q1 et Q2.Écrivez les instructions qui concatènent ces deux listes,sans création de maillon.A la fin du travail T1 et Q1 pointeront sur la tête et la queue du résultat.
    voilà non essai :
    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
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    //exercice 2 la concéténation de deux listes
    //definition du structure element
    typedef struct element
    {
           int val;
           struct element *suivant;
    }maillon;
    typedef maillon* liste;
     /*1.ajout en tête d'une liste */ 
    liste ajoutEnTete(liste l,int valeur)
         {
          liste nv=(liste)malloc(sizeof(maillon));
          nv->val=valeur;
      if(l==NULL)
          {
                   l=nv;
          nv->suivant=NULL;
     
          }
      else
          {
          nv->suivant=l;
          l=nv;
           }
           return l;
           }
    liste concat(liste T1,liste T2)
    {
          liste Q1=NULL;
          liste Q2=NULL;
          liste tmp=NULL;
          if(T1==NULL)//si la liste T1 était vide 
             {
                           if(T2==NULL)//si la liste T2 était vide donc on retrun NULL(une liste vide )
                               return NULL;
                           else
                               {      
                                      T1=T2;
                                      tmp=T2;
                                      while(tmp->suivant!=NULL)
                                      {
                                                      tmp=tmp->suivant;
                                      }
                                      Q1=tmp;
                                      return T1;
                                      }
             }      
          else
             {     //cherchons Q1
                          tmp=T1;
                          while(tmp->suivant!=NULL)
                              {
                                     tmp=tmp->suivant;
                              }
                              Q1=tmp;
                          if(T2==NULL)
                              {
                                      return T1;
                              }
                          else
                              {
                                      tmp=T2;
                                      while(tmp->suivant!=NULL)
                                         {
                                                               tmp=tmp->suivant;
                                         }
                                         Q2=tmp;
                                         Q1->suivant=T1;
                                         Q1=Q2;
                                         return T1;
                              }
             }                       
    }                                                
    void affiche(liste l)
         {
                       liste tmp=l;
                       while(tmp!=NULL)
                       {
                                       printf("%d->",tmp->val);
                                       tmp=tmp->suivant;
                       }
     
         }         
    int main()
    {
        liste T1=NULL,T2=NULL;
           T1=ajoutEnTete(T1,1);
           T2=ajoutEnTete(T2,2);
           affiche(T1);
           getch();
           T1=concat(T1,T2);
           affiche(T1);
           getch();
           return 0;
    }
    j'ai poster la totalité du code pour que vous pussiez l'exécuter chez vous .
    en exécutant ce code j'ai une boucle infinie lors de l'affichage de liste finale(c à d la liste e concaténation).

    merci d'avance .

  2. #2
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    pour la concaténation c'est simple le dernier element de la première liste doit pointer sur le premier élément de la seconde pour n'en former qu'une seule (cela se fait en jouant avec le champ suivant de ta structure).

    Après comme c'est un exercice je ne vais pas aller beaucoup plus loin car cela reviendrai a te donner la solution.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    pour la concaténation c'est simple le dernier element de la première liste doit pointer sur le premier élément de la seconde pour n'en former qu'une seule (cela se fait en jouant avec le champ suivant de ta structure).
    oui je suis d'accord avec vous sur le principe ,mais bien entendue il faut le précéder par par des contrôler tels que si la 1 liste était vide ou l'inverse .

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Bonjour,

    Dans "liste concat(liste T1,liste T2)"
    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
     
    liste concat(liste T1,liste T2) {
       // [...]
       if (T1 == NULL) {
          if (T2 == NULL) {
             // Cas 1
          } else {
             // Cas 2
          }
       } else {
          if (T2 == NULL) {
             // Cas 3
          } else {
             // Cas 4
          }
       }
    }
    - Cas 1: Ok.
    - Cas 2: Inutile, retourne directement T2
    - Cas 3: 1ère partie du code inutile, retourne directement T1
    - Cas 4:
    C'est là que tu fais une boulette, tu mets comme maillon suivant du dernier maillon de la chaine T1 le premier maillon de la chaine ... T1 !
    Du coup, petite boucle sur l'affichage !

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Par défaut
    salut
    merci pour votre participation
    - Cas 1: Ok.
    - Cas 2: Inutile, retourne directement T2
    - Cas 3: 1ère partie du code inutile, retourne directement T1
    - Cas 4:
    C'est là que tu fais une boulette, tu mets comme maillon suivant du dernier maillon de la chaine T1 le premier maillon de la chaine ... T1 !
    Du coup, petite boucle sur l'affichage !
    c'est unitile de modifier la tête et la queue de T1 puis ce que c'est demander .
    C'est là que tu fais une boulette, tu mets comme maillon suivant du dernier maillon de la chaine T1 le premier maillon de la chaine ... T1 !
    Du coup, petite boucle sur l'affichage !
    4 cas si les deux chaines étaient remplisses donc on relie la queue de T1 avec la tête de T2 :
    et comme la queue de la liste à retourner doit être Q1:

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Citation Envoyé par hindou90 Voir le message
    c'est unitile (ndr: utile ?) de modifier la tête et la queue de T1 puis ce que c'est demander .
    Certes, je n'avais pas bien lu l'énoncé, donc
    Cas 2: Ok.
    Cas 3: Ok.
    Cas 4: Je maintiens ce que j'ai dis : tu fais une boucle...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    else { // Cas 4
       [...]
       Q1->suivant=T1; // BOUCLE !!!
       Q1=Q2; 
       return T1; 
    }
    A cet endroit, Q1 pointe sur le dernier élément de T1, or tu assignes comme élément suivant (le dernier élément de T1), le premier élément de T1...
    Le dernier pointe sur le premier = boucle !!!

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Par défaut
    salut oui c'est ça effectivement !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    else { // Cas 4
       [...]
       Q1->suivant=T2; 
       Q1=Q2; 
       return T1; 
    }
    merci c genial

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Par défaut
    salut
    malgré votre correction le programme ne marche pas
    j'ai sous le console:
    1->
    !!!

  9. #9
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Par défaut
    salut
    please aidez moi à trouve mon erreur

  10. #10
    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
    Quelle erreur ?
    Si tu as fait la modif du code, tu dois obtenir un résultat qui semble correct.
    Chez moi, ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
           T1=ajoutEnTete(T1,1);
           T1=ajoutEnTete(T1,3);
           T2=ajoutEnTete(T2,2);
           T2=ajoutEnTete(T2,4);
           affiche(T1);
           printf("\n");
           affiche(T2);
           printf("\n");
           T1=concat(T1,T2);
           affiche(T1);
    donne :
    3->1->
    4->2->
    3->1->4->2->

  11. #11
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Par défaut
    merci ça marche

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

Discussions similaires

  1. Concaténer deux listes
    Par Dunk dans le forum Pascal
    Réponses: 15
    Dernier message: 04/06/2025, 13h39
  2. Fusion de deux listes chainées
    Par schwuleur dans le forum Langage
    Réponses: 5
    Dernier message: 23/05/2011, 15h42
  3. Réponses: 12
    Dernier message: 03/07/2008, 13h53
  4. problème de concaténation de deux chaines
    Par info79 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/01/2008, 17h04
  5. Concaténer deux listes déroulantes dans un champs texte en direct
    Par arnaudperfect dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 11/12/2007, 17h50

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