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 :

Déplacement dans une liste doublement chaînée


Sujet :

C

  1. #1
    Membre habitué Avatar de Adenora
    Femme Profil pro
    Développeuse ABAP
    Inscrit en
    Octobre 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeuse ABAP

    Informations forums :
    Inscription : Octobre 2008
    Messages : 148
    Points : 158
    Points
    158
    Par défaut Déplacement dans une liste doublement chaînée
    Bonjour,
    Depuis plusieurs jours, je tente de trouver la solution à mon problème que voici :

    J'ai un ruban de données comme ceci : 0 1 0 0 1 0 1 1
    Et je voudrais pouvoir me déplacer en avant de deux cases par exemple et ensuite revenir en arrière d'une case (comme avec une machine de Turing).

    Voilà ce que j'ai fait (j'ai simplifié le 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    struct elem_ruban {
      char c; // Elément actuel
      struct elem_ruban* prec; // Précédent
      struct elem_ruban* suiv; // Suivant
    };
     
    typedef struct info_ruban {
        int taille; // Taille du ruban
        struct elem_ruban *debut; // Début du ruban
        struct elem_ruban *fin; // Fin du ruban
    } ruban;
     
    int main(int argc, char *argv[]) {
        ruban *r = NULL; // Le ruban
        // Ajout des éléments dans le ruban
        ...
        // Déplacement dans le ruban
        struct elem_ruban *r_temp = malloc(sizeof *r_temp);
        r_temp=r->debut;
     
        while (pas_fini) {
              ...
              if (deplacement_droite==0) {
                    r_temp=r_temp->suiv;
              }
              else if (deplacement_gauche==0) {
                    r_temp=r_temp->prec;
              }
              ...
        }
    Donc on voit bien que dans le premier déplacement à droite, r_temp->prec ne contient rien.
    Ce qui a pour conséquence que je ne peux pas me déplacer à gauche.

    En espérant que vous pourrez m'aider, merci.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    J'aime bien l'expression de "ruban", que je n'avais jamais vue.
    Une liste doublement chainée est une liste chainée ordinaire, mais on peut se déplacer dans les deux sens (c'est vrai, c'est évident).
    Pour me déplacer dans une liste chainée je fais comme ceci
    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
    struct SListe
    [
      struct bid *unObjet;
      SListe *suiv; 
    };
    // initialisation
      SListe *Premier = malloc(sizeof(SListe)) 
      Premier->unObjet = LObjet;  // c'est un pionteur
      Premier->suiv=NULL;
     
    for (SListe *ptr=Premier; ptr; ptr = ptr->suiv) 
    {
    // on parcourt la liste
      bid *O=ptr->unObjet;  // on peut l'imprimer par exemple
    }
    Ca, c'est le cadre strict et minimum.
    Votre écriture de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct elem_ruban *r_temp = malloc(sizeof *r_temp);
    me parait incorrecte. J'écrirais plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct elem_ruban *r_temp = malloc(sizeof (elem_ruban));
    Autre point, pour vous déplacer dans une liste, il faut qu'elle existe.
    Un conseil, faites une liste chainée simple que vous pouvez renseigner, compléter, modifier, parcourir.
    Quand ce sera au point, vous ajouterez tout ce qu'il faut pour la parcourir aussi dans l'autre sens.

  3. #3
    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
    @Pierre Dolez
    Votre écriture de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct elem_ruban *r_temp = malloc(sizeof *r_temp);
    me parait incorrecte.
    Cette écriture est tout à fait correcte.
    sizeof peut prendre comme opérande
    - une expression (comme ici) : sizeof expression
    - un type entre parenthèses : sizeof (type)

    @Adenora
    Peut-être que le code a été trop simplifié, mais je ne comprends pas la question.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  4. #4
    Membre habitué Avatar de Adenora
    Femme Profil pro
    Développeuse ABAP
    Inscrit en
    Octobre 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeuse ABAP

    Informations forums :
    Inscription : Octobre 2008
    Messages : 148
    Points : 158
    Points
    158
    Par défaut
    Un conseil, faites une liste chainée simple que vous pouvez renseigner, compléter, modifier, parcourir.
    Je sais le faire ça.
    Mais maintenant, je veux parcourir dans l'autre sens et là, je suis bloquée.

    Je suis sûre qu'il faut rajouter quelque chose à l'intérieur de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (deplacement_droite==0) {
         r_temp=r_temp->suiv;
         // Quelque chose à rajouter
    }
    Mais j'ai beau faire des dessins pour voir la tête de mon ruban.

    PS : on trouve des rubans dans les machines de Turing

    Edit : Je vais tenter de mieux expliquer.
    Ruban initial : 0 1 0 0 1 0 1 1
    Position : ----^

    Ruban après deux déplacements vers la droite : 0 1 0 0 1 0 1 1
    Position : ----------------------------------------^

    Et là, c'est mon problème. Puisque r_temp n'a plus de précédent, je ne peux pas retourner en arrière.
    Je veux retourner à gauche : 0 1 0 1 0 1 1
    Position : --------------------^

    A savoir qu'on peut changer les éléments dans le ruban, mais là, n'est pas la question.
    En gros, c'est une machine de Turing.

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    402
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 402
    Points : 337
    Points
    337
    Par défaut
    il faut faire pointer le précédent sur l'ancien actuel tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (deplacement_droite==0) 
    {
         r_temp->prec=r_temp;
         r_temp=r_temp->suiv;
    }
    je crois que c'est ça, mais c'est à vérifier :]

  6. #6
    Membre habitué Avatar de Adenora
    Femme Profil pro
    Développeuse ABAP
    Inscrit en
    Octobre 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeuse ABAP

    Informations forums :
    Inscription : Octobre 2008
    Messages : 148
    Points : 158
    Points
    158
    Par défaut
    Ce serait aussi simple que ça ?
    Et pour un déplacement à gauche, serait-ce ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (deplacement_gauche==0) {
          r_temp->suiv=r_temp;
          r_temp=r_temp->prec;
    }

  7. #7
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    402
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 402
    Points : 337
    Points
    337
    Par défaut
    mmhh je crois bien mais teste tout ça et redis nous !

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne comprends pas pourquoi tu modifies le chaînage d'un quelconque élément pour te déplacer dans la liste. Le chaînage ne doit être modifié que quand la liste est elle-même modifiée.

    Donc, c'est dans la construction de la liste que tu as fait une erreur, pas dans le déplacement.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre habitué Avatar de Adenora
    Femme Profil pro
    Développeuse ABAP
    Inscrit en
    Octobre 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeuse ABAP

    Informations forums :
    Inscription : Octobre 2008
    Messages : 148
    Points : 158
    Points
    158
    Par défaut
    J'ai testé un truc qui fonctionne.

    Donc j'ai rajouté un pointeur qui pointe sur la position actuelle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct info_ruban {
        int taille;
        struct elem_ruban *debut;
        struct elem_ruban *fin;
        struct elem_ruban *actuel;
    } ruban;
    Puis pour le déplacement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if (deplacement_droite==0) {
         r_temp=r_temp->suiv;
         r->actuel=r_temp;
         r_temp=r->actuel;
    }
    else if (deplacement_gauche==0) {
         r_temp=r_temp->prec;
         r->actuel=r_temp;
         r_temp=r->actuel;
    }
    J'ai pas vraiment compris comment j'ai fait. Mais le résultat obtenu est le bon.
    Il va falloir que je fasse des tests et ensuite expliquer pourquoi j'ai fait ça.

    Merci à vous

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ne mets pas le pointeur "courant" dans le ruban même, c'est contraire à certains principes de codage (dont la réentrance).

    Le mieux est de le passer en paramètre (et selon les cas, soit le récupérer en valeur de retour, soit passer un pointeur vers lui.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Copier une partie d'une liste doublement chaînée
    Par ChrisNilson dans le forum Débuter
    Réponses: 10
    Dernier message: 08/12/2013, 03h41
  2. Réponses: 1
    Dernier message: 23/03/2013, 13h26
  3. Réponses: 4
    Dernier message: 01/09/2011, 11h24
  4. petite erreur d'implémentation dans une liste simplement chaînée
    Par johnny3 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 26/10/2008, 16h57
  5. Réponses: 9
    Dernier message: 14/01/2007, 17h09

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