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 :

inversion [Sources]


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Par défaut inversion
    Bonjour a tous,
    j'ai un petit probleme.
    J'ai une liste chainée et j'aimerai l'inverser completement.
    Par exemple j'ai [1]->[2]->[3]->[4]->NULL et j'aimerai la transformer en [4]->[3]->[2]->[1]->NULL
    Comment faire?
    Merci pour votre aide !!!

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    C'est une question algorithmique pas directement lié au C...

    Sauf si tu as un algorithme et que tu ne sais pas comment le traduire en C...

    Jc

    Une idée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Soit l1 la liste que tu veux inverser
    Soit l2 une liste initialisé à NULL
     
    Tant que l1 est non vide
      Ajouter la tête de l1 à la tête de l2
      Enlever la tête de l1
    Fin tant que

  3. #3
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 371
    Par défaut
    bien le bonjour,

    une solution est de parcourir ta liste et d'en creer une copie en inserant a chaque fois l'element courant au debut de la liste de copie. Ainsi les elements a en queue se retrouveront en tete

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Par défaut
    vous nauriez pas un algo ou un exemple? parske la je rame..

  5. #5
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par mdoerper
    vous nauriez pas un algo ou un exemple? parske la je rame..
    Hmmm, j'ai déjà donner un algo...

    Par contre un exemple... Si [] est une liste vide:
    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
     
    l1:  1 -> 2 -> 3 -> 4
    l2: []
     
    l1:  2 -> 3 -> 4
    l2: 1
     
    l1:  3 -> 4
    l2: 2->1
     
    l1: 4
    l2: 3->2->1
     
    l1: []
    l2: 4->3->2->1
    Si tu ne comprends pas, code déjà ta gestion de liste chaînée et tente de voir comment enlever la tête et comment ajouter en tête... Ensuite reposte pour poser des questions...

    Jc

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Par défaut
    Ben en fait j'ai une liste de vehicule qui contient des vehicule.La liste comme les vehicule sont des pointeur.
    Une structure pour un vehicule et une structure pour la liste, elle contient un poiteur vers un véhicule et un poiteur psuivant...
    J'arrive a ajouter et retirer des elements de la liste mais je ne sais pas pourquoi je n'arrive pas a inverser.
    Ma fonction est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste_vehicule* inverse(liste_vehicule* L)
    J'ai bien compris ton algo mais depuis ce matin je n'arrive pas a l'appliquer et le retranscrire en C.
    Ca aurait été un tableau ça aurai été simple mais là j'ai du mal.
    Desole

  7. #7
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    En principe si tu as bien fait ton travail tu devrais avoir ces fonctions de base:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    liste_vehicule* nouvelle_liste();   //Rend une liste vide
    liste_vehicule* ajoute_elem(vehicule*, liste_vehicule*);  //Ajoute un element en tete
    liste_vehicule* enleve_tete(liste_vehicule*);  //Enleve la tete de la liste
    int liste_est_vide(liste_vehicule*);  //Rend 1 si vide, 0 sinon
    vehicule* tete(liste_vehicule *);  //Rend la tete de la liste
    Si tu as ces fonctions, alors ta fonction inverse deviendrait:

    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_vehicule* inverse(liste_vehicule * liste)
    {
     /*Creer une nouvelle liste*/
      liste_vehicule *res = nouvelle_liste();      
     
      /* Tant que la liste de départ n'est pas vide */
      while( liste_est_vide( liste) )                 
       {
       /* On ajoute la tete sur la liste d'arrivee */
       res = ajoute_elem_en_tete( tete(liste) );
        /* On enleve la tete de la liste */
       liste = enleve_tete(liste);
       }
      /* On rend l'inverse */
     return res;
    }
    Remarque que dépendant de l'implémentation des fonctions de bases, toute modification de l'inverse répercutera sur la liste de base...

    Autre remarque, si tu regardes mon algo et finalement le code écrit, c'est la même chose... D'où l'importance d'avoir les fonctions de bases...

    Jc

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Par défaut
    Pour creer la nouvelle liste je suis d'accord moi j'ai fais une fonction (au debut je penser faire RES=L)
    Pour le test je pensais a un Pour enlever la tete je penseais a Donc jusque là je pense que l'on parle de la meme chose mais il est vrai que je ne sais pas copier une tete vers une autre tete car moi je ne faisai mes ajout qu'a la fin de la liste (plus simple)

  9. #9
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par mdoerper
    (au debut je penser faire RES=L)
    cela aurait été un problème puisque la liste res doit commencer vide...

    Citation Envoyé par mdoerper
    Pour le test je pensais a un
    Je ferais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while(liste != NULL)
    puisque rien ne prouve que tu as un élément dans ta liste...

    Citation Envoyé par mdoerper
    Pour enlever la tete je penseais a
    C'est pareil...

    Pour ajouter un élément en tête de liste le plus simple et de faire un dessin sur une feuille...

    Je veux ajouter C dans la liste res=A -> B... quels pointeurs dois-je mettre à jour?

    Citation Envoyé par mdoerper
    car moi je ne faisai mes ajout qu'a la fin de la liste (plus simple)
    Du tout, c'est plus compliqué... il faut arriver jusqu'à la fin... Le début, on l'a tout de suite...

    Jc

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Par défaut
    Citation Envoyé par fearyourself
    Je veux ajouter C dans la liste res=A -> B... quels pointeurs dois-je mettre à jour?
    Il faut que C pointe vers res (donc A) et ensuite res pointe vers C
    C'est ça?

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: inverser une liste chainée
    Citation Envoyé par mdoerper
    j'ai un petit probleme.
    J'ai une liste chainée et j'aimerai l'inverser completement.
    Par exemple j'ai [1]->[2]->[3]->[4]->NULL et j'aimerai la transformer en [4]->[3]->[2]->[1]->NULL
    Dommage que tu n'ais pas une liste doublement chainée !

    Sinon, c'est simple. Il faut déplacer les éléments dans une deuxième liste en insérant en tête...

    C'est de l'algorithmique de base... Rien à voir avec le langage C...

  12. #12
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    L'inversion d'une liste est un algo assez simple : le principe est :
    Ta liste est consituée d'une tête et d'un suivant, donc pour l'inverser il suffit de travailler avec le suivant
    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
     
    entrée : la tete de la liste à inversée
    retour : la tete de la nouvelle liste inversée
     
    fonction inverse(Liste tete) retour : Liste
     
    Variable cur type Liste : pointeur courant sur la liste
    Variable p type Liste : pointeur sur le suivant de cur suivant 
    Variable q type Liste : pointeur temporaire pour mémorisation
     
    debut
       commentaire : si la tete de liste est NULL, on n'a rien à faire
      si tete <> NULL alors
        commentaire initialisation du parcours de liste
        cur <= tete
        Commentaire : on a accès au suivant
        p <= cur->suivant
        Commentaire : on peut maintenant faire que tete soit le dernier noeud
        cur->suivant <= NULL
        Commentaire : on parcourt maintenant la liste en inversant les liens
        tant que p <> NULL faire
          commentaire :  on mémorise le suivant de p pour conserver l'ancien lien
          q <= p->suivant
          commentaire : on connecte maintenant le suivant de p à son précédent mémorisé dans tete
          p->suivant <= cur
          commentaire :  on avance d'un cran
          cur <= p
        fin tant que
        commentaire ! la tete de la liste est maintenant cur
        tete <= cur
      fin si
      renvoyer tete
    fin
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Par défaut
    Citation Envoyé par Trap D
    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
     
    entrée : la tete de la liste à inversée
    retour : la tete de la nouvelle liste inversée
     
    fonction inverse(Liste tete) retour : Liste
     
    Variable cur type Liste : pointeur courant sur la liste
    Variable p type Liste : pointeur sur le suivant de cur suivant 
    Variable q type Liste : pointeur temporaire pour mémorisation
     
    debut
       commentaire : si la tete de liste est NULL, on n'a rien à faire
      si tete <> NULL alors
        commentaire initialisation du parcours de liste
        cur <= tete
        Commentaire : on a accès au suivant
        p <= cur->suivant
        Commentaire : on peut maintenant faire que tete soit le dernier noeud
        cur->suivant <= NULL
        Commentaire : on parcourt maintenant la liste en inversant les liens
        tant que p <> NULL faire
          commentaire :  on mémorise le suivant de p pour conserver l'ancien lien
          q <= p->suivant
          commentaire : on connecte maintenant le suivant de p à son précédent mémorisé dans tete
          p->suivant <= cur
          commentaire :  on avance d'un cran
          cur <= p
        fin tant que
        commentaire ! la tete de la liste est maintenant cur
        tete <= cur
      fin si
      renvoyer tete
    fin
    Je ne suis qu'un débutant mais a premiere vu ton code est erroné car tu sauvegarde une valeur dans la variable temporaire Q mais tu ne la réutilise pas? Erreur?
    Du coup je reste bloqué dans la boucle while

  14. #14
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Tout à fait, erreur de recopie (je l'ai fait à partir d'un prog C
    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
    debut
       commentaire : si la tete de liste est NULL, on n'a rien à faire
      si tete <> NULL alors
        commentaire initialisation du parcours de liste
        cur <= tete
        Commentaire : on a accès au suivant
        p <= cur->suivant
        Commentaire : on peut maintenant faire que tete soit le dernier noeud
        cur->suivant <= NULL
        Commentaire : on parcourt maintenant la liste en inversant les liens
        tant que p <> NULL faire
          commentaire :  on mémorise le suivant de p pour conserver l'ancien lien
          q <= p->suivant
          commentaire : on connecte maintenant le suivant de p à son précédent mémorisé dans tete
          p->suivant <= cur
          commentaire :  on avance d'un cran
          cur <= p
          p <= q   <=== manque cette ligne
        fin tant que
        commentaire ! la tete de la liste est maintenant cur
        tete <= cur
      fin si
      renvoyer tete
    fin
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  15. #15
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Les listes c'est profondément récursif comme définition, alors les algorithmes sont naturellement récursifs.

    Donc au début, code en récursif, et convertis-le en itératif à la fin si besoin est.

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Par défaut
    Merci beaucoup a tous pour votre aide.
    J'ai enfin (et pour la premiere fois) réussi a inverser une liste chainée..

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Par défaut
    Bonjour à Tous

    Je viens pour ajouter une petite contrainte, la même chose mais sans retour de pointeur c'est à dire que le pointeur sur liste en paramètre pointe sur la liste inversée en sortie. C'est une des colles que j'ai eu à un entretien pour un stage, qui s'est terminé par un echec d'ailleurs....!

    Merci pour votre aide...

  18. #18
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Cela devrait se trouver dans un nouveau thread...

    Mais bon,

    En supposant que ta liste chaînée soit définie comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct sListe
    {
      int v;
      struct sListe *next;
    }SListe;
    Nous avons montré qu'il est possible d'avoir comme prototype de la fonction inverse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SListe *inverse(SListe *liste);
    Par contre, il est impossible en C de faire le travail avec ce genre de prototype:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void inverse(SListe *liste);
    A moins que la liste est un premier élément qui ne sert à rien à part être le début de la liste, ie ce 1er élément restera 1er après l'inversion.

    Par contre, ceci est possible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void inverse(SListe **liste);
    Jc

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Par défaut
    Le truc c'est justement de le faire sans double pointeur....

  20. #20
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par DreadNum
    Le truc c'est justement de le faire sans double pointeur....
    Sans double pointeur, sans retour et sans le premier élément qui est là comme sentinelle, il est impossible (à mon avis) en C d'inverser une liste. Je parle bien sûr de liste simplement chaînée...

    Cela devait être une question piège...

    Jc

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. inverser l'écran
    Par relax_06 dans le forum C++Builder
    Réponses: 2
    Dernier message: 13/03/2004, 12h20
  2. inverser la lecture d'une requète
    Par nilaco dans le forum Requêtes
    Réponses: 5
    Dernier message: 10/08/2003, 12h16
  3. [VB6] [Graphisme] Inversion dans picturebox
    Par tomnie dans le forum VB 6 et antérieur
    Réponses: 23
    Dernier message: 16/04/2003, 15h05
  4. Inverser une chaîne de caractères
    Par DBBB dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/03/2003, 11h09
  5. [VB6]fonction inverse de Hex (nombres hexadécimaux)
    Par Guigui_ dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 08/10/2002, 19h31

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