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

Algorithmes et structures de données Discussion :

Concatenation de 2 listes chainées en 1


Sujet :

Algorithmes et structures de données

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 252
    Par défaut Concatenation de 2 listes chainées en 1
    Je recherche l'algorithme pour concatener 2 listes chainées en 1.
    Je ne sais pas par où commencer car je ne suis pas très bon en algo, et un petit coup de pousse me serait bien utile.
    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Il y a deux algorithmes légèrement différents selon que tu veux conserver l'accès aux deux listes chaînées originale ou juste à la version concaténée (et la liste chaînée concaténée à la fin, puisque cela ne coûte rien). Lequel veux-tu ?

    --
    Jedaï

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 252
    Par défaut
    Le second s'il te plait, j'ai cherché bien evidement sur le net jusqu'à présent mais je n'ai rien trouvé de fameu, c'est pour cela que je viens poser ma question ici, merci pour ta réponse aussi rapide

  4. #4
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Pour concaténer L2 à la fin de L1, il suffit de faire pointer le dernier noeud de L1 vers le premier noeud de L2. Selon ta structure de donnée, ça peut même être fait en O(1).

    --
    Jedaï

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 252
    Par défaut
    C'est justement la où je coince...
    Si par exemple j'ai une liste chainée dont le deuxieme donc pointe vers le premier, comment faire (d'un point de vue algo) pour dire plutot que de pointe vers le premier élément, pointe sur celui la.
    J'ai besoin d'un petit coup de pouce, les pointeurs ne sont pas ma tasse de thé...

  6. #6
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Bonjour,

    si tu as deux listes, A(a1->a2->...->aN->NULL) et B(b1->b2->...->bM->NULL) :
    - parcourir A jusqu'à son dernier élément (tant que a->suivant != NULL)
    - on fait alors pointé le dernier élément de A vers le premier de B. a->suivant = b1
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 415
    Par défaut
    Souvent, il est utile (pratique, efficace), de maintenir le premier et le dernier élément d'une liste chainée.

    Dans l'exemple de Toto13, on aurait :

    A(a1->a2->...->aN->NULL , aN)
    et
    B(b1->b2->...->bM->NULL, bM)

    Ce qui évite de faire une boucle pour retrouver le dernier élément (l'opération de récupération du dernier est alors en O(1), au prix du maintient du pointeur sur les opérations d'ajout et de suppression dans la liste).

    Il faut aussi que tu prennes en compte le fait que ta première liste puisse être vide.

    Ca donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Si A est vide
       A.Premier = B.Premier
       A.Dernier = B.Dernier
    Sinon
       A.Dernier.Suivant = B.Premier
       A.Dernier = B.Dernier
    Mais attention : comme les deux listes sont maintenant 'mélangées', modifier l'une va modifier l'autre, ce qui peut compliquer les choses sur la façon d'écrire tes opérations générales sur ces listes. Par exemple, on ne peut plus assurer que A.Dernier ait 'null' comme suivant dès qu'on ajoute un élément à la fin de B.
    De même, si après avoir mis B à la fin de A, on ajoute un élément à B, le résultat pour A ne sera pas le même, selon que B était vide au départ ou non...

    Bref, mélanger les listes peut conduire à des effets de bord difficiles à gérer.

  8. #8
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 252
    Par défaut
    Ok, merci beaucoup, j'ai compris maintenant

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 37
    Par défaut
    Citation Envoyé par Alikendarfen Voir le message
    Mais attention : comme les deux listes sont maintenant 'mélangées', modifier l'une va modifier l'autre, ce qui peut compliquer les choses sur la façon d'écrire tes opérations générales sur ces listes. Par exemple, on ne peut plus assurer que A.Dernier ait 'null' comme suivant dès qu'on ajoute un élément à la fin de B.
    De même, si après avoir mis B à la fin de A, on ajoute un élément à B, le résultat pour A ne sera pas le même, selon que B était vide au départ ou non...

    Bref, mélanger les listes peut conduire à des effets de bord difficiles à gérer.
    Je rebondis sur cette (vieille) conversation. J'ai exactement ce problème d'effet de bord. Y a -t-il une solution pr éviter ce genre de problème?

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 415
    Par défaut
    Effectivement, ça date un peu !

    En fait, ça correspond à ce que disait Jedai, au début (conserver l'accès aux deux listes originales ou pas).

    Pour éviter ces mélanges, pour par exemple mettre B à la suite de A, il est nécessaire de créer de nouveaux noeuds à la fin de A (autant de noeuds qu'il y en a dans B) et de reporter les valeurs des noeuds de B dans ces noeuds qu'on vient de créer.

    Quelque chose du genre :

    Pour chaque noeud b de B
    Créer un nouveau neud n
    Affecter la valeur de b à celle de n
    Ajouter n à la fin de A

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 08/02/2005, 23h42
  2. Bibliothèque de listes chainées
    Par gege2061 dans le forum C
    Réponses: 29
    Dernier message: 17/12/2004, 20h15
  3. copie de liste chainée
    Par tomsoyer dans le forum C++
    Réponses: 15
    Dernier message: 31/08/2004, 18h20
  4. Trie liste chaine
    Par Congru dans le forum C
    Réponses: 2
    Dernier message: 30/03/2004, 19h05
  5. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25

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